디버거 없을 때는 시뮬레이션 환경에서도 제한적으로 확인 가능
C드라이브 - T32 - config.t32 - PBI=SIM이랑 USB 앞에 ;(주석처리)
T32 - bin - windows - t32mtc.exe (시뮬 디버거 실행) - 웰컴 꺼도됌 (그 전에 T32 파일에 Temp 파일 만들어주기)
보드 CPU 종류 확인(TC275TP) - 디버거 프로그램에서 스패너 아이콘 클릭 - CPU 종류 변경(TC275TP) - UP mode 하고 sourcelist, regiser창 키기
디버거 프로그램 - File - load file - C드라이브 - Workspace_Aurix - myproject - debug - myproject.elf 클릭
B:: (커맨드 창)에다가 go main 치면 main 함수로 감
안되는 사람들 있으면 공유폴더에 myproject.zip 파일 다운받아서 대체 사용 - myproject delete - delete 빈칸 체크 - ...import - select archive file - myproject.zip 압축푼거에서 myproject.elf 다시 선택
TASKING 에서 우클릭 - Preferences - General - Editors - Text editors - show line numbers - Trace 32 디버거 창에서 라인 넘버 뜸
sourcelist 창에서 step 누르면 단계별로 실행 과정 알 수 있음 (JTAG 디버깅 모드)
다른코드 디버깅 - for문 아래 생략됌, 보려면?
myproject 오른쪽 클릭 - properties - c/c++ build - settings - c/c++ compiler 에 optimization 들어가서 level 2->0으로 변경
다시 빌드하고 디버깅
나타났고, var - setting 에서 decimal, hex, index, type, location, e, spotlight 체크
var - show watch 가서 rtn 검색해보면 rtn=? 뜸
TASKING main에서 volatile int rtn 으로 바꾸면 rtn ? 안뜨고 설명 뜸 (volatile 변수는 최적화 제외하고 메모리에 접근)
어셈블리 설명
sub a10,#8 (아래와 같음)
a10 = a10 - 8 // 0x0~0xfffffff 있을 때 -8바이트는 stack이 쌓이는 것, a10이 0x70008FF9에 있었다면 0x70008FF8으로 스택포인터가 이동
mov d15,#0
d15 = 0 저장
st [a10]0x0,d15
a10 주소(0x50005000)에다가 d15 값을 저장
[]는 주소, 0x0 은 offset 의미
Memory Dump 아이콘 클릭
rtn 검색하면 0x70008FF8 뜸, list 창 Step 누르면서 st단계 직후에서 주소에 들어있는 0->12로 값 바뀜, 또 Step 누르면서 레지스터 뷰 창에서 레지스터 상태 바뀌는 거 확인 가능, 그리고 레지스터 값이나 주소 안의 값은 더블클릭해서 내 맘대로 수정 가능
메뉴바 - TC27xT - pcx(previous context), fcx(free context)
fcx는 다음에 일어날 명령 주소 저장하는 레지스터 ?
pcx는 변경되기 전 주소 가지고 있는 레지스터 ?
아까 optimization 들간것처럼 MISRA-C 들가기 - Disabled-> All Supported Rules (MISRA-C Rule에 안맞으면 빌드 불가)
MISRA-C 실행 오류 해결하려면, properties - preprocessing - automatic inclusion of '.sfr' file
실행되면 길이가 있는 데이터 타입은 다 typedef 로 선언하여 사용
main에서는 volatile int8_t a=10; 이런식으로 사용
빌드 후 Trace32에서 load - go main 후 확인할 변수 a 우클릭해서 memory dump? 들어가기, 들어가서 어떻게 들어갔나 값 확인
properties - language - treat 'char' variables as unsigned
-120 -> 0x88u
폰노이만 / 하버드 구조
CISC / RISC
파이프라인 / 슈퍼스칼라
빅엔디안 / 리틀엔디안
zero Overhead Loop
Load & Store
주요 레지스터 종류
MISRA-C (Motor Industry Software Reliability Association)
unsigned int / int 랑 만나면?
unsigned로 형변환, 예를 들어, 아래 if문에서 10>-1이 아니라 10>42억이라 else 문이 실행됌
volatile uint32_t A = (uint32_t) 10;
volatile uint32_t B = 10u;
volatile int32_t C = -1;
if (A>C)
{
B = 0u;
}
else
{
B = 1u;
}
char / signed char / unsigned char의 차이?