2010-07-01 27 views
2

Je suis une vieille main avec des pilotes matériels et périphériques et utilisé beaucoup plus tôt les versions Linux pour le contrôle du matériel. Je suis récemment de retour dans le jeu de Linux et le contrôle des périphériques en utilisant le traitement intégré et j'ai découvert que beaucoup de choses ont changé dans le monde Linux (pour le meilleur). Cependant, je suis aux prises avec un problème de contrôle matériel impliquant un module de noyau de transfert de données basé sur SPI très rapide qui doit désactiver toutes les interruptions pendant une courte période (5msec) pour assurer le bon transfert des données. Dans les «vieux temps» de Linux, on utilisait une structure save_flags - cli() - sti() pour désactiver les interruptions de la section critique. Quel est le moyen le plus simple d'accomplir ceci dans le nouveau cadre de contrôle IRQ Linux (2.6.33 et plus récent)?Comment puis-je bloquer toutes les IRQ pendant le transfert de données de trame court (5ms)

Scott

+0

Bus maîtriser quelqu'un? La plupart des matériels de nos jours devraient pouvoir transférer des données à la RAM sans intervention d'unité centrale de traitement. Et c'est la bonne façon de le faire. IIRC, cli()/sti() devrait être encore dans le 2.6 pour la rétrocompatibilité. – Dummy00001

+1

5ms n'est plus "court" - c'est littéralement * millions * de cycles CPU gaspillés ... – caf

Répondre

1

Les équivalents modernes sont local_irq_disable(), , local_irq_save() et local_irq_restore(). Cependant, le faire pendant une si longue période de temps (et ne vous méprenez pas, à des vitesses de processeur modernes 5 ms est une longue période) est considéré comme assez antisocial. Sachez également que les machines modernes ont des SMI (System Management Interrupts) qui ne peuvent pas être masqués et qui peuvent prendre le contrôle de la CPU pendant une période pénible, donc votre code devra peut-être gérer ce cas. Le noyau de nos jours est préemptable et dispose de minuteurs à haute résolution pour le code du noyau - votre code peut être capable de les utiliser à la place (voir include/linux/hrtimer.h).

+0

Et cela ne sera que plus compliqué à mesure que plus de patchset RT est fusionné. – stsquad