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 |