"디버깅 시 유용한 명령"의 두 판 사이의 차이
15번째 줄: | 15번째 줄: | ||
<p><span style="font-size: small;">Help 메뉴를 활용하여 문서를 찾아보거나 원하는 명령어나 함수를 검색 할 수 있다.</span></p> | <p><span style="font-size: small;">Help 메뉴를 활용하여 문서를 찾아보거나 원하는 명령어나 함수를 검색 할 수 있다.</span></p> | ||
<p><span style="font-size: small;">[Menu] -> [Help] -> [Index]</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=" | + | <p><img style="width: 589px; height: 548px;" src="/data/wiki/2015-02-16/1424072844.png" alt="" width="610" /></p> |
<p> </p> | <p> </p> | ||
<h1>practice Program(CMM script) 생성 및 기본</h1> | <h1>practice Program(CMM script) 생성 및 기본</h1> | ||
<h2>cmm script 생성 및 기존 cmm파일의 수정</h2> | <h2>cmm script 생성 및 기존 cmm파일의 수정</h2> | ||
<p>PEDIT <filename.cmm></p> | <p>PEDIT <filename.cmm></p> | ||
− | <p><img style="width: 277px; height: 81px;" src="/data/wiki/2015-02-17/1424138161.png" alt="" width=" | + | <p><img style="width: 277px; height: 81px;" src="/data/wiki/2015-02-17/1424138161.png" alt="" width="440" /></p> |
<p> </p> | <p> </p> | ||
<h2>cmm script 실행</h2> | <h2>cmm script 실행</h2> | ||
<h2>DO <filename.cmm></h2> | <h2>DO <filename.cmm></h2> | ||
− | <p><img src="/data/wiki/2015-02-17/1424138208.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424138208.png" alt="" width="440" /></p> |
<p> </p> | <p> </p> | ||
<h2>cmm script의 작성</h2> | <h2>cmm script의 작성</h2> | ||
<p>script의 시작은 B::으로 시작되고 ENDDO로 끝낸다</p> | <p>script의 시작은 B::으로 시작되고 ENDDO로 끝낸다</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424138310.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424138310.png" alt="" width="440" /></p> |
<p> </p> | <p> </p> | ||
<h2>주석 처리</h2> | <h2>주석 처리</h2> | ||
<p>주석 처리하려는 문장의 앞쪽에 ‘;’ 나 “//”를 사용 한다.</p> | <p>주석 처리하려는 문장의 앞쪽에 ‘;’ 나 “//”를 사용 한다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424138647.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424138647.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h2>파라미터 전달 및 리턴 값 처리</h2> | <h2>파라미터 전달 및 리턴 값 처리</h2> | ||
39번째 줄: | 39번째 줄: | ||
<p>리턴 값을 전달 해줄 경우는 스크립트가 종료되는 부분에 <ENDDO return1 return2 return2 …>와 같이 사용 하고 리턴 값을 받을 때는 ENTRY &pram1 &pram2 &pram3 …> 과같이 사용한다.</p> | <p>리턴 값을 전달 해줄 경우는 스크립트가 종료되는 부분에 <ENDDO return1 return2 return2 …>와 같이 사용 하고 리턴 값을 받을 때는 ENTRY &pram1 &pram2 &pram3 …> 과같이 사용한다.</p> | ||
<p>ex : test.cmm 을 실행 했을 때 결과</p> | <p>ex : test.cmm 을 실행 했을 때 결과</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424138966.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424138966.png" alt="" width="580" /></p> |
<p>String값을 파라미터로 넘길 때는 주의 해야 할 부분이 있다. 파라미터들의 구분을 공백으로 하기 때문에 String에 공백이 있을 경우 문제가 발생 될 수 있다.</p> | <p>String값을 파라미터로 넘길 때는 주의 해야 할 부분이 있다. 파라미터들의 구분을 공백으로 하기 때문에 String에 공백이 있을 경우 문제가 발생 될 수 있다.</p> | ||
<p>잘 못된 사용 예</p> | <p>잘 못된 사용 예</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424138984.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424138984.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p>올바른 사용 예(%LINE or “ “ 사용)</p> | <p>올바른 사용 예(%LINE or “ “ 사용)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424138996.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424138996.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h2>cmm 디버깅</h2> | <h2>cmm 디버깅</h2> | ||
51번째 줄: | 51번째 줄: | ||
<p>디버깅 하고자 하는 스크립트를 PEDIT 명령으로 열고 Debug 버튼을 누르면 step by step으로</p> | <p>디버깅 하고자 하는 스크립트를 PEDIT 명령으로 열고 Debug 버튼을 누르면 step by step으로</p> | ||
<p>스크립트를 수행 하면서 결과를 확인 하며 디버깅 할 수 있다.</p> | <p>스크립트를 수행 하면서 결과를 확인 하며 디버깅 할 수 있다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139006.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139006.png" alt="" width="580" /></p> |
− | <p><img src="/data/wiki/2015-02-17/1424139012.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139012.png" alt="" width="800" /></p> |
<p>step : 한 라인씩 수행</p> | <p>step : 한 라인씩 수행</p> | ||
<p>over : 다른 스크립트를 호출 하는 부분을 만날 경우 호출 할 스크립트를 모두 수행한다.</p> | <p>over : 다른 스크립트를 호출 하는 부분을 만날 경우 호출 할 스크립트를 모두 수행한다.</p> | ||
61번째 줄: | 61번째 줄: | ||
<p>Double click : 스크립트 디버깅 중 원하는 부분에 double click하면 break point를 셋팅 할 수 있다.</p> | <p>Double click : 스크립트 디버깅 중 원하는 부분에 double click하면 break point를 셋팅 할 수 있다.</p> | ||
<p>마우스 우클릭 : 팝업 메뉴 사용</p> | <p>마우스 우클릭 : 팝업 메뉴 사용</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139026.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139026.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h2>단축 명령어 와 대소문자 구분</h2> | <h2>단축 명령어 와 대소문자 구분</h2> | ||
72번째 줄: | 72번째 줄: | ||
<p>GOSUB를 사용할 경우 SUB 루틴에서는 반드시 RETURN을 해주어야 한다.</p> | <p>GOSUB를 사용할 경우 SUB 루틴에서는 반드시 RETURN을 해주어야 한다.</p> | ||
<p>RETURN이 되지 않는다면 stack underflow와 같은 에러가 발생 할 수 있다.</p> | <p>RETURN이 되지 않는다면 stack underflow와 같은 에러가 발생 할 수 있다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139040.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139040.png" alt="" width="440" /></p> |
<p> </p> | <p> </p> | ||
<h2>GOTO/JUMPTO</h2> | <h2>GOTO/JUMPTO</h2> | ||
78번째 줄: | 78번째 줄: | ||
<p>파라미터나 리턴값을 받을 수 없다.</p> | <p>파라미터나 리턴값을 받을 수 없다.</p> | ||
<p>ENDDO를 넣지 않으면 순차적으로 계속 해서 실행 되기 때문에 원하지 않는 명령어가 수행 될 수 있다.</p> | <p>ENDDO를 넣지 않으면 순차적으로 계속 해서 실행 되기 때문에 원하지 않는 명령어가 수행 될 수 있다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139051.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139051.png" alt="" width="800" /></p> |
<p><span style="white-space: pre;"> </span><GOTO 사용><span style="white-space: pre;"> </span><JUMPTO 사용> <span style="white-space: pre;"> </span> <잘못된 사용></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> | <p> </p> | ||
88번째 줄: | 88번째 줄: | ||
<p>한 문장 이상일 경우에는 괄호를 사용하여 블록으로 지정해야 한다.</p> | <p>한 문장 이상일 경우에는 괄호를 사용하여 블록으로 지정해야 한다.</p> | ||
<p>사용 : IF <Condition> , Var.IF <HLL Condition></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/1424139096.png" alt="" width="800" /></p> |
− | <p><img src="/data/wiki/2015-02-17/1424139110.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139110.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h2>WHILE, Var.WHILE</h2> | <h2>WHILE, Var.WHILE</h2> | ||
96번째 줄: | 96번째 줄: | ||
<p>조건을 지정하는 방법에 따라 while, repeat문이 구분되어 사용된다.</p> | <p>조건을 지정하는 방법에 따라 while, repeat문이 구분되어 사용된다.</p> | ||
<p>사용 : WHILE <Condition>, Var.WHILE <HLL Condition></p> | <p>사용 : WHILE <Condition>, Var.WHILE <HLL Condition></p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139123.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139123.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h2>REPEAT</h2> | <h2>REPEAT</h2> | ||
<p>C Language의 for{;;} 문과 동일한 기능으로 지정한 횟수를 반복 수행 한다.</p> | <p>C Language의 for{;;} 문과 동일한 기능으로 지정한 횟수를 반복 수행 한다.</p> | ||
<p>사용 : REPEAT <반복 횟수></p> | <p>사용 : REPEAT <반복 횟수></p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139138.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139138.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h1>변수/배열/구조체 사용</h1> | <h1>변수/배열/구조체 사용</h1> | ||
125번째 줄: | 125번째 줄: | ||
<p>Var.Set \Group_List[&i]=1. ;배열에 값 넣기</p> | <p>Var.Set \Group_List[&i]=1. ;배열에 값 넣기</p> | ||
<p>&value=Var.Value(\Group_List[&i])+0. ;배열에 있는 값 받아오기</p> | <p>&value=Var.Value(\Group_List[&i])+0. ;배열에 있는 값 받아오기</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139165.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139165.png" alt="" width="800" /></p> |
<p>PMACRO 명령을 통해 변수 값을 확인 해보면 생성한 배열에 값이 들어가 있는 것을 확인 할 수 있다.</p> | <p>PMACRO 명령을 통해 변수 값을 확인 해보면 생성한 배열에 값이 들어가 있는 것을 확인 할 수 있다.</p> | ||
<p> </p> | <p> </p> | ||
137번째 줄: | 137번째 줄: | ||
<p> </p> | <p> </p> | ||
<p>☞ 배열이나 구조체는 파라미터로 전달되지 않음!!!</p> | <p>☞ 배열이나 구조체는 파라미터로 전달되지 않음!!!</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139182.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139182.png" alt="" width="800" /></p> |
<p>PMACRO를 통해 구조체에 값이 저장되어 있는 것을 확인 할 수 있다.</p> | <p>PMACRO를 통해 구조체에 값이 저장되어 있는 것을 확인 할 수 있다.</p> | ||
<p> </p> | <p> </p> | ||
<h1>타겟에서 값 읽어 오기</h1> | <h1>타겟에서 값 읽어 오기</h1> | ||
<h2>심볼 주소 가져오기</h2> | <h2>심볼 주소 가져오기</h2> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139197.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139197.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p>ADDRESS.OFFSET(sunny) -> O ;sunny 변수의 주소 값을 리턴</p> | <p>ADDRESS.OFFSET(sunny) -> O ;sunny 변수의 주소 값을 리턴</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139205.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139205.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p>ADDRESS.OFFSET(sunny[3]) -> X ;HLL(High Level Language) 지원 하지 않음</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><img src="/data/wiki/2015-02-17/1424139262.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p>ADDRESS.OFFSET(V.ADDRESS(sunny)) -> O ;sunny 변수의 주소 값을 리턴</p> | <p>ADDRESS.OFFSET(V.ADDRESS(sunny)) -> O ;sunny 변수의 주소 값을 리턴</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139276.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139276.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p>ADDRESS.OFFSET(V.ADDRESS(sunny[3])) -> O ;sunny[3]의 주소값을 리턴</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><img src="/data/wiki/2015-02-17/1424139330.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<h2>심볼 섹터 주소 가져오기</h2> | <h2>심볼 섹터 주소 가져오기</h2> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139532.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139532.png" alt="" width="800" /></p> |
<p>시작 주소 : ADDRESS.OFFSET(sYmbol.SECADDRESS(\\u-boot\.text))</p> | <p>시작 주소 : ADDRESS.OFFSET(sYmbol.SECADDRESS(\\u-boot\.text))</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139542.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139542.png" alt="" width="580" /></p> |
<p>끝 주소 : ADDRESS.OFFSET(sYmbol.SECEND(\\u-boot\.text))</p> | <p>끝 주소 : ADDRESS.OFFSET(sYmbol.SECEND(\\u-boot\.text))</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139551.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139551.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h2>심볼의 사이즈 구하기</h2> | <h2>심볼의 사이즈 구하기</h2> | ||
<p>함수 : sYmbol.SIZEOF(again), 변수 : sYmbol.SIZEIF(sunny)</p> | <p>함수 : sYmbol.SIZEOF(again), 변수 : sYmbol.SIZEIF(sunny)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139565.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139565.png" alt="" width="800" /></p> |
<p>ADDRESS.OFFSET(sYmbol.END(sunny))-ADDRESS.OFFSET(sunny)+0x1</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><img src="/data/wiki/2015-02-17/1424139576.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h2>심볼의 값 가져오기</h2> | <h2>심볼의 값 가져오기</h2> | ||
<p>Var.Value(<변수명>)</p> | <p>Var.Value(<변수명>)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139589.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139589.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p>V.STRING(<변수명>)</p> | <p>V.STRING(<변수명>)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139602.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139602.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p>Data.STRING(<주소>)</p> | <p>Data.STRING(<주소>)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139611.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139611.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<p>이중 포인터의 경우 V.STRING(vppuchar[0]), V.STRING(*(vppuchar)) 형태로 사용</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/1424139627.png" alt="" width="580" /></p> |
− | <p><img src="/data/wiki/2015-02-17/1424139638.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139638.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p>&val=v.value(sunny[0]) -> O</p> | <p>&val=v.value(sunny[0]) -> O</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139648.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139648.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p>&val=v.value(sunny) -> X</p> | <p>&val=v.value(sunny) -> X</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139674.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139674.png" alt="" width="580" /></p> |
<p>sunny의 경우 배열이므로 sunny의 값은 배열의 시작 주소임, 그래서 이 경우에는 ADDRESS.OFFSET(sunny)와 값이 같음.</p> | <p>sunny의 경우 배열이므로 sunny의 값은 배열의 시작 주소임, 그래서 이 경우에는 ADDRESS.OFFSET(sunny)와 값이 같음.</p> | ||
<p> </p> | <p> </p> | ||
196번째 줄: | 196번째 줄: | ||
<p>general_func.pdf 참조</p> | <p>general_func.pdf 참조</p> | ||
<p>val=Data.BYTE(sunny), &val=Data.BYTE(V.ADDRESS(sunny[3]))</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><img src="/data/wiki/2015-02-17/1424139691.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p>&string=Data.STRING(<ADDRESS>)</p> | <p>&string=Data.STRING(<ADDRESS>)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139709.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139709.png" alt="" width="800" /></p> |
<p>변수를 이용하지 않고 주소를 직접 접근해 값을 가져오는 것은 메모리 클래스를 이용해야 한다.</p> | <p>변수를 이용하지 않고 주소를 직접 접근해 값을 가져오는 것은 메모리 클래스를 이용해야 한다.</p> | ||
<p><SD:> - 가상주소를 이용한 cache가 반영된 값</p> | <p><SD:> - 가상주소를 이용한 cache가 반영된 값</p> | ||
235번째 줄: | 235번째 줄: | ||
<p>Var.Set %Decimal sunny[1]=1.</p> | <p>Var.Set %Decimal sunny[1]=1.</p> | ||
<p>Var.Set %String <변수>=”string”</p> | <p>Var.Set %String <변수>=”string”</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424139873.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424139873.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h2>주소에 값 쓰기</h2> | <h2>주소에 값 쓰기</h2> | ||
<p>사용자가 지정한 ADDRESS 또는 ADDRESS range에 값을 wirte하는 명령이다.</p> | <p>사용자가 지정한 ADDRESS 또는 ADDRESS range에 값을 wirte하는 명령이다.</p> | ||
<p>Data.Set 0xC0000000 "hello world" 0x0 ; set string to memory</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><img src="/data/wiki/2015-02-17/1424141819.png" alt="" width="800" /></p> |
<p>Data.Set 0xC0000000 %Long 0x12345678 ; write long word</p> | <p>Data.Set 0xC0000000 %Long 0x12345678 ; write long word</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141830.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141830.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p>Data.Set 0xC0000000--0xC00000FF %Long 0x0 ; init memory with 0</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> | + | <p><img src="/data/wiki/2015-02-17/1424141840.png" alt="" width="800" /></p> |
<h2>레지스터에 값 쓰기</h2> | <h2>레지스터에 값 쓰기</h2> | ||
<p>레지스터에 값을 쓰는 명령이다. </p> | <p>레지스터에 값을 쓰는 명령이다. </p> | ||
<p>Register.Set r0 0xFFFFFFFF ;R0 레지스터에 0xFFFFFFFF 값을 입력</p> | <p>Register.Set r0 0xFFFFFFFF ;R0 레지스터에 0xFFFFFFFF 값을 입력</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141850.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141850.png" alt="" width="800" /></p> |
<p>Register.Set pc 0xC0008000 ;PC 레지스터에 0xC0008000 값을 입력</p> | <p>Register.Set pc 0xC0008000 ;PC 레지스터에 0xC0008000 값을 입력</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141860.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141860.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<p>Register.Set R14_USR 0xADADADAD ;User mode의 R14 레지스터에 0xADADADAD 값 입력</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><img src="/data/wiki/2015-02-17/1424141870.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<h2>바이너리 파일을 메모리에 로드</h2> | <h2>바이너리 파일을 메모리에 로드</h2> | ||
<p>Data.LOAD.Binary test.bin 0xC0000000 ;test.bin 파일을 0xC0000000주소에 로드</p> | <p>Data.LOAD.Binary test.bin 0xC0000000 ;test.bin 파일을 0xC0000000주소에 로드</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141882.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141882.png" alt="" width="800" /></p> |
<p>Data.LOAD.Binary test.bin 0xC0000000 /Compare ;test.bin 파일과 0xC0000000주소에 있는 값을 비교만 하고 로드 하지는 않는다. 만약 비교해서 다르면 비교를 중단하고 에러를 주소값과 함께 출력 한다.</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><img src="/data/wiki/2015-02-17/1424141904.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h1>String 처리</h1> | <h1>String 처리</h1> | ||
<h2>String 전달</h2> | <h2>String 전달</h2> | ||
<p>String 값을 우변에서 좌변으로 전달 할 경우 “”로 감싸야 함</p> | <p>String 값을 우변에서 좌변으로 전달 할 경우 “”로 감싸야 함</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141918.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141918.png" alt="" width="800" /></p> |
<p><span style="white-space: pre;"> </span><잘못된 사용> <span style="white-space: pre;"> </span> <올바른 사용></p> | <p><span style="white-space: pre;"> </span><잘못된 사용> <span style="white-space: pre;"> </span> <올바른 사용></p> | ||
<p> </p> | <p> </p> | ||
275번째 줄: | 275번째 줄: | ||
<h3>STRING.CHAR(<string>,<index>)</h3> | <h3>STRING.CHAR(<string>,<index>)</h3> | ||
<p>문자열에서 지정한 위치의 문자 값을 Hex값으로 출력 한다.</p> | <p>문자열에서 지정한 위치의 문자 값을 Hex값으로 출력 한다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141945.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141945.png" alt="" width="440" /></p> |
<p> </p> | <p> </p> | ||
<p>문자열에서 지정한 위치의 index값이 없을 경우 -1을 리턴 한다.</p> | <p>문자열에서 지정한 위치의 index값이 없을 경우 -1을 리턴 한다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141954.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141954.png" alt="" width="440" /></p> |
<p> </p> | <p> </p> | ||
<h3>STRING.CUT(<string>,<len>)</h3> | <h3>STRING.CUT(<string>,<len>)</h3> | ||
<p>문자열의 처음부터 지정한 개수 만큼 잘라낸다.</p> | <p>문자열의 처음부터 지정한 개수 만큼 잘라낸다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141972.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141972.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h3>STRING.FIND(<string1>,<string2>)</h3> | <h3>STRING.FIND(<string1>,<string2>)</h3> | ||
<p>두 개의 문자열중 같은 문자가 있는지 체크하여 결과 값을 리턴 한다</p> | <p>두 개의 문자열중 같은 문자가 있는지 체크하여 결과 값을 리턴 한다</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424141984.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424141984.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<h3>STRING.LEN(<string>)</h3> | <h3>STRING.LEN(<string>)</h3> | ||
<p>문자열의 길이를 리턴 한다.</p> | <p>문자열의 길이를 리턴 한다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142007.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142007.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h3>STRING.MID(<string>,<start_at>,<len>)</h3> | <h3>STRING.MID(<string>,<start_at>,<len>)</h3> | ||
<p>문자열의 지정한 위치부터 지정한 개수만큼 잘라낸다.</p> | <p>문자열의 지정한 위치부터 지정한 개수만큼 잘라낸다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142017.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142017.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<h3>STRING.SCAN(<string>,<string2>,<start_at>)</h3> | <h3>STRING.SCAN(<string>,<string2>,<start_at>)</h3> | ||
<p>문자열을 scan하여 <string2> 가 있는 위치를 리턴 한다.</p> | <p>문자열을 scan하여 <string2> 가 있는 위치를 리턴 한다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142028.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142028.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h2>사용 예</h2> | <h2>사용 예</h2> | ||
306번째 줄: | 306번째 줄: | ||
<p>os.file.path(<file dir>) ; 파일이 있는 디렉토리를 리턴</p> | <p>os.file.path(<file dir>) ; 파일이 있는 디렉토리를 리턴</p> | ||
<p>os.pwd() ; 현재 작업중인 디렉토리를 리턴</p> | <p>os.pwd() ; 현재 작업중인 디렉토리를 리턴</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142040.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142040.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h1>Type 변환</h1> | <h1>Type 변환</h1> | ||
315번째 줄: | 315번째 줄: | ||
<p>FORMAT.HEX(<width>,<number>) ; 16진수로 변환</p> | <p>FORMAT.HEX(<width>,<number>) ; 16진수로 변환</p> | ||
<p>FORMAT.UDECIMAL(<width>,<number>) ; unsigned 10진수로 변환</p> | <p>FORMAT.UDECIMAL(<width>,<number>) ; unsigned 10진수로 변환</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142052.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142052.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p>CONV.CHAR(<<em>value</em>>) ;value 값을 char형으로 convert</p> | <p>CONV.CHAR(<<em>value</em>>) ;value 값을 char형으로 convert</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142061.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142061.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<p>CONV.BOOLTOINT(<<em>bool</em>>) ;<boo>형 data를 0과 1로 convert</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><img src="/data/wiki/2015-02-17/1424142072.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p>CONV.FLOATTOINT(<<em>float</em>>) ;<float> 값을 integer값으로 convert</p> | <p>CONV.FLOATTOINT(<<em>float</em>>) ;<float> 값을 integer값으로 convert</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142081.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142081.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<p>CONV.INTTOMASK(<<em>value</em>>,<<em>mask</em>>) ;value에서 mask값에 해당하는 bit를 x 표시</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><img src="/data/wiki/2015-02-17/1424142092.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p>CONV.MASKMTOINT(<<em>value</em>>) ;MASK part를 integer값으로 변환</p> | <p>CONV.MASKMTOINT(<<em>value</em>>) ;MASK part를 integer값으로 변환</p> | ||
<p>CONV.MASKTOINT(<<em>value</em>>) ;VALUE 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><img src="/data/wiki/2015-02-17/1424142100.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
339번째 줄: | 339번째 줄: | ||
<p>CONV.SignedLong(<<em>value</em>>)</p> | <p>CONV.SignedLong(<<em>value</em>>)</p> | ||
<p>CONV.SignedWord(<<em>value</em>>)</p> | <p>CONV.SignedWord(<<em>value</em>>)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142110.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142110.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h2>자동 형 변환</h2> | <h2>자동 형 변환</h2> | ||
<p>더하기(+)연산을 통한 자동 형 변환</p> | <p>더하기(+)연산을 통한 자동 형 변환</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142122.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142122.png" alt="" width="580" /></p> |
<p> </p> | <p> </p> | ||
<h1>Dialog box(TRACE32 GUI Programming)</h1> | <h1>Dialog box(TRACE32 GUI Programming)</h1> | ||
<p>CMM 스크립트를 이용하여 사용자 GUI환경을 꾸밀 수가 있다. Ide_ref.pdf 파일에서 DIALOG부분을 보면 예제 cmm과 DIALOG에서 만들 수 있는 객체들을 확인 할 수 있다.</p> | <p>CMM 스크립트를 이용하여 사용자 GUI환경을 꾸밀 수가 있다. Ide_ref.pdf 파일에서 DIALOG부분을 보면 예제 cmm과 DIALOG에서 만들 수 있는 객체들을 확인 할 수 있다.</p> | ||
<p>DIALOG 예)</p> | <p>DIALOG 예)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142132.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142132.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h1>I/O 명령어</h1> | <h1>I/O 명령어</h1> | ||
369번째 줄: | 369번째 줄: | ||
<p>파일에 있는 데이터를 read</p> | <p>파일에 있는 데이터를 read</p> | ||
<p>사용 예) read_exam.cmm 실행하면 test.cmm 파일을 읽어와서 area window에 출력</p> | <p>사용 예) read_exam.cmm 실행하면 test.cmm 파일을 읽어와서 area window에 출력</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142151.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142151.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h3>file write</h3> | <h3>file write</h3> | ||
<p>파일에 원하는 data를 write</p> | <p>파일에 원하는 data를 write</p> | ||
<p>사용 예) test.cmm 파일에서 읽어온 data를 test2.cmm에 write</p> | <p>사용 예) test.cmm 파일에서 읽어온 data를 test2.cmm에 write</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142160.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142160.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h1>Event Control(On command)</h1> | <h1>Event Control(On command)</h1> | ||
393번째 줄: | 393번째 줄: | ||
<h2>Event 활용</h2> | <h2>Event 활용</h2> | ||
<p>사용 예) Oncommand를 활용한 Event처리</p> | <p>사용 예) Oncommand를 활용한 Event처리</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142173.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142173.png" alt="" width="440" /></p> |
<h1>기타</h1> | <h1>기타</h1> | ||
<h2>change directory</h2> | <h2>change directory</h2> | ||
400번째 줄: | 400번째 줄: | ||
<p>CD ..\ ;상위 디렉토리로 이동</p> | <p>CD ..\ ;상위 디렉토리로 이동</p> | ||
<p>CD ~\ ;home 디렉토리로 이동</p> | <p>CD ~\ ;home 디렉토리로 이동</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142183.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142183.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h2>사용자 메뉴 구성</h2> | <h2>사용자 메뉴 구성</h2> | ||
<p>사용자가 임의대로 TRACE32 SW의 메뉴나 툴바를 추가 수정 할 수 있다.</p> | <p>사용자가 임의대로 TRACE32 SW의 메뉴나 툴바를 추가 수정 할 수 있다.</p> | ||
<p>사용 예)</p> | <p>사용 예)</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142193.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142193.png" alt="" width="580" /></p> |
<p>위 cmm을 실행하면 아래와 같이 메뉴와 툴바가 추가 된다.</p> | <p>위 cmm을 실행하면 아래와 같이 메뉴와 툴바가 추가 된다.</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142203.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142203.png" alt="" width="580" /></p> |
<h2>cmm에서 함수 호출 하기</h2> | <h2>cmm에서 함수 호출 하기</h2> | ||
<p>TRACE32에서 타겟의 함수를 호출 하여 실행 할 수 있다. 이 기능을 이용하면 실제 타겟기반으로 파라미터를 변경해가면서 함수를 테스트 해볼 수 있다.</p> | <p>TRACE32에서 타겟의 함수를 호출 하여 실행 할 수 있다. 이 기능을 이용하면 실제 타겟기반으로 파라미터를 변경해가면서 함수를 테스트 해볼 수 있다.</p> | ||
413번째 줄: | 413번째 줄: | ||
<p>v (<function name>)(parameter)</p> | <p>v (<function name>)(parameter)</p> | ||
<p>호출 되기 전</p> | <p>호출 되기 전</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142214.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142214.png" alt="" width="800" /></p> |
<p>호출 후 결과</p> | <p>호출 후 결과</p> | ||
− | <p><img src="/data/wiki/2015-02-17/1424142224.png" alt="" /></p> | + | <p><img src="/data/wiki/2015-02-17/1424142224.png" alt="" width="800" /></p> |
<p> </p> | <p> </p> | ||
<h2>TRACE32 prompt 에서 사용 가능한 OS 명령</h2> | <h2>TRACE32 prompt 에서 사용 가능한 OS 명령</h2> |
2015년 4월 23일 (목) 14:24 기준 최신판
목차
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가 반영되지 않는 값
레지스터의 값 가져오기
®_0=R(R0) ; 레지스터 R0의 값을 저장
®_pc=R(PC) ; 레지스터 PC의 값을 저장
®_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으로 변경합니다.