Почему задачи RTOS должны выполняться в бесконечном цикле?

Привет, я новичок в RTOS, и почти в каждом документе, который я читаю, указывается, что задачи должны быть в бесконечном цикле, но ни в одном не говорится, почему. Кто-нибудь может помочь объяснить это? Спасибо


person annena    schedule 10.03.2015    source источник
comment
Ну, потому что в противном случае они отвалились бы от конца и, таким образом, прекратились бы или разбились, не оставив ничего.   -  person Martin James    schedule 10.03.2015
comment
Это зависит от RTOS. У вас может быть ОСРВ, которая изящно обрабатывает возврат из функции задачи. Но конструкция микроконтроллера претендует на экономию ресурсов. Может быть дешевле пропустить эту обработку конца задачи.   -  person harper    schedule 10.03.2015
comment
Ваше утверждение ложно. В ОСРВ могут быть как задачи с бесконечным циклом, так и завершающие задачи. Основной цикл любой встроенной системы, безусловно, является бесконечным циклом. Другой пример: задача часов, скорее всего, будет бесконечным циклом. Напротив, задача по отправке уведомления по электронной почте, скорее всего, будет реализована как завершающая задача, которая будет повторно воплощена, когда снова потребуется отправить другое электронное письмо - возможно, через несколько часов или дней. (Задача электронной почты в виде опроса в бесконечном цикле для ожидающих сообщений электронной почты будет тратить ресурсы, поскольку ее слот задачи может использоваться другой специальной задачей.)   -  person tonypdmtr    schedule 10.03.2015
comment
Пожалуйста, воздержитесь от публикации ответов в разделе комментариев. Если у вас есть ответ, опубликуйте его как таковой.   -  person Clifford    schedule 10.03.2015


Ответы (3)


Они этого не делают, но если функция задачи выполняется до завершения, задача завершается.

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

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

Реализации RTOS различаются, вам нужно будет проверить, как ваша RTOS обрабатывает функции завершения потока. Вам может понадобиться явный вызов завершения, чтобы убедиться, что ресурсы освобождены ядром.

Если у вас есть система, которая нуждается в некоторой форме контролируемого корректного завершения работы, вам не нужно кодировать задачи как бесконечные циклы, а иметь условный выход из цикла, чтобы задача могла завершаться по запросу, например;

while( (event_flags & TERMINATE) == 0 )
{
    event_flags = eventWait( WAIT_FOREVER ) ;

    // handle events
    ...
}
person Clifford    schedule 10.03.2015

Я не думаю, что будет совершенно правильно сказать, что «задача RTOS должна быть бесконечным циклом». Я думаю, что более правильным утверждением будет то, что «для многих RTOS задача не должна возвращаться». Причина этого в том, что планировщик RTOS, который первоначально вызывает задачу, не предназначен для обработки возврата из задачи. Если задача вернулась, планировщик RTOS может сообщить об ошибке.

Я могу предположить несколько причин, по которым многие планировщики RTOS не обрабатывают возвраты от задач. Во-первых, бесконечный цикл — наиболее типичный тип задач, реализуемых во встраиваемых системах. Задача, которая заканчивается, встречается гораздо реже. Во-вторых, планировщик RTOS, возможно, должен быть более сложным, чтобы обрабатывать возвращаемые задачи. В-третьих, разработчик ОСРВ, возможно, не хотел предполагать, что следует делать, когда задача возвращается, и вместо этого он хочет, чтобы разработчик задачи явно вызывал соответствующую процедуру завершения задачи.

Бесконечный цикл — не единственное решение для многих ОСРВ, которые не позволяют возвращать задачи. ОСРВ может предоставлять процедуру завершения задачи, которая удаляет задачу из списка задач, чтобы она больше никогда не планировалась. Если задача вызывает процедуру завершения задачи, то задача не обязательно должна быть бесконечным циклом, и она также не вернется к вызывающей стороне. (т. е. процедура завершения задачи RTOS не возвращается, поэтому задача, вызвавшая ее, также не возвращается.) Например, во FreeRTOS есть vTaskDelete(), а в uC/OS-II есть OSTaskDel() для удаления задач, которые не являются бесконечными циклами.

Бесконечный цикл является распространенным типом задач во встроенных системах, потому что многие встроенные системы просто делают одно и то же снова и снова. Многие встроенные системы отличаются от ПК тем, что с ними не взаимодействует пользователь, запуская и завершая различные задачи или приложения.

person kkrambo    schedule 10.03.2015

В обычной реализации языка C, которая поставляется вместе с любой GPOS (операционной системой общего назначения), такой как Linux, Windows, Mac OSX, библиотека времени выполнения C отвечает за инициирование задачи (может быть вызвана как поток/процесс в контексте GPOS), а также как сборщик, когда задача заканчивается.

Это означает, что crt (среда выполнения C) вызовет main() задачи, чтобы инициировать ее, и когда задача вернется с оператором return, управление будет передано обратно crt ОС.

В RTOS, хотя вы можете программировать, используя язык C, нет конкретной реализации crt как таковой. Функция «Запуск» (обычно написанная на ассемблере) вызывает main. Однако этот код запуска не имеет механизма для сбора возвращаемого значения задачи, и поэтому задача должна выполняться в бесконечном цикле, чтобы сохранить управление внутри самой задачи. Если нет, у CPU/MCU не будет обратного адреса для перехода.

Однако задачу можно завершить с помощью API управления задачами, предоставляемого RTOS. в этом случае управление перейдет к коду, вызвавшему task_kill() (репрезентативный) API из RTOS.

person Yusuf Husainy    schedule 10.03.2015