Я порождаю задачу vxworks (taskSpawn с приоритетом 99). Эта задача постоянно обрабатывает данные. Если задача запускается, я не могу вводить какие-либо команды в оболочке vxworks. Задача tShell имеет приоритет 105.
Так как я могу вводить любые команды в оболочку. У меня есть команда, чтобы остановить задачу от дальнейшей обработки данных.
Планировщик VxWorks является приоритетным. Задачи выполняются по принципу «первым пришел — первым обслужен» (циклический перебор по умолчанию отключен).
Поэтому, если ваша задача выполняется непрерывно, она блокирует все задачи с более низким приоритетом (более высокий номер = более низкий приоритет в VxWorks), поскольку планировщик выбирает задачи с более высоким приоритетом для запуска в первую очередь.
Чтобы справиться с этим у вас в основном есть следующие варианты:
taskDelay(1);
в ваш цикл обработки. Это блокирует ваш поток на один системный тик и позволяет запускать потоки с более низким приоритетом (например, tShell в вашем случае).В зависимости от сценария я рекомендую последний, так как в зависимости от вашей задачи добавление taskDelay(1);
может значительно замедлить обработку (и увеличить системный тик, используя tickSet(..)
до значений выше 1000 резко увеличивает нагрузку прерывания). Если вы уменьшите приоритет с другой стороны, ваша задача будет выполняться, за исключением того, что задача с более высоким приоритетом (например, оболочка) готова к запуску. В этом случае ваша задача будет прервана до завершения обработки задачи с более высоким приоритетом (например, ваша команда завершения).