5주차-AURIX(4)

Chan·2021년 5월 13일
0

hancom

목록 보기
4/45

Trace32 사용법

  • F3 누르면 정의 보러감
  • 디버깅 과정
  1. TASKING에서 MISAR-C에 맞춰 C언어 코드 작성하고 빌드
  2. T32 들어가서 CPU셋팅, On하고 load file (코드 들어있는 플젝파일 - debug - 소스코드.elf)
  3. register 창이랑 sourcelist 창 키고 커맨드에 go main
  4. var - format 에서 Dec, Hex, Index, Type, Loc, E, Spotlight
  5. sourcelist에서 step 누르면서 레지스터 값 확인
  6. 구간 반복하려면 더블클릭으로 call 부분에 브레이크 포인트 잡고 go

MISRA-C

typedef unsigned int uint32_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef signed char int8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;

extern void MovTest(void);
extern void AddTest(void);
extern void SubTest(void);
extern void MulTest(void);
extern void MaddTest(void);
extern void DivTest(void);
extern void AndTest(void);
extern void OrTest(void);
extern void XorTest(void);
extern void ShTest(void);
extern void ShaTest(void);
extern void ExtrTest(void);
extern void InsertTest(void);
extern void CmpTest(void);
extern void LdTest(void);
extern void StTest(void);
extern void LeaTest(void);
extern void AddscTest(void);
extern void JumpTest(void);
extern void LoopTest(void);
extern void CallTest(void);
extern void Test(void);

int32_t main(void)
{
	volatile uint32_t i = 0x12345678u;
	volatile uint32_t tmp = 0u;

	for(;;)
	{
		i++;

		MovTest();
		AddTest();
		SubTest();
		MulTest();
		MaddTest();
		DivTest();
		AndTest();
		OrTest();
		XorTest();
		ShTest();
		ShaTest();
		ExtrTest();
		InsertTest();
		CmpTest();
		LdTest();
		StTest();
		LeaTest();
		AddscTest();
		JumpTest();
		LoopTest();
		CallTest();
		Test();

		for(i = 0u; i <= 100; i++){
			tmp += i;
		}
	}

	/*return 0;*/
}

어셈블리어

  • 어셈블리 코드 형식


    1FFFF0BB 해석: 형식에 따라 분리해서 봄, 1, FFFF, 0, BB
    d'1'에 'FFFF'값을 넣음, '0'은 reserved(안씀), 'BB'로 명령어 식별하는듯?

  • 어셈블리 문법 예제

mov d1, d2 // d1 = d2;
mov d1, #6 // d1 = sign_ext(const6);

add d3, d1, d2 // result = d1+d2, d3 = result[31:0];
add d1, d2 // result = d1+d2, d1 = result[31:0];
add d1, #6 // result = d1+sign_ext(const6), d1 = result[31:0];

sub d3, d1, d2 // result = d1-d2, d3 = result[31:0];
sub d1, d2 // result = d1-d2, d1 = result[31:0];
sub d1, #6 // result = d1-sign_ext(const6), d1 = result[31:0];

mul, div도 마찬가지,

MOV : move
MOV.A : move value to address register
MOV.AA : move address to address register
MOV.D : move address to data register
MOV.U : move unsigned
ADD.A : add address
ADD.B, ADD.F 등 다양한 형식은 메뉴얼보고 파악
mov16처럼 뒤에 16붙은건 16비트

int i = 0;
int result = 0;
for (i=1; i <=100; i++)
{
	result = result + i;
}
result 값을 0x70001000 메모리에 저장하기
제출은 공유 - asm 폴더에, 이름.asm
----------------> assembly language?

Test: .type func
    	mov d1, #0  // int i = 0
	mov d2, #0  // int result = 0

	j 1n
1:
	add d1, #1 // i++
	add d2, d1 // result += i
	j 2n
2:
	jlt d1, #100, 1p  // i<100일 때, label 1로 돌아감
    // 근데 포맷이 4비트 써서 -8~7 밖에 안됌
	
    	ret
-------------------------------------
Test: .type func
	mov a0, #100  // 마찬가지로 포맷이 4비트 써서 0~F 밖에 안들어감
	mov d1, #0
	mov d2, #0
1:
	add d1, #1
	add d2, d2, d1
	loop a0, 1p

	ret
-------------------------------------
Test: .type func
	mov d0, #100  // 해결법, d0에 100을 써서 a0에 쓴다.
	mov.a a0, d0
	mov d1, #0
	mov d2, #0
1:
	add d1, #1
	add d2, d2, d1
	loop a0, 1p

	ret
// 근데 디버깅할 때 call이 안불림..
----------------------------------------

LeaTest: .type func
	movh.a	a15, #8000 // a15이 보는 주소: 8000 0000 (뒤에 4자리 0 채움)
	lea	a0, [a15]0x24 // a0이 보는 주소: a15 주소 + 24

	ld.a a0, [a0] // a0이 보는 주소: [a0] 주소에 들어있는 값 7010 0000

	lea a0, [a0]0x4 // a0이 보는 주소: a0 + 4 = 7010 0004
	lea a1, [a0]0x4 // a1이 보는 주소: a0 + 4 = 7010 0008

	mov d1, #0xFFF // d1에 0FFF 저장

	st.w [a0], d1 // a0 주소에 d1 값 저장
	ld.w d2, [a0] // d2에 a0 주소에 있는 값 불러오기

	ret
-------------------------------------------

Test: .type func
	mov d0, #99
	mov.a a0, d0
	mov d1, #0
	mov d2, #0
1:
	add d1, #1
	add d2, d1
	loop a0, 1p

	movh.a a1, #0x7000
	mov d3, #0x1000
	mov.a a2, d3
	add.a a1, a2

	st.w [a1], d2
	ld.w d4, [a1]
	ret
  • step : F2 꾹 눌러도 됌
    -결과-

라우터바흐 디버거 사용법

  • Peripheral - SWS(주자료), SRS(보조자료) 보면서 AUTOSAR에 맞게 코딩 가능
  • 라우터바흐 디버거 가지고 디버깅 하는법
  1. T32 - config32 가서 sim 지우고 usb로 설정
  2. 회로 준비 (간단한 led-스위치 회로, led 다리긴쪽이 anode(+), TC275TP 보드 VCC, 47번핀)
  3. 보드 전원 안 넣은채로 디버거 연결 (전원부 옆에 10핀짜리 꽂기, 빨간색-1번), 다 연결하고 보드 전원 넣기
  4. T32 들어가서 (에러나는 경우 장치관리자 확인) CPU셋팅, CONFIG - DebugPort - DebugPortType DAP2 설정하고 UP -> System ready 상태
  5. 커맨드창 per - (peripheral 메모리 설정 창) - GPIO Port11 - PC6 오른쪽 클릭해서 Output/Push-Pull/GPO 상태로 설정 - P6 Low/High 클릭으로 상태 변경하면서 led 점등 확인
profile
Backend Web Developer

0개의 댓글

관련 채용 정보