2016-11-11 6 views
3

J'essaie de comprendre le flux de travail d'un modèle simple de 2 tâches sur freeRTOS. Ajout de code psuedo pour plus de clarté,Commutateur de contexte initial FreeRTOS

Task_A

void Task_A(void *pvParameters) 
{ 
const char *pcTaskName = "Task_A is running\r\n"; 
    for(;;) 
    { 
    vPrintString(pcTaskName); 
    /* Delay for a period. */ 
    vTaskDelay(250/portTICK_RATE_MS);  
    } 
} 

Task_B

void Task_B(void *pvParameters) 
{ 
const char *pcTaskName = "Task_B is running\r\n"; 
volatile unsigned long ul; 
    for(;;) 
    { 
    vPrintString(pcTaskName); 
    /* Delay for a period. */ 
    vTaskDelay(250/portTICK_RATE_MS); 
    } 
} 

principale

int main(void) 
{ 
    xTaskCreate(Task_A, "Task 1", 1000, NULL, 1, NULL); 
    xTaskCreate(Task_B, "Task 2", 1000, NULL, 1, NULL); 
/* Start the scheduler so the tasks start executing. */ 
vTaskStartScheduler(); 
    for(;;); 
} 

supposer que les deux tâches, disent Task_A et Task_B sont créés dans la fonction principale, une l'appel au planificateur est donné (Réussir toute la création de la tâche). Comment l'appel au planificateur serait-il exécuté si le planificateur n'est pas appelé avant la création des tâches? Ou en mettant simplement, alors que l'exécution commence à partir de main, qu'est-ce qui provoque le contrôle à sortir de Task_A et Task_B de sorte que plus tard sur le planificateur est invoqué? Veuillez me corriger si ma compréhension est erronée.

+1

Ce n'est pas clair pour moi ce que vous demandez. Veuillez modifier la question pour fournir plus d'informations, en ajoutant peut-être un pseudocode pour clarifier les cas de confusion. – Ross

Répondre

4

Les tâches ne commencent pas à s'exécuter lorsqu'elles sont créées. La création d'une tâche met simplement en place les structures de données et les informations que le planificateur doit connaître à propos de la tâche. Les tâches ne commencent à s'exécuter que lorsque le planificateur en exécute un.

Dans votre exemple, main est en cours d'exécution. Il appelle la routine de création de tâche qui construit et initialise la structure de données de la tâche. Il n'exécute pas la tâche mais retourne à main. Ensuite, main appelle à nouveau la routine de création de tâche et revient à main à nouveau. Enfin, main appelle le planificateur et le planificateur choisit la tâche la plus prioritaire qui est prête à être exécutée et commence à exécuter cette tâche. Le planificateur ne revient pas à main.

1

Première exécution de la commande principale. Appel de xTaskCreate qui créera uniquement la tâche 1 (à l'état prêt) et retournera à main qui appelle à nouveau xTaskCreate qui crée uniquement une tâche 2 (à l'état prêt) et renvoie Après l'exécution de vTaskStartScheduler(), le planificateur planifiera les deux tâches en fonction de la priorité (algorithme de planification sélectionné). La tâche la plus prioritaire passera d'état prêt à état en cours et commencera à exécuter la tâche (TaskA ou TaskB) passée comme paramètre lors de l'appel de xTaskCreate.