MDSTECH
TRACE32
TRACE32 Solution
TRACE32 Trace Solution
TRACE32 More Product
TRACE32 Software Solution
Why TRACE32?
교육신청
정규교육
교육과정 안내
교육장 안내
교육설문
자료실
TRACE32 소프트웨어
TRACE32 매뉴얼
iTSP
TRACE32 영상
인증서
고객지원
뉴스레터
Q&A
FAQ
원격지원
검색창
검색버튼
회원가입
로그인
TRACE32
TRACE32 Solution
TRACE32 Trace Solution
TRACE32 More Product
TRACE32 Software Solution
Why TRACE32?
교육신청
정규교육
교육과정 안내
교육장 안내
교육설문
자료실
TRACE32 소프트웨어
TRACE32 매뉴얼
iTSP
TRACE32 영상
인증서
고객 지원
뉴스레터
Q&A
FAQ
원격지원
사이트맵 보기
디버깅 시 유용한 명령 문서 원본 보기
←
디버깅 시 유용한 명령
이동:
둘러보기
,
검색
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게만 가능합니다:
사용자
문서의 원본을 보거나 복사할 수 있습니다:
<p> </p> <h1>Introduction</h1> <p><span style="font-size: small;">practice Program(이하 cmm)은 TRACE32내에서 사용하고 있는 스크립트이다. TRACE32내에서 여러 명령어를 하나의 파일로 작성을 해서 인터프리터 방식으로 실행이 된다. TRACE32에서 제공되는 명령어와 함수들을 이용해 만들 수 있고 이러한 cmm파일을 이용하여 반복적으로 해야 하는 디버깅이나 작업들을 간편하게 수행 할 수 있다. TRACE32의 명령어들을 자세히 정리 해둔 문서는 TRACE32 S/W가 설치된 폴더의 pdf폴더에 있다. (C:\T32\pdf)</span></p> <h2>TRACE32 주요 명령어 관련 문서</h2> <p>Practice_ref.pdf</p> <p>Practice_user.pdf</p> <p>Training_practice.pfd</p> <p>General_ref_*.pdf</p> <h2>TRACE32 function 관련 문서</h2> <p><span style="font-size: small;">Ide_func.pdf</span></p> <p><span style="font-size: small;">Practice_user.pdf</span></p> <p><span style="font-size: small;">Training_practice.pdf</span></p> <p> </p> <h2>명령어나 함수 검색</h2> <p><span style="font-size: small;">Help 메뉴를 활용하여 문서를 찾아보거나 원하는 명령어나 함수를 검색 할 수 있다.</span></p> <p><span style="font-size: small;">[Menu] -> [Help] -> [Index]</span></p> <p><img style="width: 589px; height: 548px;" src="/data/wiki/2015-02-16/1424072844.png" alt="" width="792" height="539" /></p> <p> </p> <h1>practice Program(CMM script) 생성 및 기본</h1> <h2>cmm script 생성 및 기존 cmm파일의 수정</h2> <p>PEDIT <filename.cmm></p> <p><img style="width: 277px; height: 81px;" src="/data/wiki/2015-02-17/1424138161.png" alt="" width="444" height="105" /></p> <p> </p> <h2>cmm script 실행</h2> <h2>DO <filename.cmm></h2> <p><img src="/data/wiki/2015-02-17/1424138208.png" alt="" /></p> <p> </p> <h2>cmm script의 작성</h2> <p>script의 시작은 B::으로 시작되고 ENDDO로 끝낸다</p> <p><img src="/data/wiki/2015-02-17/1424138310.png" alt="" /></p> <p> </p> <h2>주석 처리</h2> <p>주석 처리하려는 문장의 앞쪽에 ‘;’ 나 “//”를 사용 한다.</p> <p><img src="/data/wiki/2015-02-17/1424138647.png" alt="" /></p> <p> </p> <h2>파라미터 전달 및 리턴 값 처리</h2> <p>cmm을 호출 할 때 파라미터는 <DO filename.cmm pram1 pram2 pram3 …> 와 같이 전해줄 수 있다.</p> <p>호출 되는 cmm에서는 ENTRY &pram1 &pram2 &pram3 …> 와 같이 파라미터를 받을 수 있다.</p> <p>리턴 값을 전달 해줄 경우는 스크립트가 종료되는 부분에 <ENDDO return1 return2 return2 …>와 같이 사용 하고 리턴 값을 받을 때는 ENTRY &pram1 &pram2 &pram3 …> 과같이 사용한다.</p> <p>ex : test.cmm 을 실행 했을 때 결과</p> <p><img src="/data/wiki/2015-02-17/1424138966.png" alt="" /></p> <p>String값을 파라미터로 넘길 때는 주의 해야 할 부분이 있다. 파라미터들의 구분을 공백으로 하기 때문에 String에 공백이 있을 경우 문제가 발생 될 수 있다.</p> <p>잘 못된 사용 예</p> <p><img src="/data/wiki/2015-02-17/1424138984.png" alt="" /></p> <p> </p> <p>올바른 사용 예(%LINE or “ “ 사용)</p> <p><img src="/data/wiki/2015-02-17/1424138996.png" alt="" /></p> <p> </p> <h2>cmm 디버깅</h2> <p>스크립트도 프로그래밍 이므로 검증하기 위한 디버깅을 해야 하는 경우가 있다.</p> <p>디버깅 하고자 하는 스크립트를 PEDIT 명령으로 열고 Debug 버튼을 누르면 step by step으로</p> <p>스크립트를 수행 하면서 결과를 확인 하며 디버깅 할 수 있다.</p> <p><img src="/data/wiki/2015-02-17/1424139006.png" alt="" /></p> <p><img src="/data/wiki/2015-02-17/1424139012.png" alt="" /></p> <p>step : 한 라인씩 수행</p> <p>over : 다른 스크립트를 호출 하는 부분을 만날 경우 호출 할 스크립트를 모두 수행한다.</p> <p>continue : 수행 되어야 할 나머지 부분을 모두 수행 한다.</p> <p>stop : 수행 중인 cmm 을 멈춘다.</p> <p>enddo : 현재 수행중인 cmm을 끝낸다.</p> <p>Macros : 호출된 cmm의 순서와 cmm에서 사용된 변수들의 값을 보여 준다.(명령어 B::pmacro)</p> <p>Double click : 스크립트 디버깅 중 원하는 부분에 double click하면 break point를 셋팅 할 수 있다.</p> <p>마우스 우클릭 : 팝업 메뉴 사용</p> <p><img src="/data/wiki/2015-02-17/1424139026.png" alt="" /></p> <p> </p> <h2>단축 명령어 와 대소문자 구분</h2> <p>Trace32에서는 단축 명령어를 지원 한다. 예를 들어 CPU를 선택하는 명령어인 SYStem.CPU <CPU Name> 명령은 sys.cpu <CPU Name>과 같이 단축해서 사용할 수 있다. 또한 대문자 SYS.CPU와 소문자 sys.cpu 명령은 구분되지 않고 같은 명령을 실행 한다. Trace32에서 단축명령어를 확인 할 수 있는 방법은 full name명령어에서 대문자로 된 부분이 단축 명령어 이다.(ex – SYStem è sys, Data.Set è d.s)</p> <p> </p> <h1>Program Flow</h1> <p>cmm 스크립트의 실행 흐름을 제어하기 위해 아래와 같은 sub 루틴을 이용할 수 있다.</p> <h2>GOSUB/RETURN</h2> <p>cmm 스크립트의 sub function이라고 보면 된다. 파라미터와 리턴값을 받을 수 있다.</p> <p>GOSUB를 사용할 경우 SUB 루틴에서는 반드시 RETURN을 해주어야 한다.</p> <p>RETURN이 되지 않는다면 stack underflow와 같은 에러가 발생 할 수 있다.</p> <p><img src="/data/wiki/2015-02-17/1424139040.png" alt="" /></p> <p> </p> <h2>GOTO/JUMPTO</h2> <p>cmm의 실행 흐름만 변경 가능 하며 C language의 goto문과 역할이 비슷하다.</p> <p>파라미터나 리턴값을 받을 수 없다.</p> <p>ENDDO를 넣지 않으면 순차적으로 계속 해서 실행 되기 때문에 원하지 않는 명령어가 수행 될 수 있다.</p> <p><img src="/data/wiki/2015-02-17/1424139051.png" alt="" /></p> <p><span style="white-space: pre;"> </span><GOTO 사용><span style="white-space: pre;"> </span><JUMPTO 사용> <span style="white-space: pre;"> </span> <잘못된 사용></p> <p> </p> <h1>조건 문 및 반복 문</h1> <h2>IF, IF ELSE, Var.IF</h2> <p>if문은 조건절의 내용에 따라서 true나 false값을 반환한다.</p> <p>Else 절은 필요 시 사용하며 필요 없을 경우에는 생략할 수 있다.</p> <p>If 조건절 이후 한 문장일 경우에는 블록으로 지정하지 않아도 되지만,</p> <p>한 문장 이상일 경우에는 괄호를 사용하여 블록으로 지정해야 한다.</p> <p>사용 : IF <Condition> , Var.IF <HLL Condition></p> <p><img src="/data/wiki/2015-02-17/1424139096.png" alt="" /></p> <p><img src="/data/wiki/2015-02-17/1424139110.png" alt="" /></p> <p> </p> <h2>WHILE, Var.WHILE</h2> <p>반복논리를 제공하기 위해 while, repeat 문을 제공하고 있다.</p> <p>반복문들은 지정된 문장의 조건이 만족할 때까지 반복한다.</p> <p>조건을 지정하는 방법에 따라 while, repeat문이 구분되어 사용된다.</p> <p>사용 : WHILE <Condition>, Var.WHILE <HLL Condition></p> <p><img src="/data/wiki/2015-02-17/1424139123.png" alt="" /></p> <p> </p> <h2>REPEAT</h2> <p>C Language의 for{;;} 문과 동일한 기능으로 지정한 횟수를 반복 수행 한다.</p> <p>사용 : REPEAT <반복 횟수></p> <p><img src="/data/wiki/2015-02-17/1424139138.png" alt="" /></p> <p> </p> <h1>변수/배열/구조체 사용</h1> <h2>변수 선언 규칙</h2> <p>cmm에서 변수 이름은 사용자가 부여하는 명칭으로 다음과 같은 규칙이 있다.</p> <p>변수명의 구성은 영문자(A-Z,a-z),숫자(0-9),밑줄(_)로 구성된다.</p> <p>첫 글자는 반드시 영문자로 시작하여야 하며 두 번째 글자부터 영문자, 숫자, 밑줄 어느 것이 와도 무방 하다.</p> <p>밑줄은 영문자나 숫자 사이에 나와도 상관없으며 변수의 처음이나 끝 부분에는 나올 수 없다.</p> <p>변수명의 길이는 제한이 없다.</p> <p>변수명에는 예약어나 특수 문자를 사용할 수 없다.</p> <p>Global 변수는 대문자, local 변수는 소문자로 구별을 하면 변수 보기가 더 편리하다.</p> <p>Global 변수는 다른 cmm 파일 내 에서도 변수를 사용할 수가 있고, local 변수는 현재 cmm 파일 내 에서만 사용이 가능하다.</p> <p>변수의 선언 시 정수형, 실수형, long형,double형 변수가 따로 구분이 없다.</p> <p> </p> <h2>변수 사용</h2> <p>지역 변수 선언 : LOCAL &<변수명> 또는 &<변수명></p> <p>전역 변수 선언 : GLOBAL &<변수명></p> <p>변수는 주소, 숫자, String 등의 값을 가질 수 있다.</p> <p> </p> <h2>배열 사용</h2> <p>Var.NEW <type> \<Array name></p> <p>Var.NEW int[10] \Group_List ;배열 선언</p> <p>Var.Set \Group_List[&i]=1. ;배열에 값 넣기</p> <p>&value=Var.Value(\Group_List[&i])+0. ;배열에 있는 값 받아오기</p> <p><img src="/data/wiki/2015-02-17/1424139165.png" alt="" /></p> <p>PMACRO 명령을 통해 변수 값을 확인 해보면 생성한 배열에 값이 들어가 있는 것을 확인 할 수 있다.</p> <p> </p> <h2>구조체 사용</h2> <p>Var.NEW STRUCT <STRUCT TYPE> \<Struct name></p> <p>구조체 사용은 기본적으로 심볼에 있는 구조체 타입만 사용할 수 있다.</p> <p>사용 예</p> <p>Var.New STRUCT task_struct \task ;task_struct타입의 구조체 선언</p> <p>Var.Set \task=&process_magic ;tcb 주소를 구조체에 넣기</p> <p>&process_name=V.STRING(\task.comm) ;구조체에 있는 값 받아오기</p> <p> </p> <p>☞ 배열이나 구조체는 파라미터로 전달되지 않음!!!</p> <p><img src="/data/wiki/2015-02-17/1424139182.png" alt="" /></p> <p>PMACRO를 통해 구조체에 값이 저장되어 있는 것을 확인 할 수 있다.</p> <p> </p> <h1>타겟에서 값 읽어 오기</h1> <h2>심볼 주소 가져오기</h2> <p><img src="/data/wiki/2015-02-17/1424139197.png" alt="" /></p> <p> </p> <p>ADDRESS.OFFSET(sunny) -> O ;sunny 변수의 주소 값을 리턴</p> <p><img src="/data/wiki/2015-02-17/1424139205.png" alt="" /></p> <p> </p> <p>ADDRESS.OFFSET(sunny[3]) -> X ;HLL(High Level Language) 지원 하지 않음</p> <p><img src="/data/wiki/2015-02-17/1424139262.png" alt="" /></p> <p> </p> <p>ADDRESS.OFFSET(V.ADDRESS(sunny)) -> O ;sunny 변수의 주소 값을 리턴</p> <p><img src="/data/wiki/2015-02-17/1424139276.png" alt="" /></p> <p> </p> <p>ADDRESS.OFFSET(V.ADDRESS(sunny[3])) -> O ;sunny[3]의 주소값을 리턴</p> <p><img src="/data/wiki/2015-02-17/1424139330.png" alt="" /></p> <p> </p> <p> </p> <h2>심볼 섹터 주소 가져오기</h2> <p><img src="/data/wiki/2015-02-17/1424139532.png" alt="" /></p> <p>시작 주소 : ADDRESS.OFFSET(sYmbol.SECADDRESS(\\u-boot\.text))</p> <p><img src="/data/wiki/2015-02-17/1424139542.png" alt="" /></p> <p>끝 주소 : ADDRESS.OFFSET(sYmbol.SECEND(\\u-boot\.text))</p> <p><img src="/data/wiki/2015-02-17/1424139551.png" alt="" /></p> <p> </p> <h2>심볼의 사이즈 구하기</h2> <p>함수 : sYmbol.SIZEOF(again), 변수 : sYmbol.SIZEIF(sunny)</p> <p><img src="/data/wiki/2015-02-17/1424139565.png" alt="" /></p> <p>ADDRESS.OFFSET(sYmbol.END(sunny))-ADDRESS.OFFSET(sunny)+0x1</p> <p><img src="/data/wiki/2015-02-17/1424139576.png" alt="" /></p> <p> </p> <h2>심볼의 값 가져오기</h2> <p>Var.Value(<변수명>)</p> <p><img src="/data/wiki/2015-02-17/1424139589.png" alt="" /></p> <p> </p> <p>V.STRING(<변수명>)</p> <p><img src="/data/wiki/2015-02-17/1424139602.png" alt="" /></p> <p> </p> <p>Data.STRING(<주소>)</p> <p><img src="/data/wiki/2015-02-17/1424139611.png" alt="" /></p> <p> </p> <p> </p> <p>이중 포인터의 경우 V.STRING(vppuchar[0]), V.STRING(*(vppuchar)) 형태로 사용</p> <p><img src="/data/wiki/2015-02-17/1424139627.png" alt="" /></p> <p><img src="/data/wiki/2015-02-17/1424139638.png" alt="" /></p> <p> </p> <p>&val=v.value(sunny[0]) -> O</p> <p><img src="/data/wiki/2015-02-17/1424139648.png" alt="" /></p> <p> </p> <p>&val=v.value(sunny) -> X</p> <p><img src="/data/wiki/2015-02-17/1424139674.png" alt="" /></p> <p>sunny의 경우 배열이므로 sunny의 값은 배열의 시작 주소임, 그래서 이 경우에는 ADDRESS.OFFSET(sunny)와 값이 같음.</p> <p> </p> <h2>주소에 있는 값 가져오기</h2> <p>DATA.LONG(<ADDRESS>), Data.BYTE(<ADDRESS>), Data.word(<ADDRESS>), … </p> <p>general_func.pdf 참조</p> <p>val=Data.BYTE(sunny), &val=Data.BYTE(V.ADDRESS(sunny[3]))</p> <p><img src="/data/wiki/2015-02-17/1424139691.png" alt="" /></p> <p> </p> <p>&string=Data.STRING(<ADDRESS>)</p> <p><img src="/data/wiki/2015-02-17/1424139709.png" alt="" /></p> <p>변수를 이용하지 않고 주소를 직접 접근해 값을 가져오는 것은 메모리 클래스를 이용해야 한다.</p> <p><SD:> - 가상주소를 이용한 cache가 반영된 값</p> <p><ASD:> - 물리주소를 이용한 cache가 반영된 값</p> <p><A:> - 물리주소를 이용한 cache가 반영되지 않는 값</p> <p><img src="/data/wiki/2015-02-17/1424139779.png" alt="" /></p> <p> </p> <h2>레지스터의 값 가져오기</h2> <p>&reg_0=R(R0) ; 레지스터 R0의 값을 저장</p> <p>&reg_pc=R(PC) ; 레지스터 PC의 값을 저장</p> <p>&reg_r14_USR=r(R14_USR) ; 레지스터 USR모드 R14의 값을 저장</p> <p>register.copy ; 모든 레지스터 값을 클립보드로 저장</p> <p>register.swap ; register.copy로 저장된 값을 restore</p> <p>store <file name> register ; 선택된 코어의 모든 레지스터 값을 파일로 저장</p> <p>SMP(코어가 두개 이상)환경 의 경우에는 저장할 core를 선택 해야 한다.</p> <p>ex ) Core 1선택 è CORE.Select Core 1</p> <p> </p> <h2>메모리의 값을 파일로 저장하기</h2> <p>TRACE32를 이용하여 메모리의 값을 읽어와 파일로 저장 할 수 있다.</p> <h3>가상 주소 기반으로 덤프 할 경우</h3> <p>Data.SAVE.Binary <file name> SD:<시작주소>--<끝 주소></p> <p>Data.SAVE.Binary <file name> SD:<시작주소>++<offset></p> <p>ex ) Data.SAVE.Binary test.bin SD:0xC0000000—0xC000FFFF</p> <p>Data.SAVE.Binary test.bin SD:0xC0000000++0xFFFF</p> <h3>물리 주소 기반으로 덤프 할 경우(cache 반영)</h3> <p>Data.SAVE.Binary <file name> ASD:<시작주소>--<끝 주소></p> <h3>물리 주소 기반으로 덤프 할 경우(cache 반영 안됨)</h3> <p>Data.SAVE.Binary <file name> ANC:<시작주소>--<끝 주소></p> <p> </p> <p> </p> <h1>타겟에 값을 쓰기</h1> <h2>변수에 값 쓰기</h2> <p>Var.Set %FORMAT <var name>=<value></p> <p>Var.Set %Hex sunny[0]=0x5</p> <p>Var.Set %Decimal sunny[1]=1.</p> <p>Var.Set %String <변수>=”string”</p> <p><img src="/data/wiki/2015-02-17/1424139873.png" alt="" /></p> <p> </p> <h2>주소에 값 쓰기</h2> <p>사용자가 지정한 ADDRESS 또는 ADDRESS range에 값을 wirte하는 명령이다.</p> <p>Data.Set 0xC0000000 "hello world" 0x0 ; set string to memory</p> <p><img src="/data/wiki/2015-02-17/1424141819.png" alt="" /></p> <p>Data.Set 0xC0000000 %Long 0x12345678 ; write long word</p> <p><img src="/data/wiki/2015-02-17/1424141830.png" alt="" /></p> <p> </p> <p>Data.Set 0xC0000000--0xC00000FF %Long 0x0 ; init memory with 0</p> <p><img src="/data/wiki/2015-02-17/1424141840.png" alt="" /></p> <h2>레지스터에 값 쓰기</h2> <p>레지스터에 값을 쓰는 명령이다. </p> <p>Register.Set r0 0xFFFFFFFF ;R0 레지스터에 0xFFFFFFFF 값을 입력</p> <p><img src="/data/wiki/2015-02-17/1424141850.png" alt="" /></p> <p>Register.Set pc 0xC0008000 ;PC 레지스터에 0xC0008000 값을 입력</p> <p><img src="/data/wiki/2015-02-17/1424141860.png" alt="" /></p> <p> </p> <p> </p> <p>Register.Set R14_USR 0xADADADAD ;User mode의 R14 레지스터에 0xADADADAD 값 입력</p> <p><img src="/data/wiki/2015-02-17/1424141870.png" alt="" /></p> <p> </p> <p> </p> <h2>바이너리 파일을 메모리에 로드</h2> <p>Data.LOAD.Binary test.bin 0xC0000000 ;test.bin 파일을 0xC0000000주소에 로드</p> <p><img src="/data/wiki/2015-02-17/1424141882.png" alt="" /></p> <p>Data.LOAD.Binary test.bin 0xC0000000 /Compare ;test.bin 파일과 0xC0000000주소에 있는 값을 비교만 하고 로드 하지는 않는다. 만약 비교해서 다르면 비교를 중단하고 에러를 주소값과 함께 출력 한다.</p> <p><img src="/data/wiki/2015-02-17/1424141904.png" alt="" /></p> <p> </p> <h1>String 처리</h1> <h2>String 전달</h2> <p>String 값을 우변에서 좌변으로 전달 할 경우 “”로 감싸야 함</p> <p><img src="/data/wiki/2015-02-17/1424141918.png" alt="" /></p> <p><span style="white-space: pre;"> </span><잘못된 사용> <span style="white-space: pre;"> </span> <올바른 사용></p> <p> </p> <h2>String 편집</h2> <p>문자열 수정하는 함수를 이용해 소스 패스를 맞추는 작업등을 스크립트로 자동화 할 수 있다.</p> <p> </p> <h3>STRING.CHAR(<string>,<index>)</h3> <p>문자열에서 지정한 위치의 문자 값을 Hex값으로 출력 한다.</p> <p><img src="/data/wiki/2015-02-17/1424141945.png" alt="" /></p> <p> </p> <p>문자열에서 지정한 위치의 index값이 없을 경우 -1을 리턴 한다.</p> <p><img src="/data/wiki/2015-02-17/1424141954.png" alt="" /></p> <p> </p> <h3>STRING.CUT(<string>,<len>)</h3> <p>문자열의 처음부터 지정한 개수 만큼 잘라낸다.</p> <p><img src="/data/wiki/2015-02-17/1424141972.png" alt="" /></p> <p> </p> <h3>STRING.FIND(<string1>,<string2>)</h3> <p>두 개의 문자열중 같은 문자가 있는지 체크하여 결과 값을 리턴 한다</p> <p><img src="/data/wiki/2015-02-17/1424141984.png" alt="" /></p> <p> </p> <p> </p> <h3>STRING.LEN(<string>)</h3> <p>문자열의 길이를 리턴 한다.</p> <p><img src="/data/wiki/2015-02-17/1424142007.png" alt="" /></p> <p> </p> <h3>STRING.MID(<string>,<start_at>,<len>)</h3> <p>문자열의 지정한 위치부터 지정한 개수만큼 잘라낸다.</p> <p><img src="/data/wiki/2015-02-17/1424142017.png" alt="" /></p> <p> </p> <p> </p> <h3>STRING.SCAN(<string>,<string2>,<start_at>)</h3> <p>문자열을 scan하여 <string2> 가 있는 위치를 리턴 한다.</p> <p><img src="/data/wiki/2015-02-17/1424142028.png" alt="" /></p> <p> </p> <h2>사용 예</h2> <p>심볼 패스를 자동으로 맞춰주도록 cmm을 작성</p> <p>os.file.path(<file dir>) ; 파일이 있는 디렉토리를 리턴</p> <p>os.pwd() ; 현재 작업중인 디렉토리를 리턴</p> <p><img src="/data/wiki/2015-02-17/1424142040.png" alt="" /></p> <p> </p> <h1>Type 변환</h1> <h2>형 변환 함수</h2> <p>FORMAT.BINARY(<width>,<number>) ; 바이너리로 변환</p> <p>FORMAT.DECIMAL(<width>,<number>) ; 10진수로 변환</p> <p>FORMAT.FLOAT(<width>,<number>) ; 실수로 변환</p> <p>FORMAT.HEX(<width>,<number>) ; 16진수로 변환</p> <p>FORMAT.UDECIMAL(<width>,<number>) ; unsigned 10진수로 변환</p> <p><img src="/data/wiki/2015-02-17/1424142052.png" alt="" /></p> <p> </p> <p>CONV.CHAR(<<em>value</em>>) ;value 값을 char형으로 convert</p> <p><img src="/data/wiki/2015-02-17/1424142061.png" alt="" /></p> <p> </p> <p> </p> <p>CONV.BOOLTOINT(<<em>bool</em>>) ;<boo>형 data를 0과 1로 convert</p> <p><img src="/data/wiki/2015-02-17/1424142072.png" alt="" /></p> <p> </p> <p>CONV.FLOATTOINT(<<em>float</em>>) ;<float> 값을 integer값으로 convert</p> <p><img src="/data/wiki/2015-02-17/1424142081.png" alt="" /></p> <p> </p> <p> </p> <p>CONV.INTTOMASK(<<em>value</em>>,<<em>mask</em>>) ;value에서 mask값에 해당하는 bit를 x 표시</p> <p><img src="/data/wiki/2015-02-17/1424142092.png" alt="" /></p> <p> </p> <p>CONV.MASKMTOINT(<<em>value</em>>) ;MASK part를 integer값으로 변환</p> <p>CONV.MASKTOINT(<<em>value</em>>) ;VALUE part를 integer값으로 변환</p> <p><img src="/data/wiki/2015-02-17/1424142100.png" alt="" /></p> <p> </p> <p> </p> <p>CONV.SignedBYTE(<<em>value</em>>)</p> <p>CONV.SignedLong(<<em>value</em>>)</p> <p>CONV.SignedWord(<<em>value</em>>)</p> <p><img src="/data/wiki/2015-02-17/1424142110.png" alt="" /></p> <p> </p> <h2>자동 형 변환</h2> <p>더하기(+)연산을 통한 자동 형 변환</p> <p><img src="/data/wiki/2015-02-17/1424142122.png" alt="" /></p> <p> </p> <h1>Dialog box(TRACE32 GUI Programming)</h1> <p>CMM 스크립트를 이용하여 사용자 GUI환경을 꾸밀 수가 있다. Ide_ref.pdf 파일에서 DIALOG부분을 보면 예제 cmm과 DIALOG에서 만들 수 있는 객체들을 확인 할 수 있다.</p> <p>DIALOG 예)</p> <p><img src="/data/wiki/2015-02-17/1424142132.png" alt="" /></p> <p> </p> <h1>I/O 명령어</h1> <h2>file I/O</h2> <h3>file open</h3> <p>파일을 cmm 스크립트에서 만들거나 기존의 파일을 open할 수 있다.</p> <p>OPEN #<buffer> <filename> [/<option>]</p> <p><option> è Read | Write | Create</p> <p>사용 예)</p> <p>OPEN #1 test.txt /Create ;test.txt 파일을 현재 디렉토리에서 생성</p> <p>OPEN #1 D:\test.txt /Creat ;test.txt 파일을 D:\ 위치에서 생성</p> <p>OPEN #1 test.txt /Read ;현재 working 경로의 test.txt파일을 open</p> <p> </p> <h3>file close</h3> <p>파일에 값을 읽거나 쓰는 작업이 완료 되는 시점에서 호출 해 주어야 한다.</p> <p>사용 예)</p> <p>CLOSE #1 ;#1 로 open된 file close</p> <p> </p> <h3>file read</h3> <p>파일에 있는 데이터를 read</p> <p>사용 예) read_exam.cmm 실행하면 test.cmm 파일을 읽어와서 area window에 출력</p> <p><img src="/data/wiki/2015-02-17/1424142151.png" alt="" /></p> <p> </p> <h3>file write</h3> <p>파일에 원하는 data를 write</p> <p>사용 예) test.cmm 파일에서 읽어온 data를 test2.cmm에 write</p> <p><img src="/data/wiki/2015-02-17/1424142160.png" alt="" /></p> <p> </p> <h1>Event Control(On command)</h1> <p>Event control 기능은(On command) Trace32에서 사용하는 특정 인터럽트의 처리 루틴이라고 보면 된다. 시스템(타겟 & PowerView)의 상태가 변할 때 ON-command은 정의되어 있는 PRACTICE 프로그램으로 자동 분기하도록 한다. ON commands들은 PRACTICE 스택 안에 저장 되므로 정의된 블록 내에서만 동작한다. 주의 할 점은 ENDDO 혹은 END을 script마지막 부분에 사용해서는 안 된다. 이 경우 정의된 이벤트들이 지워진다. 대신에 stop을 사용한다.</p> <h2>Event 종류</h2> <p>SYSDOWN è SYStem.Mode DOWN 실행시 발생</p> <p>SYSUP è SYStem.Mode UP 실행시 발생</p> <p>POWERUP è target의 전원이 켜지면 발생</p> <p>PBREAK è Target의 프로그램이 멈출경우 발생</p> <p>PBREAKAT è Target의 프로그램이 지정한 Address에서 멈출 경우 발생</p> <h2>Practice Event 종류</h2> <p>ALWAYS è cmm 스크립트가 실행 중 일 때 발생</p> <p>ERROR è cmm에 문법이나 runtime에러가 발생 했을 때</p> <p>STOP è 툴바의 STOP 버튼이 눌렸을 때 발생</p> <p>KEY è 특정 키에 대한 단축 명령을 정의</p> <p>CMD è 새로운 명령어를 정의</p> <p>TIME è 특정 시간의 delay time 후에 프로그램을 실행 시킬지 정의</p> <h2>Event 활용</h2> <p>사용 예) Oncommand를 활용한 Event처리</p> <p><img src="/data/wiki/2015-02-17/1424142173.png" alt="" /></p> <h1>기타</h1> <h2>change directory</h2> <p>현재 working중인 디렉토리에서 다른 디렉토리로 변경 하려면 CD 명령어를 활용하면 된다.</p> <p>사용 예)</p> <p>CD ..\ ;상위 디렉토리로 이동</p> <p>CD ~\ ;home 디렉토리로 이동</p> <p><img src="/data/wiki/2015-02-17/1424142183.png" alt="" /></p> <p> </p> <h2>사용자 메뉴 구성</h2> <p>사용자가 임의대로 TRACE32 SW의 메뉴나 툴바를 추가 수정 할 수 있다.</p> <p>사용 예)</p> <p><img src="/data/wiki/2015-02-17/1424142193.png" alt="" /></p> <p>위 cmm을 실행하면 아래와 같이 메뉴와 툴바가 추가 된다.</p> <p><img src="/data/wiki/2015-02-17/1424142203.png" alt="" /></p> <h2>cmm에서 함수 호출 하기</h2> <p>TRACE32에서 타겟의 함수를 호출 하여 실행 할 수 있다. 이 기능을 이용하면 실제 타겟기반으로 파라미터를 변경해가면서 함수를 테스트 해볼 수 있다.</p> <p>v (<ADDRESS>)(parameter)</p> <p>v (<function name>)(parameter)</p> <p>호출 되기 전</p> <p><img src="/data/wiki/2015-02-17/1424142214.png" alt="" /></p> <p>호출 후 결과</p> <p><img src="/data/wiki/2015-02-17/1424142224.png" alt="" /></p> <p> </p> <h2>TRACE32 prompt 에서 사용 가능한 OS 명령</h2> <p>TRACE32내에서 사용되는 OS specific 명령에 대해 알아봅니다.</p> <h3> TRACE32에서 OS file system에 있는 실행파일 실행하기</h3> <p>OS라는 명령을 이용하여 OS file system에 있는 실행파일을 실행할 수 있습니다. 파일명 기술 시 Space Bar가 있는 경우 ” ”로 감싸 주시기 바랍니다.</p> <p> </p> <p><strong>OS [</strong><strong>실행파일명]</strong></p> <p> </p> <p>Ex) If OS.FILE(”C:\ComPAS\app\ComPAS_Viewer\compas.exe”)</p> <p> OS ”C:\ComPAS\app\ComPAS_Viewer\compas.exe” ; 해당 파일이 있으면 실행합니다.</p> <h3> PWD</h3> <p> </p> <p><strong>PWD </strong>; 현재 작업폴더 Path를 보여줍니다.</p> <h3> ChDir/ChDir.DO</h3> <p>현재 작업 폴더를 다른 곳으로 변경할 때 사용합니다.</p> <p> </p> <p><strong>ChDir [PathName] </strong>; 작업 폴더를 정의한 Path로 변경합니다.<strong> </strong></p> <p><strong>ChDir.DO [FileName]</strong> ; 작업폴더를 FileName이 위치한 Path로 변경합니다.</p> <p> </p> <p>Ex) CD .. ; 상위 폴더로 이동합니다.</p> <p> CD WORK ; WORK 폴더로 이동합니다.</p> <p> CD C:/T32/WORK ; 작업폴더를 C:/T32/WORK</p> <p> CD.DO C:/T32/Work/test.cmm ; test.cmm 파일이 위치한 폴더로 현재 작업 폴더를 변경하고 파일을 실행합니다.</p> <h3> DIR/LS</h3> <p><strong>DIR [PathName] </strong>; PathName이 없다면 현재 작업폴더의 내용을 보여 주며 있으면 Path내용을 보여줍니다.</p> <p><strong>LS[PathName] </strong>; PathName이 없다면 현재 작업폴더의 내용을 보여 주며 있으면 Path내용을 보여줍니다.</p> <p> </p> <h3> COPY/MV/REN</h3> <p><strong>COPY [SourceFile] [DestinationFile] </strong>; SourceFile을 DestinationFile로 Copy합니다.</p> <p>Ex) COPY /T32/old.t32 ./new.t32 ; 해당 path의 old.t32파일을 현재 path에 new.t32로 copy합니다.</p> <p> </p> <p><strong>MV [OldName] [NewName]</strong> ; OldName을 NewName으로 변경합니다.</p> <p>Ex) MV old.t32 new.t32 ; old.t32의 file이름을 new.t32로 변경합니다.</p> <p> </p> <p><strong>REN [OldName] [NewName]</strong> ; OldName을 NewName으로 변경합니다.</p> <p>Ex) REN old.t32 new.t32 ; old.t32의 file이름을 new.t32로 변경합니다.</p> <p> </p> <h3> DEL/RM</h3> <p><strong>DEL [FileName]</strong> ; FileName을 지웁니다.</p> <p><strong>RM [FileName] </strong> ; FileName을 지웁니다.</p> <p>Ex) DEL c:\t32\test.bak</p> <p>RM c:\t32\test.bak</p> <p> </p> <h3> EDIT</h3> <p><strong>EDIT [FileName] </strong> ; FileName을 text editor로 엽니다.</p> <p>Ex) edit text.txt ; text.txt파일과 함께 TRACE32에 text editor를 엽니다.</p> <p> </p> <h3> HISTory</h3> <p><strong>HISTory</strong> ; 그동안 사용했던 명령 History를 보여줍니다.</p> <p>그동안 사용했던 History 윈도우가 열린 후 List 중 원하는 명령에 더블클릭하면 해당 명령을 다시 실행하게 됩니다.</p> <p> </p> <h3> MKDIR</h3> <p><strong>MKDIR [PathName]</strong> ; PathName을 갖는 폴더를 만듧니다.</p> <p><strong>RMDIR [PathName]</strong> ; PathName을 갖는 폴더를 지웁니다. 해당 폴더는 비어 있어야 합니다.</p> <p>Ex) MKDIR SubDir ; SubDir이란 폴더를 만듧니다.</p> <p> RMDIR SubDir ; SubDir 폴더를 지웁니다.</p> <h3> QUIT</h3> <p>TRACE32 GUI(PowerView)를 닫습니다.</p> <p> </p> <h3> TITLE</h3> <p><strong>TITLE %String [”TitleName”]</strong> ; TRACE32 GUI title을 TitleName으로 변경합니다.</p> <p>Ex) TITLE %String "TRACE32 Debugger for CPU0" ; TRACE32 PowerView Title을 해당 String으로 변경합니다.</p>
디버깅 시 유용한 명령
문서로 돌아갑니다.
둘러보기 메뉴
개인 도구
로그인
이름공간
문서
토론
변수
보기
읽기
원본 보기
역사 보기
행위
검색
TRACE32 Dummy
TRACE32
iTSP User's Guide
aTSP User's Guide
Linux Debugging
Debugging Tips
Trace Analysis
Virtual Target
TRACE32로 바라본 ARM
TRACE32 FAQ
TRACE32 Trouble Shooting
TRACE32 Software Update
Software Revision History
DT10 / DT-Win
다운로드
DT10 Evaluation
DT-Win Evaluation
TestPoint 삽입 Error
Build Error
DT10 FAQ
도구
여기를 가리키는 문서
가리키는 글의 바뀜
특수 문서 목록
문서 정보