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.
Cortex M3 n'a pas de MMU, donc il n'y a pas d'adresses virtuelles.
OriginalL'auteur batmat | 2012-10-03
Vous devez vous connecter pour publier un commentaire.
Cortex M3 ne peut s'exécuter dans la barre de mode. Donc vous devez toujours sauter à
address +1
, sinon il va générer une erreur.Juste essayer:
user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);
Je me rends compte que c'est probablement ce qui a fonctionné, mais ça n'a pas de sens. Le compilateur doit être génératrice de Pouce instructions pour vous. Je fais exactement la même chose que vous avez fait il y a (n +1) et il semble fonctionner pour moi. Avez-vous le
thumb
indicateur est défini pour laarm-none-eabi-gcc
compilateur?Merci! Cela a également travaillé pour moi sur un M4. Tout compilé fine, le débogueur a couru à travers tout le code, à l'exception de ce IAR débogueur avertissement de ce qui arrive à sauter tout en parcourant le code: “T-peu de XPSR est 0, mais devrait être de 1. Changé à 1.”
OriginalL'auteur Turbo J
Viens de lire le AN10866 document sur NXP Site. Vous devez charger le PC et le pointeur de Pile et ensuite passer à la réinitialisation de l'interrompre:
bx
instruction n'est pas pris en charge, mais j'ai du code qui l'utilise actuellement dans inline asm qui fonctionne (bien que je vérifie à nouveau).Mon précédent commentaire fait référence à l'assembly en ligne comme celui de @John Sinclair utilisé. Ils sont sûrs à utiliser dans un ensemble distinct de fichier de code cependant, j'ai eu une version à faire de même dans inline assemblée et il a également travaillé bien, donc je ne suis pas sûr de ce que pour faire des BRAS de recommandations.
OriginalL'auteur John Sinclair