Question

J'utilise une carte LPC 1768 de mbed (avec un processeur cortex M3) et j'essaie de réaliser quelque chose ici, principalement de mettre à niveau l'application utilisateur à partir de la carte SD, j'écris deux programmes, d'abord un chargeur de démarrage/nano-noyau, et une application utilisateur (helloworld fera l'affaire pour commencer) :

  • Le bootloader/nano-kernel à l'adresse 0x00 s'exécute, il effectuera quelques vérifications et éventuellement récupérera le fichier binaire sur la carte SD
  • Le bootloader/nano-kernel copiera ce binaire à l'adresse 0x9000 (cela devra peut-être changer plus tard, mais cet espace n'est pas utilisé par le bootloader/nano-kernel donc ça devrait aller)
  • Le chargeur de démarrage passe à l'application utilisateur à 0x9000 + 4

La carte SD est assez simple à gérer, j'ai des problèmes avec la partie saut.Voici le code de la fonction jump.

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();

}

J'ai donc compilé (j'utilise Keil uvision4) l'application utilisateur en changeant l'adresse de départ en 0x9000.Si je programme ma carte (à l'aide de flashmagictool), puis que je saute manuellement (toujours en utilisant flashmagictool) à 0x9004 (0x9000 + 4), l'application utilisateur s'exécutera donc je pense que la compilation a bien fonctionné afin que l'application utilisateur puisse s'exécuter à 0x9000.

Mais si j'exécute le bootloader/nano-kernel, celui-ci ne passe pas à l'application utilisateur et malheureusement comme je ne peux pas déboguer, je ne suis pas sûr de ce qui se passe...J'ai également essayé de ne pas utiliser la partie copie SD, donc je programme d'abord le chargeur de démarrage avec simplement le saut à 0x9004.Je programme ensuite l'application utilisateur qui restera à 0x9000.Si je redémarre la carte, le chargeur de démarrage s'exécute mais ne passe pas à l'application utilisateur.J'ai vérifié la mémoire et il semble que les deux programmes (bootloader + user-app) soient corrects et au bon endroit.

Je suis sûr qu'il me manque quelque chose ici, y a-t-il un code de bas niveau que je devrais examiner ?J'ai lu des tonnes de documents en ligne et, à partir des exemples que j'ai trouvés, ils accèdent au code utilisateur de la même manière que moi...Merci beaucoup pour toute aide.

Était-ce utile?

La solution

Cortex M3 ne peut fonctionner qu'en mode Thumb.Il faut donc toujours sauter vers address +1, sinon cela générera un défaut.

Essayez simplement :

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

Autres conseils

Il suffit de lire le document AN10866 sur le site NXP.Vous avez chargé le PC et le pointeur de pile, puis passez à l'interruption de réinitialisation:

__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);
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top