2016-11-11 13 views
3

Я пытаюсь понять рабочий процесс простой 2 задачи на freeRTOS. Добавление псевдо-код для ясности,Переключатель начального контекста 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); 
    } 
} 

главный

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(;;); 
} 

Предполагая, что обе задачи, скажем, Task_A и Task_B создаются внутри основной функцией, предоставляется вызов планировщику (преуспевает при создании всех задач). Как выполнить вызов планировщика, если планировщик не вызывается перед созданием задач? Или просто просто, в то время как выполнение начинается с основного, что приводит к тому, что элемент управления выходит из Task_A и Task_B, чтобы позже запускался планировщик? Пожалуйста, поправьте меня, если мое понимание ошибочно.

+1

Это совсем не ясно, что вы просите. Пожалуйста, отредактируйте вопрос, чтобы предоставить дополнительную информацию, возможно, добавив псевдокод, чтобы уточнить, где вы запутались. – Ross

ответ

4

Задачи не начинаются после их создания. Создание задачи просто создает структуры данных и информацию, которые планировщик должен знать о задаче. Задачи не запускаются до тех пор, пока планировщик не выполнит одно из них.

В вашем примере main Выполняется. Он вызывает процедуру создания задачи, которая строит и инициализирует структуру данных задачи. Он не выполняет задачу, но вместо этого возвращается к main. Затем main снова вызовет процедуру создания задачи и снова вернется к main. Наконец main вызывает планировщик, и планировщик выбирает задачу с наивысшим приоритетом, которая готова к запуску и начинает выполнение этой задачи. Планировщик не возвращается к main.

1

Первый запуск начинается. Он дает вызов xTaskCreate, который будет создавать только задачу 1 (в состоянии готовности) и вернуться к main, которая снова дает вызов xTaskCreate, которые только создают задачу 2 (в состоянии готовности) и возвращают . После выполнения vTaskStartScheduler() планировщик будет планировать обе задачи на основе приоритета (выбранный алгоритм планирования). Задача с наивысшим приоритетом сначала переходит из состояния готовности в рабочее состояние и начинает выполнение функции задачи (TaskA или TaskB), переданной как параметр при вызове xTaskCreate.

 Смежные вопросы

  • Нет связанных вопросов^_^