FreeRTOS tâches ne sont pas de changement de contexte
Je suis en utilisant FreeRTOS port pour microcontrôleur PIC32 sur le PIC32MX kit de démarrage. A été tout simplement jouer avec des tâches, mais les tâches ne sont pas de changement de contexte. Voici mes principaux paramètres de configuration:
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
#define configKERNEL_INTERRUPT_PRIORITY 0x01
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x03
#define configTICK_RATE_HZ ( ( portTickType ) 100 )
Maintenant, j'ai deux tâches définies qui clignotent deux LEDs. Les deux ont la priorité de 4(le plus élevé). En fonctionnement normal, la Led doit clignoter alternativement pour chaque 100 tiques. Mais cela n'arrivera pas. La deuxième LED clignote pour 100 tiques et le contrôle va au gestionnaire d'exception générale. Pourquoi est-ce arrivé? Semble comme il n'y a pas de planification à tous.
Sans voir votre code de la tâche, qui peut le dire? Quel est votre débogueur dites-vous? Quand vous frappez le gestionnaire d'exception, vérifiez la pile d'appel pour voir comment il est arrivé là, et à partir de quelle tâche ou le planificateur).
Êtes-vous à l'aide d'un port/la version de démonstration destinés à votre conseil d'administration? Il n'a jamais travailler?
Êtes-vous à l'aide d'un port/la version de démonstration destinés à votre conseil d'administration? Il n'a jamais travailler?
OriginalL'auteur Laz | 2011-02-28
Vous devez vous connecter pour publier un commentaire.
FreeRTOS est une priorité en fonction de préemption planificateur de tâches de même priorité qui ne produisent pas de temps processeur sera round-robin prévue. En s'appuyant sur round-robin est rarement adapté pour les tâches temps-réel, et en fonction de la configuration de la tranche de temps, qui peuvent gâcher votre moment. Le temps de découpage peut même être désactivé.
Vos tâches devez entrer le Bloqué état d'attente sur certains événements (comme le temps écoulé) pour permettre de les uns les autres pour s'exécuter comme prévu.
Cela dit, en entrant dans le gestionnaire d'exception, plutôt que de simplement une tâche de faim un autre ou ne fonctionne pas avec le timing est une question différente. Pour cela vous aurez besoin de publier des informations supplémentaires, si votre première démarche doit être de déployer votre débogueur.
OriginalL'auteur Clifford
L'absolu la première chose à vérifier est que votre "tique" interrompre. Souvent, les interruptions ne sont pas activés, les timers ne sont pas bien mis en place, les horloges ne sont pas configurés correctement dans le #pragma qui a mis en place le PIC32.. et toutes ces questions se manifestent d'abord dans l'absence d'un "tick".
C'est la cause n ° 1 de ne pas les tâches de commutation: si vous n'obtenez pas la tique d'interruption. C'est là que la normale de préemption des tâches de commutation se produit.
En supposant que vous êtes à l'aide de la "sur étagère "démo", dans MPLAB, définissez un point d'arrêt dans le
void vPortIncrementTick( void )
fonction (autour de la ligne 177 dans FreeRTOS\Source\portable\MPLAB\PIC32MX\port.c) et de l'exécution de votre code. Si des points d'arrêt dans, votre timer tick est de travail.OriginalL'auteur Serious Integrated
Êtes-vous sûr que les deux tâches sont bien enregistrés et le planificateur a été lancé?
Quelque chose comme le code suivant pour faire le travail:
Vous pouvez également ajouter une application tique crochet pour voir si la tique interruption se produit correctement ou si il y a un problème avec la tique de la minuterie.
xTaskCreate
assurez-vous que la création de la tâche n'a pas échoué par manque de suffisamment de mémoire pour la tâche de l'espace de pile.OriginalL'auteur greydet
Avez-vous un round-robin planificateur? Sont vos tâches de couchage, pour toute longueur de temps, ou tout simplement de céder ou d'occupation d'attente)?
Très commun de chasse aux sorcières dans des systèmes d'exploitation embarqués, c'est que le planificateur ne sera souvent pas tenter de programmer de multiples processus de même priorité assez. C'est, une fois Un des rendements, si A est Un exécutable peut obtenir à nouveau prévues immédiatement, même si B n'a pas eu n'importe quel CPU pour les âges. C'est très contre-intuitif si vous avez l'habitude de bureau systèmes d'exploitation aller à beaucoup d'effort pour faire juste de la planification (ou au moins, elle était à moi).
Si vous êtes en cours d'exécution dans le présent, vous voulez vous assurer que vos tâches ressembler à ceci:
...pour s'assurer que la tâche est réellement cesse d'être praticable entre clignote. Il ne fonctionnera pas si ça ressemble à ça:
(Également, en règle générale, vous souhaitez utiliser en priorité normale plutôt qu'une haute priorité, sauf si vous savez que vous aurez vraiment besoin --- si vous affamer une tâche du système le système peut se comporter de façon étrange ou de crash.)
OriginalL'auteur David Given
Il y a des normes de démonstration des tâches qui vient de clignotement de la Led dans le FreeRTOS/Demo/Common/Minimal/flash.c fichier source. Les tâches créées dans ce fichier sont inclus dans la norme PIC32 application démo (qui vise la Puce Explorer16 conseil d'administration).
Dans sa forme la plus simple, une tâche qui enclenche et LED toutes les 500ms devrait ressembler à ceci:
OriginalL'auteur Richard