2010-09-09 7 views
1

Puis-je effectuer des opérations à virgule flottante dans le gestionnaire d'interruptions? (x86 ou 64) Aussi je voudrais savoir que je peux utiliser la fonction d'impression dans le gestionnaire d'interruption?Question concernant le gestionnaire d'interruption

+1

Dernière fois que j'ai vérifié, le point flottant n'était pas autorisé du tout dans l'espace noyau. Je ne suis pas sûr si c'est une règle juste pour l'inclusion dans le noyau officiel, ou si c'est un problème abi pour des modules aussi, par lequel le noyau pourrait ne pas conserver l'état de virgule flottante. Mais c'est probablement une mauvaise idée de l'utiliser dans tous les cas. –

+0

@R: Vous pouvez utiliser le point flottant dans le noyau mais dernièrement j'ai entendu que vous deviez appeler des fonctions pour appeler une fonction avant de le faire afin de sauvegarder les valeurs précédentes pour le thread utilisateur en cours d'exécution. Vous devrez peut-être restaurer aussi. Je ne pense pas que cela puisse être fait à partir des ISR, cependant. – nategoose

Répondre

3

À l'intérieur d'un gestionnaire d'interruptions, n'utilisez rien qui puisse bloquer. Cela signifie ne pas utiliser les fonctions d'impression sauf si elles ne sont pas bloquantes. Idéalement, votre ISR devrait faire le strict minimum nécessaire pour effacer l'interruption et ensuite lancer un thread normal pour faire le reste du traitement. Si vous avez besoin des instructions d'impression pour le débogage, pensez à ce que la partie non-ISR de votre programme déclare un tampon volatile global et demandez à votre ISR d'y écrire les données de débogage. Votre code non-ISR peut vérifier le tampon et printf les données de celui-ci si nécessaire.

Vous devriez également éviter les opérations à virgule flottante dans un ISR (et dans le code du noyau en général).

+0

si je fais des opérations de virgule flottante cela fonctionne-t-il? – mousey

+0

Oui, les opérations flottantes "fonctionneront", mais en fonction d'un grand nombre de facteurs qui ne rentrent pas dans cette marge, cela pourrait corrompre l'état des opérations en virgule flottante dans les threads sans interruption. Le conseil général est juste ne pas, sauf si vous savez avec certitude que l'état FPU est correctement préservé à travers l'interruption, et même alors, tout simplement pas. – RBerteig

+0

@RBerteig Merci beaucoup – mousey

0

La plupart des unités à virgule flottante peuvent générer des exceptions divisées par zéro, etc. Si votre code a déclenché l'une de ces exceptions dans un contexte d'interruption, le résultat serait très désordonné. Toujours sur x86, certaines opérations mémoire/chaîne ont des versions MMX qui utilisent l'espace de stockage à virgule flottante comme mémoire temporaire pour effectuer des opérations de lecture/écriture en 64 bits. Selon la configuration du processeur/noyau, vous risquez de mauvaises surprises.

Vous pourriez finir par passer beaucoup de temps à le déboguer, alors mon conseil serait d'essayer d'éviter d'utiliser le point flottant dans le code du noyau si vous le pouvez.