2016-07-11 4 views
0

Итак, у меня есть драйвер с полудуплексной шиной, где я что-то посылаю, а потом всегда должен ждать много времени, чтобы получить ответ. В течение этого времени ожидания я хочу, чтобы процессор сделал что-то ценное, поэтому я думаю об использовании 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*/ 
    } 

} 

ответ

0

Посмотрите ссылку API Freertos для vTaskSuspend, http://www.freertos.org/a00130.html

Однако я не уверен, что вы собираетесь об управлении потоком программы в правильном пути. Задачи могут быть приостановлены в очередях, событиях, задержках и т. Д.

Например, в последовательных компиляторах может быть задача, которая передает данные в очередь (но приостанавливается, если она заполнена), и прерывание, которое выводит данные из очереди и передает данные или данные о прерываниях в очереди или отправляет событие в задачу, чтобы сказать, что есть готовые к обработке данные, задача может затем проснуться и обработать данные или вывести их из очереди ,

Одна вещь, которая, на мой взгляд, важна, хотя, на мой взгляд, имеет только одну точку приостановки в любой задаче. Это не строгое правило, но в большинстве ситуаций ваша жизнь станет намного проще.

Существует множество других механизмов управления задачами, которые являются общими для большинства RTOS.

Осмотрите сайт FreeRTOS и поиграйте с несколькими демонстрационными версиями. В Интернете также есть много общих учебников RTOS. Это стоит изучить, как использовать основные функции большинства RTOS. На самом деле это не так сложно.

+0

Да, я тоже просматривал эту команду suspend, однако, так как я хотел бы слишком приостановить на определенный период времени, а не на неопределенное время, это не сработает. Моя последняя идея - расширить интерфейс. драйвер шины (в данном случае драйвер Modbus) с аргументом по умолчанию. Если вызывающий объект использует аргумент по умолчанию true, функция вернет время задержки, ожидая ответа. Тогда это время задержки может быть, возможно, использовано непосредственно вызывающим в vTaskDelay() или что-то еще. – Martin

+0

Играя вокруг некоторых, кажется, что vTaskDelay() можно вызвать изнутри someFunction(), и RTOS автоматически отслеживает, какая задача называется someFunction(), поэтому нет необходимости отправлять дескриптор. Ухоженная. Имеет смысл на самом деле, так как всегда есть только одна задача сразу же, RTOS будет знать, какая задача приостановлена. Теперь это упрощает процесс. Теперь я могу в принципе заменить всю задержку Arduino() на vTaskDelay() для драйвера шины, я думаю. – Martin

+0

Да, вы могли бы это сделать. Я все еще думаю, что вам будет лучше иметь какую-то систему, управляемую событиями, а не просто ждать времени. Вы должны знать, когда ваш последовательный (или ethernet) драйвер получил ответ от Modbus. (В прошлом я работал с Modbus довольно широко) –