본문 바로가기
IVS/Trace32

[Trace32] 환경구축 및 디버깅 환경 셋업

by 코곰_ 2025. 1. 23.

목표: 기본적인 Trace32 사용법에 대한 학습 외에도 프로세서 내 디버그 로직을 활용한 디버깅 방법을 학습하여 디버깅 능력 향상

Trace32 환경

MCU: TC397XE
코어: Tricore
빌드 툴: GreenHills/ MULTI v8.1.4/ v2023.1

주의사항

  • trace32, 타깃의 손상을 막기 위해, trace 32의 전원을 먼저 켜고 타깃을 다음에 켠다. (전원 끌 때는 타깃 - trace32 순)
  • CLOCK이 높아질수록 접근 속도가 빨라지나 노이즈에 민감하다

c.f) JTAG 연결 방식

  • SYStem.Attach: 타깃의 현재 상태에 JTAG 연결
  • SYStem.Up: 타깃을 리셋시킨 후 JTAG 연결

파일 포맷

  1. Binary
  • 기계어 코드만으로 구성
  • Trace32로 다운로드 시 주소 지정 필요
  • 텍스트 형태 확인이 불가능
  1. Hex
  • 주소 정보를 포함하나 디버그 심볼은 포함 X
  • Trace32로 다운로드 시 주소 지정 필요 X
  • 텍스트 형태 확인 가능
  1. ELF(Executable and Linkable Format)
  • 실행 가능한 파일 형식
  • Trace32로 소스레벨 디버깅 시 필요.
  • 실행할 수 있는 코드와 디버그 심볼 정보 포함
  • Trace32로 다운로드 시 주소 지정 필요 X

-> 요약하면, Trace32로 ELF 파일을 다운로드하면 타깃보드의 메모리로 바이너리 파일이 다운로드 되고, 디버그 심볼은 Host PC(PowerView SW)로 다운로드 된다.


![](C:\Users\User\Desktop\IVS[250123] Trace32 사용법\img\setting.PNG)

sYmbol.Browse

  • 필요한 디버그 심볼을 찾아서 소스레벨로 디버깅

List.auto

  • 어셈블리, 소스레벨로 코드를 수행하며 디버깅

명령어 설명

  • step: 어셈블리/ C레벨로 한 스텝 진행
  • over: 함수 내부로 진입하지 않고 해당 함수를 실행
  • diverge: while/for 등의 반복문을 한번에 실행
  • return: 함수의 마지막 라인까지 한번에 진행
  • up: 수행 중인 함수를 모두 마치고 빠져나간다
  • go/ break: program 수행을 시작/ 중지
  • mode: 어셈블리/ c언어 모드를 변경

mode는 크게 2가지로 나뉜다.

![](C:\Users\User\Desktop\IVS[250123] Trace32 사용법\img\hll moe3.PNG)

![](C:\Users\User\Desktop\IVS[250123] Trace32 사용법\img\mix mode.PNG)

  1. HLL 모드: C만 보기
  2. MIX 모드: C + 어셈블리 동시에 보기
  • Go Til: 임시로 Breakpoint 설정하고, 타깃을 러닝

Data.dump

  • 원하는 어드레스의 타깃 메모리 값을 읽거나 쓸 수 있다.

![](C:\Users\User\Desktop\IVS[250123] Trace32 사용법\img\data.dump.PNG)

range 확인
0x0--0x1000: --

Register.view

  • 레지스터창에서 보여주는 정보
  • 코어는 메모리에서 값을 레지스터로 읽어들여 연산을 한 후, 그 결과를 다시 메모리에 적는 동작을 반복한다. 따라서 어셈블리 레벨로 타깃의 동작을 이해할 수 있으면 디버깅에 도움이 된다.
    코어 레지스터는 두 가지 용도로 구성된다.
  1. 동작상태, 코드 수행 위치, 스택 포인터 등의 레지스터
  2. 연산을 위해 사용되는 일반적인 레지스터

Tricore 레지스터 구성

  1. D0 ~ D15: 일반적인 연산을 위한 레지스터
  2. A0 ~ A15: 어드레스 정보를 위한 레지스터
  3. A10(Stack Pointer): 사용 중인 스택 어드레스를 표시
  4. A11(Link Register): 함수 수행 후 돌아갈 어드레스 정보
  5. PC(Program Counter): 현재 수행중인 어드레스 정보

![](C:\Users\User\Desktop\IVS[250123] Trace32 사용법\img\register.view.PNG)

Var.Watch

  • 원하는 변수 값을 확인하고 값을 변경할 수 있다.
  • 변수의 포맷을 원하는 대로 바꾸어 볼 수 있다.

Frame.View

  • 함수의 호출관계 확인

Var.Ref

  • 코드 진행에 따라 필요한 변수를 자동으로 등록
  • 주로 지역변수를 간단히 확인하는 용도로 사용

PERipheral

  • PERipheral 창을 이용해 주변장치 레지스터를 확인하고 값을 변경

Breakpoint

원하는 시점에, 원하는 조건에 디버깅을 수행하기 위해 breakpoint를 설정한다.

Breakpoint 설정 방식

  1. Onchip: 코어 내부의 break/ watchpoint 로직을 사용하는 방식
    • 개수 제약 외에는 고려사항 X
    • Read/ Write Breakpoint는 모두 Onchip 방식으로 설정
  2. SOFT: 타깃 메모리에 트랩 코드를 삽입하는 방식
    • 무제한개의 브레이크를 걸 수 있지만 1보다 고려사항이 많다.
    • 초기화가 완료된 RAM 메모리의 코드 영역에만 설정 가능
  3. AUTO: Trace32가 breakpoint 설정 방식을 결정

program과 memory에 breakpoint 설정 가능하다.

  • Program : 코드 영역에 Breakpoint 설정
  • ReadWrite : 메모리에 Read 혹은 Write 접근이 있을 때 Break되도록 설정
  • Read : 메모리에 Read 접근이 있을 때 Break 되도록 설정
  • Write : 메모리에 Write 접근이 있을 때 Break 되도록 설정
  • Default : 코드 영역, 메모리 영역에 접근이 있을 때 Break되도록 설정

Program Breakpoint

  • 디버깅 하고 싶은 코드 수행시 타깃을 멈출 수 있다.

Read/Write Breakpoint

  • 변수나 메모리 값을 읽고 쓸 때 타깃을 멈출 수 있다.
  • 코드 수행 위치는 List.auto와 Frame.View를 조합하여 파악

Breakpoint를 cmm으로 저장하거나 불러와 사용할 수 있다.

data 기능
변수에 원하지 않는 값이 들어왔을 때 어디서 왔는지를 확인하기 위해 레지스터 값 확인


CMM 명령어

  • 매크로파일을 만들어 자동화하여 결과만 빠르게 볼 수 있도록 한다.

메시지윈도우 및 출력 명령

  • AREA: Trace32의 내부 터미널 창을 열어준다.
    • AREA.CLEAR: AREA 창의 내용을 삭제
  • PRINT: AREA 창에서 지정한 문자열을 출력
    • PRINT "testing"
    • PRINT &var
    • PRINT "string" &var "str1..."

상태관련 명령

  • WAIT: 시간 또는 condition을 만족시킬 때까지 기다린다.
    • WAIT 1.s // 1초동안 다음 명령어 수행을 기다린다.
    • WAIT !RUN() // 타깃이 멈출 때까지 기다린다.

변수 값 로깅

  • Var.LOG %E <변수이름> /: AREA 창에서 변수 값을 로깅
    • %E: 타깃 동작 중에 실시간으로 로깅
    • /ONBREAK : 타깃이 정지할 때 마다 로깅합니다(default)
    • /ONSPOT : Spot 동작이 발생할 때 마다 로깅합니다
    • /Changes : 변수 값이 변경되었을 때만 로깅합니다
    • /TImestamp : 로깅한 시간 및 간격을 출력합니다
    • /ONTIME : 지정한 시간마다 로깅합니다

데이터 값을 읽고 쓰기

Memory 값을 찾기

  • V <변수 명> = <값> : 심볼이 가리키는 주소에 지정한 값을 씁니다
  • Var.PRINT <변수 명> : 변수 값을 AREA 창에 출력합니다
  • Register.Set <Register 명> <값> : 지정한 레지스터에 값을 씁니다

Memory 값을 찾기

Data.Find <%format> <data|string>

  • 특정 메모리 구간에서 data/string을 검색

Data.ComPare

  • 지정한 두 개의 특정 메모리 구간의 값이 일치하는지 비교
  • 결과 값은 area 창에서 확인 가능

Memory 값 테스트

Data.Test [/]

  • 에러가 발생할 때까지 해당 주소 영역을 option에 따라 쓰고 읽어 비교 테스트

Memory 값 변경

Data.Set <address|address range> %<Byte|Word|Long|Quad>
지정한 주소에 해당 형태의 data 값을 씁니다

Data.PATTERN

지정한 주소범위에 특정 패턴의 data 값을 씁니다

Flash 영역에 패턴을 채워 정상적으로 Flash Programming이 되었는지 확인 할 수 있는 용도로활용 가능합니다

Memory 값을 파일로 저장

Data.Save.

지정한 주소 영역에 해당하는 data 값을 파일로 저장합니다 (덤프 기능)

/SkipErrors : 읽기 불가한 영역에 대한 에러메시지를 무시하고 저장합니다

Memory 값을 읽어오기

Data.Byte(Word|Long|STRING)(MemClass:address)
지정한 주소에서 해당하는 형태의 data 값을 읽어옵니다

  • memory class 지정 주의 **

Data관련 함수

Var.VALUE(<symbol 명>) : 심볼이 가리키는 주소의 변수 값을 반환
Var.RANGE(<변수 명>) : 변수의 메모리 영역의 주소를 반환
Register(<register 명>) : Register 값을 출력


CMM

  • PRACTICE Script Laanguage 파일(매크로처럼 활용 가능)
  • 다양한 디버깅 기능의 확장과 자동화를통해 디버깅에 유용하게 사용할 수 있는 TRACE32 스크립트 파일

장점

  • PowerView 환경을 프로젝트 요구 사항에 맞게 관리(단축 아이콘 등)
  • 반복적이고 복잡한 행동을 표준화
  • 간편한 타깃 Reset 및 메모리 초기화 가능
  • 자동화를 통한 디버깅 속도 향상
  • 다른 사용자와 디버깅 셋업 환경을 공유해 효율적으로 작업 가능
  • 반복적인 검증 테스트 진행 가능