создание задачи внутри другой задачи во фриртос

Я новичок в RTOS и создаю простую систему реального времени для автомобильной промышленности.

Мне интересно, можно ли создать задачу внутри другой задачи. Я пытался сделать это следующим методом, но он не работает.

 void vTask1 { *pvParameters){
unsigned portBASE_TYPE taskPriority;
taskPriority=uxTaskPriorityGet( NULL );
char x;
while (1){
 x= 5 ;
if (x==5)
xTaskCreate( vTask2 , "task2", 1000, "task2 is running", taskPriority+5 , NULL );
}

когда я отлаживаю этот код, он зависает в xTaskCreate без выполнения новой задачи, и я искал в руководстве и в Интернете что-то об этом, но ничего не нашел.

Кто-нибудь скажет мне, возможно ли это сделать в RTOS или я делаю это неправильно?


person Jay Shenawy    schedule 07.08.2014    source источник
comment
Попробуйте создать задачу вне цикла while. xTaskCreate(...); пока (1); Если вы дойдете до while(1), то ваш планировщик не переключает задачи или вы неправильно создали задачу.   -  person Ross    schedule 08.08.2014
comment
Какой код ответа вы получаете от вызова xTaskCreate()? Если это не pdPASS, задача не создается.   -  person Ross    schedule 08.08.2014
comment
К сожалению, @Ross XTaskCreate() не дает мне pdPASS, каковы возможные причины, по вашему мнению?   -  person Jay Shenawy    schedule 08.08.2014
comment
Хочу заметить, что я использую xTaskCreate в более сложном коде. Код, который я написал выше, был просто простым примером того, что я делаю.   -  person Jay Shenawy    schedule 08.08.2014


Ответы (2)


Задания можно создавать до запуска планировщика (из основного) или после запуска планировщика (из другого задания). Документация по API xTaskCreate() находится здесь: http://www.freertos.org/a00125.html . Вы также найдете набор демонстрационных задач, демонстрирующих создание и удаление задач из другой задачи в основном загружаемом ZIP-файле FreeRTOS. Посмотрите в файле FreeRTOS/Demo/Common/Minimal/death.c (смерть для суицидальных задач, так как они удаляются после создания).

Если xTaskCreate() возвращает NULL, вероятно, вам не хватило места в куче. См. http://www.freertos.org/a00111.html. Я думаю, что большинство из сотен или предварительно сконфигурированных примеров, которые поставляются в загружаемом zip-файле, имеют комментарии на этот счет.

person Richard    schedule 08.08.2014

Проверьте возвращаемое значение API xTaskCreate.

еще одна вещь, вторая задача, которую вы создаете, это vtask2, которая имеет более низкий приоритет, чем vtask1, та, которая создает. И vtask1 выполняется, в то время как (1) планировщик не будет планировать vtask2. вы можете отложить или приостановить vtask1 после создания vtask2.

то vtask2 может выполняться.

person Pratik    schedule 08.08.2014
comment
taskPriority+5 означает, что vTask2 будет иметь более высокий приоритет, чем текущая задача, так как taskPriority был назначен в качестве приоритета текущего потока. - person Ross; 08.08.2014
comment
@Ross - поскольку я работал над Vxworks и ucos, эти RTOS говорят, что если меньше, то нет. выше приоритет... и вопрос был помечен ucos. - person Pratik; 11.08.2014