2017-02-26 3 views
0

ARM Cortex-M3 베어 메탈에서 컴파일 된 프로그램을 실행하려고합니다. 시스템이 응용 프로그램 코드에 도달하기 전에 홀수 오류가 발생하면 프로그램 카운터가 사라지고 오류가 발생합니다.LDMIA 명령어로 인해 레지스터 데이터가 손상됩니다.

는 명령 전에 레지스터 것으로 관찰된다

r0    0x0 0 
r1    0x1 1 
r2    0x0 0 
r3    0x2 2 
r4    0x18564 99684 
r5    0x18418 99352 
r6    0x0 0 
r7    0x0 0 
r8    0x8311 33553 
r9    0x0 0 
r10   0x0 0 
r11   0x0 0 
r12   0xc84404 13124612 
sp    0x7ffe0 0x7ffe0 
lr    0x80df 32991 
pc    0x8380 0x8380 

다음 명령이 실행된다 명목상 :

0x829c <__call_exitprocs+112>: ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} 

그리고 레지스터 폭발 판독된다. 또한 프로그램 카운터를 끄고 효과적으로 프로그램을 종료합니다.

... 
r3    0x2 2 
r4    0xffffffff 4294967295 
r5    0xffffffff 4294967295 
r6    0xffffffff 4294967295 
r7    0xffffffff 4294967295 
r8    0xffffffff 4294967295 
r9    0xffffffff 4294967295 
r10   0xffffffff 4294967295 
r11   0x0 0 
... 
pc    0xfffffffe 0xfffffffe 

나는 a similar issue on stack overfflow을 읽었습니다,하지만 내가 여기에 직면하고있어 직접적인 문제가 될 것 같지 않습니다. The ATMEL documentation for this board은 한 번에 읽을 수있는 내부 레지스터 수에 대한 제한을 지정하지 않습니다.

문제에 대한 의견 및 가능한 경우 gcc의 문제를 예방하는 방법은 무엇입니까?

+0

'ldmia'가 스택에서로드되고 스택에 무엇이 있는지 표시하지 않았습니다. 스택의 데이터가 손상되면 명령이 제대로 작동 할 수 있습니다. – Jester

+0

thumb 명령은 많은 레지스터를 허용하지 않지만 thumb2 (armv7m) 확장은 허용합니다. 디스어셈블러는 텍스트가 무엇인지 가정하고 그렇지 않으면 모든 레지스터를 보여주지 않을 것입니다. 그리고 당신이 스스로 지적했듯이, PC가 나쁘다. 그래서 ldmia가 pc를 수정하고있다. Jester가 지적한 pc가 아마 스택에 좋지 않을 것이다. 명령 앞에 스택을 덤프하고 무엇이 들어 있는지 확인하십시오. –

+0

명령어 앞에 'sp 0x7ffe0' 만 중요합니다. 왜 다른 레지스터를 게시했는지 확신 할 수 없습니다. 대신에 "stmia"를 쌓아 올리기를 원하지 않았습니까? 그렇지 않다면, 앞의 코드는 이미 충분한 값을 스택에 넣어야합니다. – Ped7g

답변

2

지침 (및 그 효과)이 정확합니다. 그러나 sp보다이 명령은 절대적으로 잘못되었습니다. 칩에 해당 주소에 RAM 메모리가 없습니다. 실제로 -이 주소에는 메모리가 전혀 없을 것입니다. 설명서의 32 페이지 (메모리 맵 포함)를 참조하십시오.

http://www.atmel.com/Images/Atmel-6430-32-bit-Cortex-M3-Microcontroller-SAM3U4-SAM3U2-SAM3U1_Datasheet.pdf

귀하의 sp는 SRAM 내 어딘가에 있어야한다 0x20000000 위 그래서. 가지고있는 값은 0x7ffe0이며 "부트 메모리"영역에 있습니다. 문제를 찾으려면 sp에 잘못된 값이있는 이유를 알아보십시오.