Планирование задач - управление выполнением функции - PullRequest
2 голосов
/ 22 марта 2011

Во встроенном проекте мы должны реализовать планировщик задач с разными приоритетами, реализация проекта находится на C и выполняется на устройстве Arduino .

Теперь, когда мы находимся в стадии исследования, возник один вопрос, но никто не имел достаточного опыта, чтобы получить определенный ответ:

Как можно контролировать время выполнения функции? Как мы отслеживаем время до того, как функция вернется, чтобы мы могли прервать его, например, когда истечет время ожидания?

Одним из предложений было использование fork(), но, поскольку Arduino не включает в себя операционную систему, нет ядра для обработки потока. Или я не прав?

Любой вклад будет полезен, спасибо большое,

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

Во встроенной системе планировщик задач является ядром операционной системы (обычно RTOS), поэтому вас просят внедрить один , а не для его использования.

Простойпример того, как работает такой планировщик, описан в загрузке Жана Лаброса Micro C / OS-II .Он описывает полное ядро ​​RTOS с расписанием и IPC.Для вашего проекта вы можете взять описание этого ядра и реализовать свое собственное (или вы можете использовать прилагаемый исходный код).

Такое ядро ​​работает путем планирования определенных вызовов ОС и прерывания по таймеру.Переключение контекста включает в себя сохранение регистров процессора для одной задачи и затем замену регистрами для другой.Поскольку этот регистр сохранения / восстановления включает в себя указатель стека и программный счетчик, управление переключается между потоками.

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

3 голосов
/ 22 марта 2011

Вам нужен таймер. Все некооперативные многозадачные системы (то есть те, которые не зависят от того, чтобы функция постоянно говорила «можешь прервать меня»), используют таймер, чтобы остановить выполнение через некоторое время (скажем, 100 мс).

В обработчике прерываний проверьте, существует ли другой «поток», который может работать, и переключите контекст.

Довольно простая реализация - это «список готовности»: всякий раз, когда задача или поток могут выполнить какую-либо работу, добавьте его в список готовности.

Когда срабатывает таймер, добавьте текущую задачу в конец списка и сделайте заголовок списка текущей задачей.

...