5주차-AURIX(2)

Chan·2021년 5월 11일
0

hancom

목록 보기
2/45

디버거 없을 때는 시뮬레이션 환경에서도 제한적으로 확인 가능

Trace32(디버깅 툴) 사용법

  1. C드라이브 - T32 - config.t32 - PBI=SIM이랑 USB 앞에 ;(주석처리)

  2. T32 - bin - windows - t32mtc.exe (시뮬 디버거 실행) - 웰컴 꺼도됌 (그 전에 T32 파일에 Temp 파일 만들어주기)

  3. 보드 CPU 종류 확인(TC275TP) - 디버거 프로그램에서 스패너 아이콘 클릭 - CPU 종류 변경(TC275TP) - UP mode 하고 sourcelist, regiser창 키기

  4. 디버거 프로그램 - File - load file - C드라이브 - Workspace_Aurix - myproject - debug - myproject.elf 클릭

  5. B:: (커맨드 창)에다가 go main 치면 main 함수로 감

  6. 안되는 사람들 있으면 공유폴더에 myproject.zip 파일 다운받아서 대체 사용 - myproject delete - delete 빈칸 체크 - ...import - select archive file - myproject.zip 압축푼거에서 myproject.elf 다시 선택

  7. TASKING 에서 우클릭 - Preferences - General - Editors - Text editors - show line numbers - Trace 32 디버거 창에서 라인 넘버 뜸

  8. sourcelist 창에서 step 누르면 단계별로 실행 과정 알 수 있음 (JTAG 디버깅 모드)

  9. 다른코드 디버깅 - for문 아래 생략됌, 보려면?

  10. myproject 오른쪽 클릭 - properties - c/c++ build - settings - c/c++ compiler 에 optimization 들어가서 level 2->0으로 변경

  11. 다시 빌드하고 디버깅

  12. 나타났고, var - setting 에서 decimal, hex, index, type, location, e, spotlight 체크

  13. var - show watch 가서 rtn 검색해보면 rtn=? 뜸

  14. TASKING main에서 volatile int rtn 으로 바꾸면 rtn ? 안뜨고 설명 뜸 (volatile 변수는 최적화 제외하고 메모리에 접근)

  15. 어셈블리 설명
    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 의미

  1. Memory Dump 아이콘 클릭
    rtn 검색하면 0x70008FF8 뜸, list 창 Step 누르면서 st단계 직후에서 주소에 들어있는 0->12로 값 바뀜, 또 Step 누르면서 레지스터 뷰 창에서 레지스터 상태 바뀌는 거 확인 가능, 그리고 레지스터 값이나 주소 안의 값은 더블클릭해서 내 맘대로 수정 가능

  2. 메뉴바 - TC27xT - pcx(previous context), fcx(free context)
    fcx는 다음에 일어날 명령 주소 저장하는 레지스터 ?
    pcx는 변경되기 전 주소 가지고 있는 레지스터 ?

  3. 아까 optimization 들간것처럼 MISRA-C 들가기 - Disabled-> All Supported Rules (MISRA-C Rule에 안맞으면 빌드 불가)

  4. MISRA-C 실행 오류 해결하려면, properties - preprocessing - automatic inclusion of '.sfr' file
    실행되면 길이가 있는 데이터 타입은 다 typedef 로 선언하여 사용
    main에서는 volatile int8_t a=10; 이런식으로 사용
    빌드 후 Trace32에서 load - go main 후 확인할 변수 a 우클릭해서 memory dump? 들어가기, 들어가서 어떻게 들어갔나 값 확인

  5. properties - language - treat 'char' variables as unsigned

-120 -> 0x88u

필기

  • 폰노이만 / 하버드 구조

    • 폰노이만 구조는 명령어, 데이터가 버스 동시에 사용 불가
    • 하버드 구조는 명령어, 데이터가 버스 동시에 사용 가능
  • CISC / RISC

    • CISC는 명령어 세트 복잡한 프로세서, 호환성 좋음
    • RISC는 명령어 세트 감소한 프로세서, 속도 빠름
  • 파이프라인 / 슈퍼스칼라

    • 파이프라인은 명령어 단계를 나누고 서로 다른 명령들을 중첩 실행
    • 슈퍼스칼라는 여러 개의 파이프 라인을 두어 명령어를 동시에 실행
  • 빅엔디안 / 리틀엔디안

    • 빅엔디안은 상위 바이트를 하위 주소에 저장
    • 리틀엔디안은 상위 바이트를 상위 주소에 저장
    • ex) 0x12345678 저장할 때,
  • zero Overhead Loop

    • 파이프라인에서 끝부분 버리는 거 생기는데 이를 오버헤드 루프라고 함
    • 위와 같은 버블이 생기지 않게 분기 예측을 통해 이를 없앰 - zero 오버헤드 루프
  • Load & Store

    • modern risc 머신에서 메모리 접근 명령어는 단 2개, load & store
  • 주요 레지스터 종류

  • MISRA-C (Motor Industry Software Reliability Association)

    • C언어의 표준에 모호한 표현이 존재하여 해석 방식에 따라 컴파일러 구현 이 달라 실행되는 코드가 다르게 나타나는걸 방지하기 위해 모호성을 최소화한 MISRA-C라는 코딩 룰 등장
    • 표준보다 컴파일 에러 기준이 더 엄격함 (goto, union 문법 금지, 강제형변환 금지- typedef 사용, floating point == 비교 금지, // 사용 안되고 /* */만 가능 등등
    • 자동차 임베디드는 사람의 목숨과 관련된 Critical한 프로그램이기 때문에 코딩 작성 기준이 더 엄격함
  • 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의 차이?

    • 정확히 구분..
profile
Backend Web Developer

0개의 댓글

Powered by GraphCDN, the GraphQL CDN