Détails du chargeur de démarrage Arduino

11

Quelqu'un peut-il expliquer comment fonctionne le chargeur de démarrage Arduino ? Je ne cherche pas ici une réponse de haut niveau, j'ai lu le code et j'en comprends l'essentiel. J'ai également lu cet autre article (j'avais même été l'un des répondants).

Il y a un tas d'interaction de protocole qui se produit entre l'IDE Arduino et le code du chargeur de démarrage, résultant finalement en un certain nombre d'instructions d'assemblage en ligne qui auto-programment le flash avec le programme transmis via l'interface série.

Ce que je ne comprends pas, c'est à la ligne 270:

void (*app_start)(void) = 0x0000; 

... que je reconnais comme la déclaration et l'initialisation à NULL d'un pointeur de fonction. Il y a des appels ultérieurs à app_start aux endroits où le chargeur de démarrage est destiné à déléguer à l'exécution du code chargé par l'utilisateur.

Assurément, il app_startfaut en quelque sorte obtenir une valeur non NULL à un moment donné pour que cela se réunisse. Je ne vois pas cela dans le code du chargeur de démarrage ... est-il lié par magie par le programme qui est chargé par le chargeur de démarrage? Je suppose que le principal du chargeur de démarrage est le point d'entrée dans le logiciel après une réinitialisation de la puce.

Enveloppé dans les quelque 70 lignes d'assemblage, l'anneau de décodeur secret doit indiquer au programme principal où se trouve réellement app_start? Ou peut-être s'agit-il d'une connaissance implicite exploitée par l'IDE Arduino? Tout ce que je sais, c'est que si quelqu'un ne change pas app_start pour pointer ailleurs que vers 0, le code du chargeur de démarrage tournerait sur lui-même pour toujours ... alors quelle est l'astuce?

Sur une note distincte, serait-il possible que le code du chargeur de démarrage s'appuie sur des interruptions ou est-ce un non-non?

Éditer

Je suis intéressé à essayer de porter le chargeur de démarrage sur un Tiny AVR (en particulier le ATTiny44A) qui n'a pas d'espace mémoire séparé pour le code du chargeur de démarrage. Comme il devient évident pour moi que le code du chargeur de démarrage dépend de certains paramètres de fusible et de la prise en charge des puces, je suppose que ce qui m'intéresse vraiment, c'est de savoir ce qu'il faut pour porter le chargeur de démarrage sur une puce qui n'a pas ces fusibles et ce matériel. support (mais a toujours la capacité d'auto-programmation)?

Je pensais que je pourrais utiliser l'implémentation de l'AVR307 pour utiliser l'USI comme UART semi-duplex (utilise l'interruption Timer0 et l'interruption de changement de broche). Quelqu'un peut-il fournir des conseils sur la façon d'écrire / de porter le code du chargeur de démarrage pour une puce qui ne prend pas en charge le matériel pour les chargeurs de démarrage?

Je suppose que je placerais mon code de chargeur de démarrage à l'emplacement normal pour l'adresse principale (par exemple 0x029e ou partout où le compilateur place le principal). Je ferais alors en sorte que «adresse» dans le code du chargeur de démarrage ajoute un décalage qui me place juste après la fin de main et que «app_start» soit défini sur cette adresse. Est-ce que j'y pense correctement ou est-ce que je manque totalement quelque chose? Merci!

EDIT 2

FWIW, j'ai trouvé un processus documenté sur la façon de charger des croquis Arduino sur un ATTiny85 , c'est là que j'allais à l'origine avec cette question ... assez soigné je pense

vicatcu
la source
1
stackoverflow.com/questions/3652233/arduino-bootloader/… Je me demandais où était ma réponse ...
Nick T

Réponses:

12
void (*app_start)(void) = 0x0000; 

Ce n'est pas un pointeur NULL. Il s'agit vraiment de l'adresse du début du code d'application, à laquelle le chargeur de démarrage saute. L'éditeur de liens organise le démarrage de votre code d'application à l'adresse 0. Voir le tableau 26-6 dans la fiche technique ATMEGA168.

Le code du chargeur de démarrage démarre plus haut en flash. L'endroit exact dépend des fusibles du chargeur de démarrage.

Toby Jaffey
la source
où réside le code principal de bootloader alors ...
vicatcu
1
@Joby, ah ok ... voir la mise à jour de ma question - je suis intéressé à essayer de porter le chargeur de démarrage sur un petit AVR qui n'a pas d'espace mémoire séparé pour le code du chargeur de démarrage.
vicatcu
1
@Joby, donc le code du chargeur de démarrage s'appuie sur "... le fusible de réinitialisation de démarrage peut être programmé pour que le vecteur de réinitialisation pointe vers l'adresse de démarrage de Flash de démarrage après une réinitialisation. Dans ce cas, le chargeur de démarrage est démarré après une réinitialisation. "
vicatcu
3
Vouliez-vous spécifiquement le chargeur de démarrage Arduino? Il émule un programmeur STK500 et en tant que tel est un peu volumineux. Il y a une version atmega8 dans le répertoire bootloaders qui se compile en dessous de 1K avec gcc-3, mais même cela vous laissera assez court sur le flash disponible.
Peter Gibson
3
voudriez-vous même vraiment avoir un chargeur de démarrage? sûrement pour un ATTiny, il vaut probablement plus la peine de faire l'effort de programmer l'appareil en utilisant un programmeur ICSP (tel que usbTinyISP)
SingleNegationElimination