Итак, у меня есть драйвер с полудуплексной шиной, где я что-то посылаю, а потом всегда должен ждать много времени, чтобы получить ответ. В течение этого времени ожидания я хочу, чтобы процессор сделал что-то ценное, поэтому я думаю об использовании FreeRTOS и vTaskDelay() или что-то в этом роде.FreeRTOS приостанавливает выполнение задачи с другой функции
Один из способов сделать это - раскол водителя в части отправки/получения. После отправки он возвращается вызывающему. Затем вызывающий абонент приостанавливается и выполняет приемную часть через определенный промежуток времени.
Но уровень абстракции будет более тонким, если он будет оставаться одной задачей с точки зрения пользователя, как сегодня. Поэтому я думал: возможно ли, чтобы функция внутри задачи могла приостановить выполнение самой задачи? Как
void someTask()
{
while(true){
someFunction(&someTask(), arg 1, arg 2,...);
otherStuff();
}
}
void someFunction(*someSortOfReferenceToWhateverTaskWhoCalled, arg1, arg2 ...)
{
if(something)
{
/*Use the pointer or whatever to suspend the task that called this function*/
}
}
Да, я тоже просматривал эту команду suspend, однако, так как я хотел бы слишком приостановить на определенный период времени, а не на неопределенное время, это не сработает. Моя последняя идея - расширить интерфейс. драйвер шины (в данном случае драйвер Modbus) с аргументом по умолчанию. Если вызывающий объект использует аргумент по умолчанию true, функция вернет время задержки, ожидая ответа. Тогда это время задержки может быть, возможно, использовано непосредственно вызывающим в vTaskDelay() или что-то еще. – Martin
Играя вокруг некоторых, кажется, что vTaskDelay() можно вызвать изнутри someFunction(), и RTOS автоматически отслеживает, какая задача называется someFunction(), поэтому нет необходимости отправлять дескриптор. Ухоженная. Имеет смысл на самом деле, так как всегда есть только одна задача сразу же, RTOS будет знать, какая задача приостановлена. Теперь это упрощает процесс. Теперь я могу в принципе заменить всю задержку Arduino() на vTaskDelay() для драйвера шины, я думаю. – Martin
Да, вы могли бы это сделать. Я все еще думаю, что вам будет лучше иметь какую-то систему, управляемую событиями, а не просто ждать времени. Вы должны знать, когда ваш последовательный (или ethernet) драйвер получил ответ от Modbus. (В прошлом я работал с Modbus довольно широко) –