문제

MBE 1768 보드를 MBED에서 (COTREX M3 CPU와 함께) 사용하고 있습니다. 여기에서 뭔가를 달성하려고 노력하고 있습니다. 주로 SD 카드에서 사용자 응용 프로그램을 업그레이드하고 두 가지 프로그램을 작성하고 있습니다. 첫 번째 부트 로더 / 나노 - 커널 및 사용자 앱 (HelloWorld는 시작을 위해 수행) :

  • Bootloader / Nano-kernel 0x00 주소가 실행되면 일부 수표를 수행하고 결국 SD 카드
  • 에서 바이너리 파일을 그립니다.
  • Bootloader / Nano-kernel은 0x9000 주소 0x9000 에서이 바이너리를 복사하지만이 공간은 Bootloader / Nano-kernel에서는 bootloader / nano-kernel에서 사용되지 않으므로
  • 부트 로더는 0x9000 + 4
  • 에서 사용자 응용 프로그램으로 이동합니다.

SD 카드는 운동하기 쉽고 점프 부분에 문제가 발생합니다. 점프 기능의 코드가 있습니다.

void run(void) {

  void (*user_code_entry)(void);

  unsigned *p;   
  SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);

  // Load contents of second word of user flash - the reset handler address
  // in the applications vector table
  p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000

  user_code_entry = (void (*)(void))p;

  // Jump to user application
  user_code_entry();
.

}

그래서 사용자 응용 프로그램이 시작 주소를 0x9000으로 변경하는 사용자 응용 프로그램을 컴파일했습니다 (저는 KEIL UVISION4를 사용하고 있습니다. FlashMagictool을 사용하여 내 보드를 프로그래밍 한 다음 수동으로 0x9004 (0x9000 + 4)로 수동으로 점프합니다 (0x9000 + 4), 사용자 응용 프로그램이 실행되었으므로 사용자 응용 프로그램이 0x9000에서 실행될 수 있으므로 사용자 응용 프로그램이 실행됩니다. < / P>

그러나 Bootloader / Nano-kernel을 실행하면 사용자 응용 프로그램으로 이동하지 않으며 불행히도 디버그 할 수 없으므로 무슨 일이 일어나는지 확신하지 못합니다. 나는 또한 사용하지 않으려 고 노력했습니다. SD 복사 부분이므로 Bootloader를 먼저 프로그래밍하여 기본적으로 0x9004로 점프하십시오. 그런 다음 0x9000에 앉아있는 사용자 응용 프로그램을 프로그래밍합니다. 보드를 재부팅하면 부트 로더가 실행되지만 user-앱으로 이동하지 않습니다. 나는 메모리를 점검했으며, 두 프로그램 (부트 로더 + 사용자 앱)이 올바른 위치와 올바른 위치에있는 것으로 보입니다.

여기에 뭔가를 놓치고 있습니다. 내가보아야 할 저수준 코드가 있습니까? 나는 온라인 문서를 읽었고, 내가 발견 한 예제에서, 그들은 내가하는 것과 같은 방식으로 사용자 코드로 점프하고있다.

도움이 되었습니까?

해결책

Cortex M3은 엄지 모드에서만 실행할 수 있습니다.따라서 항상 address +1로 점프해야합니다. 그렇지 않으면 오류가 발생합니다.

그냥 시도해보십시오 :

user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);

다른 팁

NXP 사이트에서 AN10866 문서를 읽으십시오.PC와 스택 포인터를로드 한 다음 재설정 인터럽트로 이동합니다.

__asm void boot_jump( uint32_t address ){
   LDR SP, [R0]     ;Load new stack pointer address
   LDR PC, [R0, #4] ;Load new program counter address
}

void execute_user_code(void)
{
    /* Change the Vector Table to the USER_FLASH_START 
    in case the user application uses interrupts */
    SCB->VTOR = USER_FLASH_START & 0x1FFFFF80;

    boot_jump(USER_FLASH_START);
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top