Merci.
Je pensais que le terme "main" était normalisé en langage C ou C++, donc obligatoire, et que c'était la fonction qui se lançait automatiquement en premier.
D'un autre coté je ne sais pas ce qu'est un "startup" et je pense qu'il faut être réaliste : j'atteins mes limites.
Avec les avr j'avais suivi. J'avais trouvé le vrai fichier C++ avec sa fonction main() qui appellait une fonction init() qui configurait le micro à la sauce arduino.
Avec les avr j'avais l'impression que j'avais prise sur le logiciel arduino et que je pouvais m'en écarter, avec le circuit Xtensa terminé par Espressif je découvre qu'il existe des mécanismes dont j'ignore l'existence.
Cela devient vraiment une boîte noire dans laquelle on ne peut plus entrer, c'est dommage mais c'est la rançon de la performance.
J'ai toujours aimé comprendre ce que je ne connais pas encore mais là je crains que cela tourne au masochisme.
Vrai. Sur Arduino c'est différent.
Le point d'entrée est main() et il appelle une fonction init(). Init() ne fait pas grand chose à part initialiser timers et ADC.
Init() n'est pas le startup.
Le vrai startup est planqué dans la librairie libgcc, livrée sous forme binaire dans ARDUINO.
Le choix se "ferait" au niveau de la conception du compilateur ou du linker ?
app_main serait normalisé dans le C et/ou C++ ?
Il faut bien un mécanisme qui fixe la première fonction appellée au démarage d'un programme.
Admettons que le choix d'appeler app_main ou main soit fait dans la conception du complilateur ou du linker, je ne m'étais jamais posé la question de savoir où ce choix est fait. Pour moi c'était un choix des concepteurs du langage.
Dans tous les tuto de C que j'ai parcouru j'ai toujours vu la fonction main et jamais app_main.
Mais pourquoi cette double (ou plus ?) possibilité app_main et main.
Derrière les noms il se cache bien des comportements différents, des avantages et des inconvénients.
En fonctionnement "normal" app_main appelerait-elle directement main ?
Avec les micros (contrôleur ou processeurs) app_main permettrait-elle de faire des actions suplémentaires ?
ou dit autrement app_main est-il réservé aux systèmes d'exploitation ou équivalents, et main pour les programmes qui tournent à l'intérieur d'un système d'exploitation ?
Le choix se "ferait" au niveau de la conception du compilateur ou du linker ?
Non, le choix se fait au niveau de la librairie C.
Il faut bien un mécanisme qui fixe la première fonction appellée au démarage d'un programme.
Oui, le vecteur de RESET.
Dans le fichier de lien on peut fixer l'adresse de certaines variables ou fonctions.
L'adresse des vecteurs d'interruption est fixée ainsi.
Le vecteur de reset contient l'adresse du startup.
Que le startup appelle main(), app_main() ou toto() importe peu.
main() est simplement un standard, une convention, mais cela dépend totalement de la librairie C.
pour moi le code machine exécuté à la mise sous tension est enfoui dans la ROM de l'ESP32
Il configure certaines ressources (horloges..RAM, UART, SPI...) en tenant compte de l'état de 'fusibles' (efuses)
Ceci fait il examine l'état de plusieurs GPIO (0, 2....) et ensuite selon leur combinaison fixe le comportement du bootloader matériel (ROM) , bootloader de premier niveau
Pour ce qui nous concerne cela va donner soit :
-l'activation du téléchargement d'un code par UART et son stockage en memoire Flash SPI
-l'activation directe du code présent en mémoire Flash SPI avec des points d'entrée définis
Un bootloader logiciel , bootloader de second niveau, ( téléchargé auparavant par UART avec l'application et nombre de fonctions) entre alors en scène.
Il est en partie configurable par la chaine de développement en application de règles définies par Xtensa. Une ligne bootloader config apparait dans le menu de configuration de l'IDF.
Les engagements de confidentialité et non divulgation ne permettent pas à Espressif de documenter en profondeur certaines fonctionnalités de l'ESP32 et Cadence de répond pas aux demandes d'utilisateurs Lambda. Cette situation a déjà été évoquée sur les forums d'Espressif.
pour revenir à app_main() il semble d'après cet échange qu'il y ait un rapport avec la désignation 'historique' des deux coeurs APP et PRO puis cpu1 et cpu2
fichier 'startup' pour mega328 ? d'après le nom je verrai bien le fichier objet 'run time' "crtatmega328.o"