임베디드/임베디드 레시피

Data Abort

twoweeks-within 2025. 1. 18. 16:35

 

Abort .. 는 원인찾ㄱ기가 쉬운편

 

system에 Abort 

  > Abort Vector 에 break 걸어놓고 기다려보기

 

 

>   Abort Exception Vector 에 break 걸린상황!

 

R14 (LR) : Abort 난 곳의 +8 지점을 가르킴

 

 

Interrupt : Lock   ( I I )

CPSR : Abort mode  (abt)  // 전전편에서는 (svc)

R14 : 어디에서 왔는지 알려줌 >  -8

 

 

// 26-8 = 1E

ST : 00EDCF1E | 6008               str       r0,[r1]           ;return

 

r1 : 0x FFFFFFFF

r0 : 8

 

>> 

r0 의 값을 r1 이 가르키는 주소에 넣어주려다가 문제가 생긴걸로 보임

>

 0xFFFFFFFF는 Memory Map 상에 없음 > 문제발생!

 

주변을 둘러보니

* HWIO_ADDR = 0x8 ; 

// 0xFFFFFFFFFFFF 라는 주소에 0x8 을 넣었음

mov    r0, #0x8

// r0 에 0x8 저장 ( 숫자 8 )  ( immdiate value )  > 즉시 값 사용 or 메모리접근,연산 등 수행할 준비

 

 

volatile int4 *HWIO_ADDR = (volatile int4 *) 0xFFFFFFFFFFFF;

 

> 주소 크기 및 위치 불일치 

   >> 문제 발생

 

>>

 

 

  • HWIO_ADDR(0xFFFFFFFFFFFF)에 0x8 저장.
  • r0 레지스터에 0x8 저장.
  • r1이 가리키는 주소(0xFFFFFFFF)에 r0 값(0x8) 저장

하려는 의도인데

잘못된 주소 크기와 주소 불일치로 Abort 난상황!!

 

 

 

이번에는 Low Vector 에 Abort 걸린상황임

 

Reset Vector      : 0x00000000
Undefined Instr   : 0x00000004
Software Interrupt: 0x00000008
Prefetch Abort    : 0x0000000C
Data Abort        : 0x00000010
IRQ               : 0x00000018
FIQ               : 0x0000001C