2017-06-21 2 views
-1

Je lis quelques données sur les canaux ADC sur dsPIC30F6014A. Pour cela j'ai implémenté une tâche séparée pour chaque ADC (disons 7 canaux-7 tâches).
J'ai créé toutes les tâches au début seulement, ma taille de tas est 5120, j'utilise heap_4.c et j'ai affecté la pile pour chaque tâche est configMINIMAL_Stack (c'est-à-dire 115).
Ces tâches sont en cours d'exécution en continu et périodiquement (juste vTaskSuspend() et vTaskResume() est ce que je fais)
Au démarrage de toutes les tâches fonctionnent très bien, mais après un certain temps vApplicationStackOverflowHook() se produit, à savoir la pile se débordait.débordement de pile dans freertos

Y a-t-il une possibilité de mauvaise manipulation de la mémoire?

+1

montrez votre code. https://stackoverflow.com/help/how-to-ask – Tschallacka

Répondre

3

Il semblerait inutile de créer une tâche par entrée ADC. Que font les tâches autres que la lecture de l'ADC?

Je suppose que votre tâche est très proche du bord de sa pile et à un moment donné vous obtenez une interruption juste quand vous êtes à la profondeur de pile maximale et cela provoque un débordement. Vous pouvez effectuer des appels périodiques à uxTaskGetStackHighWaterMark() pour déterminer à quelle distance de la fin de la pile vous avez atteint.

+0

L'application est une sorte d'application de sécurité. Et en ce qui concerne l'échantillonnage ADC dans PIC, j'interroge le bit DONE, donc il y a une légère possibilité que le contrôleur soit bloqué à la scrutation. C'est pourquoi j'ai mis en place différentes tâches. Que faire si je crée et supprime la tâche quand cela est nécessaire ??? Libère-t-elle la mémoire occupée par la tâche pour que je puisse assigner cette mémoire à une autre tâche? Merci –

+0

Allouer dynamiquement de la mémoire dans une "application de sécurité" n'est pas recommandé! Comme Richard l'a dit, c'est probablement une interruption qui se produit et pousse la pile au-delà de la limite ou il y a un chemin à travers le code de tâche qui utilise plus de pile que d'habitude. Dans tous les cas, la solution simple consiste à augmenter la taille de la pile (de chaque tâche ADC). La taille minimale de la pile n'est probablement pas assez grande pour vos besoins. Cela dit, si vous pouviez faire tout cela en une seule fois, vous pourriez avoir une pile plus grande et utiliser beaucoup moins de mémoire (et de meilleures performances) –

+0

Merci, j'ai vérifié il y a quelque temps quelle tâche entrait dans hook() en imprimant pcTaskName sur lcd et il montre "IDL", alors maintenant je suis confus que la tâche idéale utilise autant de pile (corrigez-moi si je me trompe) ??? En plus de cela, mon tas est 5120, donc combien de tâches je peux créer avec combien de taille de pile minimum ???? et une de plus chaque fois que je suspends une tâche et que je reprends une autre tâche qui occupera une nouvelle mémoire à chaque fois ????? Merci. –