Могу ли я внедрить совместную многозадачную систему в VxWorks? - PullRequest
2 голосов
/ 27 сентября 2008

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

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

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

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

Мы портируем систему на новую платформу и хотим минимизировать редизайн системы.

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

Ответы [ 5 ]

2 голосов
/ 27 сентября 2008

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

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

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

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

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

2 голосов
/ 27 сентября 2008

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

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

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

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

0 голосов
/ 06 января 2015

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

0 голосов
/ 24 ноября 2008

Что вы описываете по сути:

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

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

0 голосов
/ 27 сентября 2008

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

Вики-статья содержит немного фона, и тогда вы можете перейти оттуда.

Удачи

...