디버깅 시 유용한 명령

TRACE32
이동: 둘러보기, 검색

 

목차

Introduction

practice Program(이하 cmm)은 TRACE32내에서 사용하고 있는 스크립트이다. TRACE32내에서 여러 명령어를 하나의 파일로 작성을 해서 인터프리터 방식으로 실행이 된다. TRACE32에서 제공되는 명령어와 함수들을 이용해 만들 수 있고 이러한 cmm파일을 이용하여 반복적으로 해야 하는 디버깅이나 작업들을 간편하게 수행 할 수 있다. TRACE32의 명령어들을 자세히 정리 해둔 문서는 TRACE32 S/W가 설치된 폴더의 pdf폴더에 있다. (C:\T32\pdf)

TRACE32 주요 명령어 관련 문서

Practice_ref.pdf

Practice_user.pdf

Training_practice.pfd

General_ref_*.pdf

TRACE32 function 관련 문서

Ide_func.pdf

Practice_user.pdf

Training_practice.pdf

 

명령어나 함수 검색

Help 메뉴를 활용하여 문서를 찾아보거나 원하는 명령어나 함수를 검색 할 수 있다.

[Menu] -> [Help] -> [Index]

 

practice Program(CMM script) 생성 및 기본

cmm script 생성 및 기존 cmm파일의 수정

PEDIT <filename.cmm>

 

cmm script 실행

DO <filename.cmm>

 

cmm script의 작성

script의 시작은 B::으로 시작되고 ENDDO로 끝낸다

 

주석 처리

주석 처리하려는 문장의 앞쪽에 ‘;’ 나 “//”를 사용 한다.

 

파라미터 전달 및 리턴 값 처리

cmm을 호출 할 때 파라미터는 <DO filename.cmm pram1 pram2 pram3 …> 와 같이 전해줄 수 있다.

호출 되는 cmm에서는 ENTRY &pram1 &pram2 &pram3 …> 와 같이 파라미터를 받을 수 있다.

리턴 값을 전달 해줄 경우는 스크립트가 종료되는 부분에 <ENDDO return1 return2 return2 …>와 같이 사용 하고 리턴 값을 받을 때는 ENTRY &pram1 &pram2 &pram3 …> 과같이 사용한다.

ex : test.cmm 을 실행 했을 때 결과

String값을 파라미터로 넘길 때는 주의 해야 할 부분이 있다. 파라미터들의 구분을 공백으로 하기 때문에 String에 공백이 있을 경우 문제가 발생 될 수 있다.

잘 못된 사용 예

 

올바른 사용 예(%LINE or “ “ 사용)

 

cmm 디버깅

스크립트도 프로그래밍 이므로 검증하기 위한 디버깅을 해야 하는 경우가 있다.

디버깅 하고자 하는 스크립트를 PEDIT 명령으로 열고 Debug 버튼을 누르면 step by step으로

스크립트를 수행 하면서 결과를 확인 하며 디버깅 할 수 있다.

step : 한 라인씩 수행

over : 다른 스크립트를 호출 하는 부분을 만날 경우 호출 할 스크립트를 모두 수행한다.

continue : 수행 되어야 할 나머지 부분을 모두 수행 한다.

stop : 수행 중인 cmm 을 멈춘다.

enddo : 현재 수행중인 cmm을 끝낸다.

Macros : 호출된 cmm의 순서와 cmm에서 사용된 변수들의 값을 보여 준다.(명령어 B::pmacro)

Double click : 스크립트 디버깅 중 원하는 부분에 double click하면 break point를 셋팅 할 수 있다.

마우스 우클릭 : 팝업 메뉴 사용

 

단축 명령어 와 대소문자 구분

Trace32에서는 단축 명령어를 지원 한다. 예를 들어 CPU를 선택하는 명령어인 SYStem.CPU <CPU Name> 명령은 sys.cpu <CPU Name>과 같이 단축해서 사용할 수 있다. 또한 대문자 SYS.CPU와 소문자 sys.cpu 명령은 구분되지 않고 같은 명령을 실행 한다. Trace32에서 단축명령어를 확인 할 수 있는 방법은 full name명령어에서 대문자로 된 부분이 단축 명령어 이다.(ex – SYStem è sys, Data.Set è d.s)

 

Program Flow

cmm 스크립트의 실행 흐름을 제어하기 위해 아래와 같은 sub 루틴을 이용할 수 있다.

GOSUB/RETURN

cmm 스크립트의 sub function이라고 보면 된다. 파라미터와 리턴값을 받을 수 있다.

GOSUB를 사용할 경우 SUB 루틴에서는 반드시 RETURN을 해주어야 한다.

RETURN이 되지 않는다면 stack underflow와 같은 에러가 발생 할 수 있다.

 

GOTO/JUMPTO

cmm의 실행 흐름만 변경 가능 하며 C language의 goto문과 역할이 비슷하다.

파라미터나 리턴값을 받을 수 없다.

ENDDO를 넣지 않으면 순차적으로 계속 해서 실행 되기 때문에 원하지 않는 명령어가 수행 될 수 있다.

<GOTO 사용> <JUMPTO 사용>                  <잘못된 사용>

 

조건 문 및 반복 문

IF, IF ELSE, Var.IF

if문은 조건절의 내용에 따라서 true나 false값을 반환한다.

Else 절은 필요 시 사용하며 필요 없을 경우에는 생략할 수 있다.

If 조건절 이후 한 문장일 경우에는 블록으로 지정하지 않아도 되지만,

한 문장 이상일 경우에는 괄호를 사용하여 블록으로 지정해야 한다.

사용 : IF <Condition> , Var.IF <HLL Condition>

 

WHILE, Var.WHILE

반복논리를 제공하기 위해 while, repeat 문을 제공하고 있다.

반복문들은 지정된 문장의 조건이 만족할 때까지 반복한다.

조건을 지정하는 방법에 따라 while, repeat문이 구분되어 사용된다.

사용 : WHILE <Condition>, Var.WHILE <HLL Condition>

 

REPEAT

C Language의 for{;;} 문과 동일한 기능으로 지정한 횟수를 반복 수행 한다.

사용 : REPEAT <반복 횟수>

 

변수/배열/구조체 사용

변수 선언 규칙

cmm에서 변수 이름은 사용자가 부여하는 명칭으로 다음과 같은 규칙이 있다.

변수명의 구성은 영문자(A-Z,a-z),숫자(0-9),밑줄(_)로 구성된다.

첫 글자는 반드시 영문자로 시작하여야 하며 두 번째 글자부터 영문자, 숫자, 밑줄 어느 것이 와도 무방 하다.

밑줄은 영문자나 숫자 사이에 나와도 상관없으며 변수의 처음이나 끝 부분에는 나올 수 없다.

변수명의 길이는 제한이 없다.

변수명에는 예약어나 특수 문자를 사용할 수 없다.

Global 변수는 대문자, local 변수는 소문자로 구별을 하면 변수 보기가 더 편리하다.

Global 변수는 다른 cmm 파일 내 에서도 변수를 사용할 수가 있고, local 변수는 현재 cmm 파일 내 에서만 사용이 가능하다.

변수의 선언 시 정수형, 실수형, long형,double형 변수가 따로 구분이 없다.

 

변수 사용

지역 변수 선언 : LOCAL &<변수명> 또는 &<변수명>

전역 변수 선언 : GLOBAL &<변수명>

변수는 주소, 숫자, String 등의 값을 가질 수 있다.

 

배열 사용

Var.NEW <type> \<Array name>

Var.NEW int[10] \Group_List                            ;배열 선언

Var.Set \Group_List[&i]=1.                               ;배열에 값 넣기

&value=Var.Value(\Group_List[&i])+0.                ;배열에 있는 값 받아오기

PMACRO 명령을 통해 변수 값을 확인 해보면 생성한 배열에 값이 들어가 있는 것을 확인 할 수 있다.

 

구조체 사용

Var.NEW STRUCT <STRUCT TYPE> \<Struct name>

구조체 사용은 기본적으로 심볼에 있는 구조체 타입만 사용할 수 있다.

사용 예

Var.New STRUCT task_struct \task                     ;task_struct타입의 구조체 선언

Var.Set \task=&process_magic               ;tcb 주소를 구조체에 넣기

&process_name=V.STRING(\task.comm)   ;구조체에 있는 값 받아오기

 

☞ 배열이나 구조체는 파라미터로 전달되지 않음!!!

PMACRO를 통해 구조체에 값이 저장되어 있는 것을 확인 할 수 있다.

 

타겟에서 값 읽어 오기

심볼 주소 가져오기

 

ADDRESS.OFFSET(sunny) -> O                           ;sunny 변수의 주소 값을 리턴

 

ADDRESS.OFFSET(sunny[3]) -> X                         ;HLL(High Level Language) 지원 하지 않음

 

ADDRESS.OFFSET(V.ADDRESS(sunny)) -> O             ;sunny 변수의 주소 값을 리턴

 

ADDRESS.OFFSET(V.ADDRESS(sunny[3])) -> O                    ;sunny[3]의 주소값을 리턴

 

 

심볼 섹터 주소 가져오기

시작 주소 : ADDRESS.OFFSET(sYmbol.SECADDRESS(\\u-boot\.text))

끝 주소 : ADDRESS.OFFSET(sYmbol.SECEND(\\u-boot\.text))

 

심볼의 사이즈 구하기

함수 : sYmbol.SIZEOF(again), 변수 : sYmbol.SIZEIF(sunny)

ADDRESS.OFFSET(sYmbol.END(sunny))-ADDRESS.OFFSET(sunny)+0x1

 

심볼의 값 가져오기

Var.Value(<변수명>)

 

V.STRING(<변수명>)

 

Data.STRING(<주소>)

 

 

이중 포인터의 경우 V.STRING(vppuchar[0]), V.STRING(*(vppuchar)) 형태로 사용

 

&val=v.value(sunny[0]) -> O

 

&val=v.value(sunny) -> X

sunny의 경우 배열이므로 sunny의 값은 배열의 시작 주소임, 그래서 이 경우에는 ADDRESS.OFFSET(sunny)와 값이 같음.

 

주소에 있는 값 가져오기

DATA.LONG(<ADDRESS>), Data.BYTE(<ADDRESS>), Data.word(<ADDRESS>), …   

general_func.pdf 참조

val=Data.BYTE(sunny), &val=Data.BYTE(V.ADDRESS(sunny[3]))

 

&string=Data.STRING(<ADDRESS>)

변수를 이용하지 않고 주소를 직접 접근해 값을 가져오는 것은 메모리 클래스를 이용해야 한다.

<SD:> - 가상주소를 이용한 cache가 반영된 값

<ASD:> - 물리주소를 이용한 cache가 반영된 값

<A:> - 물리주소를 이용한 cache가 반영되지 않는 값

 

레지스터의 값 가져오기

&reg_0=R(R0)                        ; 레지스터 R0의 값을 저장

&reg_pc=R(PC)                       ; 레지스터 PC의 값을 저장

&reg_r14_USR=r(R14_USR)        ; 레지스터 USR모드 R14의 값을 저장

register.copy                           ; 모든 레지스터 값을 클립보드로 저장

register.swap                          ; register.copy로 저장된 값을 restore

store <file name> register         ; 선택된 코어의 모든 레지스터 값을 파일로 저장

SMP(코어가 두개 이상)환경 의 경우에는 저장할 core를 선택 해야 한다.

ex ) Core 1선택 è CORE.Select Core 1

 

메모리의 값을 파일로 저장하기

TRACE32를 이용하여 메모리의 값을 읽어와 파일로 저장 할 수 있다.

가상 주소 기반으로 덤프 할 경우

Data.SAVE.Binary <file name> SD:<시작주소>--<끝 주소>

Data.SAVE.Binary <file name> SD:<시작주소>++<offset>

ex ) Data.SAVE.Binary test.bin SD:0xC0000000—0xC000FFFF

Data.SAVE.Binary test.bin SD:0xC0000000++0xFFFF

물리 주소 기반으로 덤프 할 경우(cache 반영)

Data.SAVE.Binary <file name> ASD:<시작주소>--<끝 주소>

물리 주소 기반으로 덤프 할 경우(cache 반영 안됨)

Data.SAVE.Binary <file name> ANC:<시작주소>--<끝 주소>

 

 

타겟에 값을 쓰기

변수에 값 쓰기

Var.Set %FORMAT <var name>=<value>

Var.Set %Hex sunny[0]=0x5

Var.Set %Decimal sunny[1]=1.

Var.Set %String <변수>=”string”

 

주소에 값 쓰기

사용자가 지정한 ADDRESS 또는 ADDRESS range에 값을 wirte하는 명령이다.

Data.Set 0xC0000000 "hello world" 0x0             ; set string to memory

Data.Set 0xC0000000 %Long 0x12345678          ; write long word

 

Data.Set 0xC0000000--0xC00000FF %Long 0x0    ; init memory with 0

레지스터에 값 쓰기

레지스터에 값을 쓰는 명령이다. 

Register.Set r0 0xFFFFFFFF                              ;R0 레지스터에 0xFFFFFFFF 값을 입력

Register.Set pc 0xC0008000                             ;PC 레지스터에 0xC0008000 값을 입력

 

 

Register.Set R14_USR 0xADADADAD                  ;User mode의 R14 레지스터에 0xADADADAD 값 입력

 

 

바이너리 파일을 메모리에 로드

Data.LOAD.Binary test.bin 0xC0000000                            ;test.bin 파일을 0xC0000000주소에 로드

Data.LOAD.Binary test.bin 0xC0000000 /Compare     ;test.bin 파일과 0xC0000000주소에 있는 값을 비교만 하고 로드 하지는 않는다. 만약 비교해서 다르면 비교를 중단하고 에러를 주소값과 함께 출력 한다.

 

String 처리

String 전달

String 값을 우변에서 좌변으로 전달 할 경우 “”로 감싸야 함

<잘못된 사용>                     <올바른 사용>

 

String 편집

문자열 수정하는 함수를 이용해 소스 패스를 맞추는 작업등을 스크립트로 자동화 할 수 있다.

 

STRING.CHAR(<string>,<index>)

문자열에서 지정한 위치의 문자 값을 Hex값으로 출력 한다.

 

문자열에서 지정한 위치의 index값이 없을 경우 -1을 리턴 한다.

 

STRING.CUT(<string>,<len>)

문자열의 처음부터 지정한 개수 만큼 잘라낸다.

 

STRING.FIND(<string1>,<string2>)

두 개의 문자열중 같은 문자가 있는지 체크하여 결과 값을 리턴 한다

 

 

STRING.LEN(<string>)

문자열의 길이를 리턴 한다.

 

STRING.MID(<string>,<start_at>,<len>)

문자열의 지정한 위치부터 지정한 개수만큼 잘라낸다.

 

 

STRING.SCAN(<string>,<string2>,<start_at>)

문자열을 scan하여 <string2> 가 있는 위치를 리턴 한다.

 

사용 예

심볼 패스를 자동으로 맞춰주도록 cmm을 작성

os.file.path(<file dir>)                 ; 파일이 있는 디렉토리를 리턴

os.pwd()                                ; 현재 작업중인 디렉토리를 리턴

 

Type 변환

형 변환 함수

FORMAT.BINARY(<width>,<number>)                  ; 바이너리로 변환

FORMAT.DECIMAL(<width>,<number>)                ; 10진수로 변환

FORMAT.FLOAT(<width>,<number>)                    ; 실수로 변환

FORMAT.HEX(<width>,<number>)            ; 16진수로 변환

FORMAT.UDECIMAL(<width>,<number>)    ; unsigned 10진수로 변환

 

CONV.CHAR(<value>)                           ;value 값을 char형으로 convert

 

 

CONV.BOOLTOINT(<bool>)                               ;<boo>형 data를 0과 1로 convert

 

CONV.FLOATTOINT(<float>)                                        ;<float> 값을 integer값으로 convert

 

 

CONV.INTTOMASK(<value>,<mask>)                              ;value에서 mask값에 해당하는 bit를 x 표시

 

CONV.MASKMTOINT(<value>)                                      ;MASK part를 integer값으로 변환

CONV.MASKTOINT(<value>)                                        ;VALUE part를 integer값으로 변환

 

 

CONV.SignedBYTE(<value>)

CONV.SignedLong(<value>)

CONV.SignedWord(<value>)

 

자동 형 변환

더하기(+)연산을 통한 자동 형 변환

 

Dialog box(TRACE32 GUI Programming)

CMM 스크립트를 이용하여 사용자 GUI환경을 꾸밀 수가 있다. Ide_ref.pdf 파일에서 DIALOG부분을 보면 예제 cmm과 DIALOG에서 만들 수 있는 객체들을 확인 할 수 있다.

DIALOG 예)

 

I/O 명령어

file I/O

file open

파일을 cmm 스크립트에서 만들거나 기존의 파일을 open할 수 있다.

OPEN #<buffer> <filename> [/<option>]

<option> è Read | Write | Create

사용 예)

OPEN #1 test.txt /Create            ;test.txt 파일을 현재 디렉토리에서 생성

OPEN #1 D:\test.txt /Creat                    ;test.txt 파일을 D:\ 위치에서 생성

OPEN #1 test.txt /Read              ;현재 working 경로의 test.txt파일을 open

 

file close

파일에 값을 읽거나 쓰는 작업이 완료 되는 시점에서 호출 해 주어야 한다.

사용 예)

CLOSE #1                                         ;#1 로 open된 file close

 

file read

파일에 있는 데이터를 read

사용 예) read_exam.cmm 실행하면 test.cmm 파일을 읽어와서 area window에 출력

 

file write

파일에 원하는 data를 write

사용 예) test.cmm 파일에서 읽어온 data를 test2.cmm에 write

 

Event Control(On command)

Event control 기능은(On command) Trace32에서 사용하는 특정 인터럽트의 처리 루틴이라고 보면 된다. 시스템(타겟 & PowerView)의 상태가 변할 때 ON-command은 정의되어 있는 PRACTICE 프로그램으로 자동 분기하도록 한다. ON commands들은 PRACTICE 스택 안에 저장 되므로 정의된 블록 내에서만 동작한다. 주의 할 점은 ENDDO 혹은 END을 script마지막 부분에 사용해서는 안 된다. 이 경우 정의된 이벤트들이 지워진다. 대신에 stop을 사용한다.

Event 종류

SYSDOWN è SYStem.Mode DOWN 실행시 발생

SYSUP è SYStem.Mode UP 실행시 발생

POWERUP è target의 전원이 켜지면 발생

PBREAK è Target의 프로그램이 멈출경우 발생

PBREAKAT è Target의 프로그램이 지정한 Address에서 멈출 경우 발생

Practice Event 종류

ALWAYS è cmm 스크립트가 실행 중 일 때 발생

ERROR è cmm에 문법이나 runtime에러가 발생 했을 때

STOP è 툴바의 STOP 버튼이 눌렸을 때 발생

KEY è 특정 키에 대한 단축 명령을 정의

CMD è 새로운 명령어를 정의

TIME è 특정 시간의 delay time 후에 프로그램을 실행 시킬지 정의

Event 활용

사용 예) Oncommand를 활용한 Event처리

기타

change directory

현재 working중인 디렉토리에서 다른 디렉토리로 변경 하려면 CD 명령어를 활용하면 된다.

사용 예)

CD ..\                        ;상위 디렉토리로 이동

CD ~\                        ;home 디렉토리로 이동

 

사용자 메뉴 구성

사용자가 임의대로 TRACE32 SW의 메뉴나 툴바를 추가 수정 할 수 있다.

사용 예)

위 cmm을 실행하면 아래와 같이 메뉴와 툴바가 추가 된다.

cmm에서 함수 호출 하기

TRACE32에서 타겟의 함수를 호출 하여 실행 할 수 있다. 이 기능을 이용하면 실제 타겟기반으로 파라미터를 변경해가면서 함수를 테스트 해볼 수 있다.

v (<ADDRESS>)(parameter)

v (<function name>)(parameter)

호출 되기 전

호출 후 결과

 

TRACE32 prompt 에서 사용 가능한 OS 명령

TRACE32내에서 사용되는 OS specific 명령에 대해 알아봅니다.

     TRACE32에서 OS file system에 있는 실행파일 실행하기

OS라는 명령을 이용하여 OS file system에 있는 실행파일을 실행할 수 있습니다. 파일명 기술 시 Space Bar가 있는 경우 ” ”로 감싸 주시기 바랍니다.

 

OS [실행파일명]

 

Ex) If OS.FILE(”C:\ComPAS\app\ComPAS_Viewer\compas.exe”)

         OS ”C:\ComPAS\app\ComPAS_Viewer\compas.exe”         ; 해당 파일이 있으면 실행합니다.

     PWD

 

PWD ; 현재 작업폴더 Path를 보여줍니다.

     ChDir/ChDir.DO

현재 작업 폴더를 다른 곳으로 변경할 때 사용합니다.

 

ChDir [PathName]       ; 작업 폴더를 정의한 Path로 변경합니다. 

ChDir.DO [FileName]   ; 작업폴더를 FileName이 위치한 Path로 변경합니다.

 

Ex) CD ..                     ; 상위 폴더로 이동합니다.

   CD WORK               ; WORK 폴더로 이동합니다.

   CD C:/T32/WORK     ; 작업폴더를 C:/T32/WORK

   CD.DO C:/T32/Work/test.cmm        ; test.cmm 파일이 위치한 폴더로 현재 작업 폴더를 변경하고 파일을 실행합니다.

     DIR/LS

DIR [PathName] ; PathName이 없다면 현재 작업폴더의 내용을 보여 주며 있으면 Path내용을 보여줍니다.

LS[PathName]   ; PathName이 없다면 현재 작업폴더의 내용을 보여 주며 있으면 Path내용을 보여줍니다.

 

     COPY/MV/REN

COPY [SourceFile] [DestinationFile]      ; SourceFile을 DestinationFile로 Copy합니다.

Ex) COPY /T32/old.t32 ./new.t32             ; 해당 path의 old.t32파일을 현재 path에 new.t32로 copy합니다.

 

MV [OldName] [NewName]     ; OldName을 NewName으로 변경합니다.

Ex) MV old.t32 new.t32             ; old.t32의 file이름을 new.t32로 변경합니다.

 

REN [OldName] [NewName]    ; OldName을 NewName으로 변경합니다.

Ex) REN old.t32 new.t32            ; old.t32의 file이름을 new.t32로 변경합니다.

 

     DEL/RM

DEL [FileName]           ; FileName을 지웁니다.

RM [FileName]            ; FileName을 지웁니다.

Ex) DEL c:\t32\test.bak

RM c:\t32\test.bak

 

     EDIT

EDIT [FileName]                     ; FileName을 text editor로 엽니다.

Ex) edit text.txt            ; text.txt파일과 함께 TRACE32에 text editor를 엽니다.

 

     HISTory

HISTory          ; 그동안 사용했던 명령 History를 보여줍니다.

그동안 사용했던 History 윈도우가 열린 후 List 중 원하는 명령에 더블클릭하면 해당 명령을 다시 실행하게 됩니다.

 

     MKDIR

MKDIR [PathName]     ; PathName을 갖는 폴더를 만듧니다.

RMDIR [PathName]     ; PathName을 갖는 폴더를 지웁니다. 해당 폴더는 비어 있어야 합니다.

Ex) MKDIR SubDir         ; SubDir이란 폴더를 만듧니다.

   RMDIR SubDir         ; SubDir 폴더를 지웁니다.

  QUIT

TRACE32 GUI(PowerView)를 닫습니다.

 

  TITLE

TITLE %String [”TitleName”]    ; TRACE32 GUI title을 TitleName으로 변경합니다.

Ex) TITLE %String "TRACE32 Debugger for CPU0"  ; TRACE32 PowerView Title을 해당 String으로 변경합니다.