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

Interrupt Lock > Watch dog Reset

twoweeks-within 2025. 1. 17. 15:22

 

Reset 이 나버렸으면... Context 를 자세히 들여다 보자

 

 

CPSR : D3 : 1101 0011 에서 하위 5개 bit ( 4 bit까지 ) : 10011 : Supervisor mode

   6 bit : F  : 1

   7 bit : I   : 1

== 

 I I   : I 가 1

 F F  : F 가 1

// I,F 가 활성화 이면 I I , F F

// 비활성화 이면 I 옆에 공백, 쓰레기값

>>  IRQ, FIQ Lcok

 

Reset Exception > SVC mode

SPSR : 0x10 : Reset 하자마자 온거라 신뢰도 X 

 

 

 

 

 

 

L14 (R14) 의 위치는? ( 0x0EDCF19 )

 

R14: 복귀주소를 저장하는 레지스터

  > 그때 당시 PC 값을 그대로 간직 한뒤 Reset Exception 발생

    //  +1 해서 저장하기에 0x0EDCF18 이 exception 위치

 

                                     while(1);

0x0EDCF18 | E7FE   : b 0xEDCF18

  > 자기 자신에게 branch ( while (1) )

     > WatchdogTimer Reset XX > Watchdog : HW reset > Reset Handler 로 들어옴

 

 

while(1) 전에 blx 0xF016D8로 branch

   : blx : 다음에 돌아올 주소를 R14에 넣어두고 Interrupt_Lock() 으로 돌아옴

// Interrupt_Lock : Leaf함수 ( 함수 내에서 다른 함수를 호출하지않는 함수 )

    > R14를 또 건들이지않음

 

 

BUT ) Reset Exception 은 R14 를 Guarantee 하지 않음

// 특히 HW적 Reset일 경우

+

MCU reset/ MCP reset/     의 pin에 reset 을 걸어주도록

  MCU 에 reset_out pin을 만들어 HW 구성 > Register / Memory 값 초기화

>>

MCU reset/ MCP reset/   pin은  pull up 해서 구성해버림

 

 

사실은.. PC 가 0xFFFF0000 의 High Vector 의 Reset Vector 

    >> 분명히 watch dog 에 의한 HW reset을 눈치채야함!

 

현재 PC가 0xFFFF0000 >  프로세서가 리셋 후 초기화 과정에 진입했음

+

R14 + 관련 레지스터의 값 : 중간에 저장x > 초기화상태

/*

일부 레지스터(R0~R14) : 0 또는 특정 값으로 초기화됨

/ / 0,31, 1 ,,과 같이 이상한값

 

리셋 시 **CPSR(Current Program Status Register)**는 초기화됨

// 예: ARM의 Supervisor 모드(0b10011)로 전환

SPSR(Saved Program Status Register)은 일반적으로 리셋 후 사용되지 않고, 비활성화된 인터럽트 등으로 설정

 

 

// R14 , SPSR 은 기능적으로 유사

// but) R14 : 돌아올 주소 저장

       <> SPSR : CPSR 값 저장해둠 (프로그램의 상태( 플래그,모드 등))

 

 

*/

   >  비정상적인 리셋(Watchdog에 의한 강제 리셋)을 나타낼 가능성이 높음

 

 

 

 

'임베디드 > 임베디드 레시피' 카테고리의 다른 글

Art of Debugging  (0) 2025.01.17
JTAG interface  (0) 2025.01.17
MMU : Memory Management Unit ( 다시보기)  (0) 2025.01.16
Cache, Cash  (0) 2025.01.16
PLL , M/N:D  (0) 2025.01.15