2010-01-07 38 views
3

J'ai un TI DSP (TMS320F28235 si quelqu'un s'en soucie) que j'ai besoin d'implémenter une FIFO pour mettre en attente des informations entre le code de la boucle principale et une interruption. L'exécution à grande vitesse pour cette file d'attente est très critique mais le bon fonctionnement aussi, et je ne suis pas sûr si je peux obtenir l'implémentation d'une FIFO sans synchronisation explicite, ou sinon, où je dois désactiver les interruptions.threadsafe mono-consommateur, mono-producteur FIFO sur système embarqué

J'ai trouvé this page et je me demandais si quelqu'un ici pouvait commenter son applicabilité.

+1

Le DSP est-il en mesure de commander à nouveau des charges et des stocks? Avez-vous des opérations atomiques disponibles? Est-ce qu'il fait des barrières de mémoire peut-être? –

+0

Portez une attention particulière au mot-clé «volatile» dans cet article. Si vous ne savez pas ce qu'il fait, vous devez apprendre. – Robert

+0

Est-ce que ce DSP a une comparaison et un échange contigus à double mot? –

Répondre

3

La page que vous avez trouvée est parfaitement adaptée à votre situation. Il ne repose que sur les lectures de mots et écrit être atomique. Il est vulnérable au matériel qui réorganise en silence les charges et les magasins. D'un autre côté, à peu près tous les autres algorithmes de synchronisation connus de Man sont également vulnérables à ce crock particulier.

Si vous avez envie de faire de l'archéologie informatique, recherchez les descriptions de tampons circulaires pour les systèmes d'exploitation CDC 6600. CDC a développé la technique à l'origine pour la communication entre les processeurs physiques multiples dans le 6600.

+0

Ah, oui ... D'abord, In, Out, Limit. Tellement simple et élégant. –

1

NOUVEAU et une information correcte

La référence pour le se trouve le jeu d'instructions here.

Pour émuler un verrou, il est suggéré dans la documentation que les interruptions soient désactivées.

Example ; Make the operation ”VarC = VarA + VarB” atomic: 
    DINT ; Disable interrupts (INTM = 1) 
    MOVL ACC,@VarA ; ACC = VarA 
    ADDL ACC,@VarB ; ACC = ACC + VarB 
    MOVL @VarC,ACC ; Store result into VarC 
    EINT ; Enable interrupts (INTM = 0) 

- pointeurs algorithme -

boucle principale interrompt préempter et apparemment des opérations atomiques n'existent pas. Votre boucle principale doit désactiver les interruptions pendant qu'elle éclate. Puisque la désactivation des interruptions revient à posséder un verrou dans ce contexte, vous pouvez implémenter la file d'attente en tant que mémoire contiguë ou sur un slop. La première consiste à copier la mémoire vers la pile de la boucle principale sur pop, qui peut être plus lente - cependant, à condition que votre FIFO ait assez de mémoire, vous ne devriez pas avoir à allouer des nœuds slist à partir d'un tas. . Bien sûr, les maux de tête de gestion de la mémoire n'existeront pas si les nœuds Slist ont une taille uniforme. Donc, pour un bruit, vous devez désactiver les interruptions et supprimer l'élément. Une fois cela fait, réactivez l'interruption. Pour les vecteurs d'interruption, c'est comme d'habitude (vous devrez peut-être désactiver les interruptions pendant le traitement vectoriel interrompu - ceci dépend du contrôleur).