SAM4S 용 부트 로더를 작성했는데 섹터 0에 앉아서 섹터 1에 응용 프로그램을로드합니다. 그러나 문제는 새로운 기능으로 이동하려고 시도 할 때 예외가 발생하는 것입니다 (디버거는 Dummy_Handler()로갑니다).부트 로더에서 점프하면 예외가 발생합니다.
.application 0x00410000 0x0
0x00410000 . = ALIGN (0x4)
0x00410000 _sappl = .
0x00410004 _sjump = (. + 0x4)
응용 프로그램 이미지 맵 파일이 있습니다 :
는const DeviceVectors exception_table = {
/* Configure Initial Stack Pointer, using linker-generated symbols */
.pvStack = (void*) (&_estack),
.pfnReset_Handler = (void*) Reset_Handler,
부트 로더는 선언 다음과 같이
.vectors 0x00410000 0xd0 src/ASF/sam/utils/cmsis/sam4s/source/templates/gcc/startup_sam4s.o
0x00410000 exception_table
…
.text.Reset_Handler
0x0041569c 0x100 src/ASF/sam/utils/cmsis/sam4s/source/templates/gcc/startup_sam4s.o
0x0041569c Reset_Handler
예외 테이블이 정의
부트 로더는지도에서 다음 항목이 포함 응용 프로그램 점프 포인트 :
다음extern void (*_sjump)();
하고 다음 호출을 : 0x00410004에서
_sjump();
메모리 내용이 0x0041569d이고, 나는이 단어가 정렬되지 않은 것을 알 수 있습니다. 우리가 Thumb 명령어를 사용하고 있기 때문입니까? 어느 쪽이든 0x0041569c가 아닌 이유는 무엇입니까? 아니면 더 중요한 것은 왜 이것이 예외가 될까요?
감사합니다,
데반
업데이트 : 이 this 발견하지만 나를 위해 작동하는 것처럼하지 않습니다
void (*user_code_entry)(void);
unsigned *p;
p = (uint32_t)&_sappl + 4;
user_code_entry = (void (*)(void))(*p - 1);
if(applGood && tempGood) {
SCB->VTOR = &_sappl;
PrintHex(p);
PrintHex(*p);
PrintHex(user_code_entry);
user_code_entry();
}
코드 인쇄 : 0041569D 0041569C
업데이트 업데이트 : C 함수 포인터를 이동하려고 시도하는 코드는 다음과 분해를 생산 :
--- D:\Zebra\PSPT_SAM4S\PSPT_SAM4S\SAM4S_PSPT\BOOTLOADER\Debug/.././BOOTLOADER.c
user_code_entry();
004005BA ldr r3, [r7, #4]
004005BC blx r3
나는이하여 다음 작업을 얻을 수있었습니다 :
"mov r1, r0 \n"
"ldr r0, [r1, #4] \n"
"ldr sp, [r1] \n"
"blx r0"
기반을 이것에 대한 스택 리셋이 필요한지 궁금한 점이 있다면 C에서 그렇게 할 수 있습니까?
CPU의 보호 모드 일 수 있습니다. 보호 지역 외부의 메모리에 액세스 할 수 있도록 변경해야 할 수도 있습니다. – Magn3s1um
@ Magn3s1um 내 부트 로더가 MPU를 구성한 것처럼 보이지 않습니다. – devanl
'sjmp' 함수의 주소는 무엇입니까? 부트 로더에'jmp','b' 명령어가 보이지 않습니다. 네 라인이 모두 확실합니까? 부트 로더의 C 또는 어셈블러 코드를 게시하십시오 (그리고 어쩌면 해체 할 수도 있습니다). – RedX