Je sais que dans les ordinateurs, la valeur renvoyée par la main()
fonction est reçue par le système d'exploitation. Mais que se passe-t-il dans la main()
fonction d'un microcontrôleur?
microcontroller
avr
c
utilisateur18118
la source
la source
main
avec deux signatures différentes, qui retournent toutes les deuxint
. Si vous utilisez une implémentation C autonome, cette implémentation dicte la manière dont vous devez écrire la fonction de démarrage. Vous ne pouvez pas écrire unevoid
fonction de retour simplement parce qu'elle ne retourne pas. Le comportement de non-retour est différent du type de fonction qui influence les conventions d'appel globales.Réponses:
Sur un microcontrôleur,
main()
on ne s'attend pas vraiment à ce qu'il se ferme, et le comportement s'il n'est pas défini n'est pas défini - par conséquent, c'est à quiconque a écrit le runtime C pour le microcontrôleur. J'ai vu des systèmes qui:main()
pour que, si elle se ferme, elle soit simplement appelée à nouveau.main()
jamais se termine.main()
. C'est ce qu'on appelle "couler dans les mauvaises herbes".Je n'en ai jamais vu qui fasse quoi que ce soit avec la valeur renvoyée par
main()
. Si cela vous tient à cœur, vous devriez jeter un coup d'œil - et éventuellement modifier - le code source de la bibliothèque d'exécution C de votre système.la source
main()
uneint
valeur de retour n'a évidemment pas été conçue avec un microcontrôleur sans système d'exploitation. Il s’agit donc d’un comportement non spécifié et tout peut arriver en fonction de votre exécution C, comme le mentionne Dave.main()
, beaucoup moins définir sa valeur de retour. Cela dépend de l'implémenteur.void main( void )
est un comportement défini par l'implémentation , pas un comportement non spécifié .main()
.Un mythe commun / mythe est que
int main
c'est la seule forme valide spécifiée par la norme. Ce n'est pas vrai.La norme C parle de deux implémentations: hébergée et autonome. "Implémentation" dans ce cas signifie compilateur. Les compilateurs hébergés compilent pour un système d'exploitation spécifique et les compilateurs autonomes compilent pour une application nu-metal spécifique. Les systèmes embarqués sont presque toujours des systèmes autonomes, même dans le cas du RTOS.
Les implémentations autonomes peuvent utiliser n’importe quelle forme
main()
, elles n’ont même pas besoin d’une fonction appelée main. Le plus souvent, ils utilisent le formulairevoid main (void)
, car cela n'a aucun sens de renvoyer quoi que ce soit.Ce qui est important à comprendre, c’est que c’est toujours le compilateur qui décide de la forme
main()
et non le programmeur.Implémentations autoportant qui font quelque chose de retour
main()
sont très contestables. On se demande si les personnes qui ont créé le compilateur lisent réellement le standard ...Détails ici .
la source
La norme de langage C autorise la variante définie par la mise en œuvre.
void main( void )
Il s'agit de la forme habituelle dans les systèmes embarqués, simplement parce qu'ils ne sont pas censés être renvoyés.Si vous regardez la configuration du compilateur, il y a généralement un fragment de code d'amorçage, appelé à partir du vecteur de réinitialisation, qui effectue une initialisation de base (y compris par exemple l'adaptation des valeurs d'initialisation à des variables) avant d'appeler main ().
Ce sera également (généralement) dans une boucle infinie, ou peut-être effectuer une réinitialisation, si
main()
renvoiela source
Cela (comme d'autres réponses mentionnées) dépend de votre chaîne d'outils, mais par exemple dans GCC
main
est compilé comme d'autres fonctions, sa valeur de retour sera stockée conformément aux conventions d'appel (sur ARM, je n'utilise pas correctement avec GCC, il sera mis à R0 juste avant le retour).Je suppose que c'est la même chose sur AVR-GCC, donc un script personnalisé peut utiliser cette valeur après les retours principaux.
la source
main
peut obtenir sa valeur de retour. Bien sûr, il est ignoré dans 99,9% des cas, mais answer fournit des informations sur qui peut recevoir cette valeur de retour.