FreeRtos вызывает vTaskDelete из IRQ

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

2 ответа

Решение

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

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

Другие вопросы по тегам