Chargeur de démarrage pour le Cortex M3

Je suis à l'aide d'un LPC 1768 conseil de mbed, (avec cortex M3 cpu) et je suis en train de réaliser quelque chose ici, principalement la mise à niveau de l'application de l'utilisateur de la Carte SD, je suis en train d'écrire deux programmes, d'abord un bootloader/nano-noyau, et un utilisateur de l'application (helloworld fera pour un début):

  • Bootloader/nano-noyau à l'adresse 0x00 s'exécute, il va faire quelques vérifications et éventuellement saisir le fichier binaire sur la carte SD
  • Bootloader/nano-noyau copiez cette binaires à l'adresse 0x9000 (qui pourrait avoir à changer plus tard, mais cet espace n'est pas utilisé par le bootloader/nano-noyau doit donc être ok)
  • Bootloader sauts à l'utilisateur de l'application à 0x9000 + 4

La carte Sd est assez facile à travailler, je vais avoir des problèmes avec la partie du saut. Voici le code de saut de fonction.

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é (je suis en utilisant Keil uvision4) l'application de l'utilisateur modification de l'adresse de début 0x9000. Si je programme mon conseil (à l'aide de flashmagictool), puis manuellement sauter (toujours à l'aide de flashmagictool) à 0x9004 (0x9000 + 4), l'application de l'utilisateur exécutera alors je crois que la compilation a fonctionné ok, donc l'utilisateur de l'application peut s'exécuter à 0x9000.

Mais Si je lance le bootloader/nano-noyau, celui-ci ne saute pas à l'utilisateur de l'application et, malheureusement, comme je ne peux pas debug, je ne suis pas sûr de ce qui se passe... j'ai aussi essayé de ne pas utiliser la carte SD copier la partie, donc je programme le bootloader d'abord avec fondamentalement juste le saut à 0x9004. Ensuite, je programme l'utilisateur de l'application qui va s'asseoir à 0x9000. Si je redémarre le conseil d'administration, bootloader fonctionne, mais ne saute pas à l'utilisateur de l'app. J'ai vérifié la mémoire, et il semble que les deux programmes (bootloader + de l'utilisateur de l'application) sont correctes et à la bonne place.

Je suis sûr que je suis absent quelque chose ici, est-il un faible niveau code je devrais regarder ? J'ai lu les tons de documents en ligne, et à partir des exemples que j'ai trouvés, ils sont de sauter à un code utilisateur de la même manière que je le fais... Merci beaucoup pour toute aide.

cela devrait fonctionner assez similaire sur votre PC, mais avec des adresses virtuelles, au lieu de physique - essayez-le et voyez si cela fonctionne, puis déplacer le code de Keil
Cortex M3 n'a pas de MMU, donc il n'y a pas d'adresses virtuelles.

OriginalL'auteur batmat | 2012-10-03