Я потратил некоторое время, но не могу найти никакой информации, разрешено ли вызывать vTaskDelete из обработчика IRQ? Я знаю, что у некоторых методов есть специальная версия для использования в подпрограммах IRQ, однако я не могу найти ничего, связанного с vTaskDelete. В настоящее время это работает, но я не хочу делать какую-то трудную для обнаружения ошибку только потому, что не нашел информации.
FreeRtos вызывает vTaskDelete из IRQ
Ответы (2)
Если вы вызываете обратный вызов из IRQ, то он все еще находится в контексте IRQ. Вызов vTaskDelete() с параметром NULL удалит задачу, которая выполнялась до ввода прерывания. , поэтому прерывание попытается вернуться к задаче, которая больше не выполняется. Даже если бы это было не так, практическое правило заключается в том, чтобы не использовать функции API, которые не заканчиваются на «FromISR» из прерывания (отдельный API обеспечивает меньшее количество точек принятия решения в функции, более быстрый и стандартный ввод прерывания, поскольку он не не нужно сохранять переменную вложенности прерывания, нет необходимости передавать параметры, которые не имеют смысла в контексте прерывания (например, время блока) в функцию прерывания и т. д.).
Я предполагаю, что вы не вызываете vTaskDelete с аргументом NULL, потому что нет текущей задачи, когда вы находитесь в контексте прерывания. В любом случае vTaskDelete() не следует вызывать из контекста прерывания. Например, его реализация вызовет vPortFree(), чтобы освободить TCB задачи.