목표: 기본적인 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 연결
파일 포맷
- Binary
- 기계어 코드만으로 구성
- Trace32로 다운로드 시 주소 지정 필요
- 텍스트 형태 확인이 불가능
- Hex
- 주소 정보를 포함하나 디버그 심볼은 포함 X
- Trace32로 다운로드 시 주소 지정 필요 X
- 텍스트 형태 확인 가능
- ELF(Executable and Linkable Format)
- 실행 가능한 파일 형식
- Trace32로 소스레벨 디버깅 시 필요.
- 실행할 수 있는 코드와 디버그 심볼 정보 포함
- Trace32로 다운로드 시 주소 지정 필요 X
-> 요약하면, Trace32로 ELF 파일을 다운로드하면 타깃보드의 메모리로 바이너리 파일이 다운로드 되고, 디버그 심볼은 Host PC(PowerView SW)로 다운로드 된다.

sYmbol.Browse
- 필요한 디버그 심볼을 찾아서 소스레벨로 디버깅
List.auto
- 어셈블리, 소스레벨로 코드를 수행하며 디버깅
명령어 설명
- step: 어셈블리/ C레벨로 한 스텝 진행
- over: 함수 내부로 진입하지 않고 해당 함수를 실행
- diverge: while/for 등의 반복문을 한번에 실행
- return: 함수의 마지막 라인까지 한번에 진행
- up: 수행 중인 함수를 모두 마치고 빠져나간다
- go/ break: program 수행을 시작/ 중지
- mode: 어셈블리/ c언어 모드를 변경
mode는 크게 2가지로 나뉜다.


- HLL 모드: C만 보기
- MIX 모드: C + 어셈블리 동시에 보기
- Go Til: 임시로 Breakpoint 설정하고, 타깃을 러닝
Data.dump
- 원하는 어드레스의 타깃 메모리 값을 읽거나 쓸 수 있다.

range 확인
0x0--0x1000: --
Register.view
- 레지스터창에서 보여주는 정보
- 코어는 메모리에서 값을 레지스터로 읽어들여 연산을 한 후, 그 결과를 다시 메모리에 적는 동작을 반복한다. 따라서 어셈블리 레벨로 타깃의 동작을 이해할 수 있으면 디버깅에 도움이 된다.
코어 레지스터는 두 가지 용도로 구성된다.
- 동작상태, 코드 수행 위치, 스택 포인터 등의 레지스터
- 연산을 위해 사용되는 일반적인 레지스터
Tricore 레지스터 구성
- D0 ~ D15: 일반적인 연산을 위한 레지스터
- A0 ~ A15: 어드레스 정보를 위한 레지스터
- A10(Stack Pointer): 사용 중인 스택 어드레스를 표시
- A11(Link Register): 함수 수행 후 돌아갈 어드레스 정보
- PC(Program Counter): 현재 수행중인 어드레스 정보

Var.Watch
- 원하는 변수 값을 확인하고 값을 변경할 수 있다.
- 변수의 포맷을 원하는 대로 바꾸어 볼 수 있다.
Frame.View
- 함수의 호출관계 확인
Var.Ref
- 코드 진행에 따라 필요한 변수를 자동으로 등록
- 주로 지역변수를 간단히 확인하는 용도로 사용
PERipheral
- PERipheral 창을 이용해 주변장치 레지스터를 확인하고 값을 변경
Breakpoint
원하는 시점에, 원하는 조건에 디버깅을 수행하기 위해 breakpoint를 설정한다.
Breakpoint 설정 방식
- Onchip: 코어 내부의 break/ watchpoint 로직을 사용하는 방식
- 개수 제약 외에는 고려사항 X
- Read/ Write Breakpoint는 모두 Onchip 방식으로 설정
- SOFT: 타깃 메모리에 트랩 코드를 삽입하는 방식
- 무제한개의 브레이크를 걸 수 있지만 1보다 고려사항이 많다.
- 초기화가 완료된 RAM 메모리의 코드 영역에만 설정 가능
- 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 및 메모리 초기화 가능
- 자동화를 통한 디버깅 속도 향상
- 다른 사용자와 디버깅 셋업 환경을 공유해 효율적으로 작업 가능
- 반복적인 검증 테스트 진행 가능