Могу ли я внедрить совместную многозадачную систему в VxWorks?

Устаревшая встроенная система реализована с использованием совместного многозадачного планировщика.

Система в основном работает по следующим направлениям:

  • Задача А работает
  • Когда задача A выполнена, она дает процессор.
  • Задача B получает процессор и работает.
  • Задача B дает
    ...
  • Задача n дает
  • Задача A запланирована и работает

Одна большая круговая очередь: A -> B -> C -> ... -> n -> A

Мы переносим систему на новую платформу и хотим свести к минимуму перепроектирование системы.

Есть ли способ реализовать такой тип совместной многозадачности в vxWorks?


person Benoit    schedule 27.09.2008    source источник


Ответы (5)


Хотя VxWorks является ОС на основе приоритетов, в ней можно реализовать такой тип совместной многозадачности.

Просто присвойте всем задачам одинаковой приоритет.
В свой код, где вы выполняете свой выход, просто вставьте 'taskDelay(0);'

Обратите внимание, что вы должны убедиться, что разделение времени ядра отключено (kernelTimeSlice(0)).

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

person Benoit    schedule 27.09.2008

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

Вынужден сделать вывод: отключение слайсинга vxWorks ведет к безумию. Избегайте этого, если это в ваших силах.

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

Со временем первоначальные программисты ушли, и их заменили новые разработчики, чтобы поддерживать и расширять продукт. По мере роста количества функций система в целом становилась менее отзывчивой. Столкнувшись с задачей, которая занимала слишком много времени, новые разработчики выбирали простое решение: вставляли taskDelay посередине. Иногда это было нормально, а иногда нет...

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

person DGentry    schedule 27.09.2008

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

В вики-статье представлена ​​небольшая предыстория, а затем вы можете начать с нее.

Удачи

person mdec    schedule 27.09.2008

То, что вы описываете, по существу:

void scheduler()
{
    while (1)
    {
        int st = microseconds();
        a();
        b();
        c();
        sleep(microseconds() - st);
    }
}

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

person Richard Harrison    schedule 24.11.2008
comment
Ричард, мне нравится твой ответ, но вопрос был конкретно связан с vxWorks. Так что планировщик уже есть. - person Benoit; 29.11.2008

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

person Naveen Kumar    schedule 06.01.2015