FreeRtos вызывает vTaskDelete из IRQ - PullRequest
0 голосов
/ 11 января 2019

Я потратил некоторое время, но не могу найти какую-либо информацию, если разрешено вызывать vTaskDelete из обработчика IRQ? Я знаю, что некоторые методы имеют специализированную версию для использования в процедурах IRQ, однако я не могу найти ничего, связанного с vTaskDelete. В настоящее время это работает, но я не хочу делать какую-то трудную для обнаружения ошибку только потому, что я не нашел информацию.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Если вы вызываете обратный вызов из IRQ, то он все еще находится в контексте IRQ. Вызов vTaskDelete () с параметром NULL приведет к удалению задачи, которая выполнялась до ввода прерывания, поэтому прерывание затем попытается вернуться к задаче, которая больше не выполняется. Даже если бы это было не так, эмпирическое правило не должно использовать функции API, которые не заканчиваются на «FromISR» из прерывания (отдельный API обеспечивает меньше точек принятия решения в функции, более быструю и стандартную запись прерывания, как это не делается). нет необходимости хранить переменную вложенности прерываний, нет необходимости передавать параметры, которые не имеют смысла в контексте прерывания [например, время блока], в функцию прерывания и т. д.).

0 голосов
/ 11 января 2019

Я предполагаю, что вы не вызываете vTaskDelete с аргументом NULL, потому что нет текущей задачи, когда вы находитесь в контексте прерывания. В любом случае vTaskDelete () не должен вызываться из контекста прерывания. Например, его реализация вызовет vPortFree (), чтобы освободить TCB задачи.

...