#arduino #scheduling #priority-queue #interrupt-handling #preemption
#arduino #планирование #приоритет-очередь #обработка прерываний #упреждение
Вопрос:
Я не уверен, что это лучшее место для этого вопроса, но я думаю, что проблема имеет некоторое отношение к алгоритмам оптимального планирования и теории массового обслуживания, так что, надеюсь, все будет в порядке.
Я собираюсь создать радиоуправляемый автомобиль для автономного прохождения курсов. Идея заключается в том, что он будет просто двигаться по прямой, пока один из его датчиков приближения не обнаружит стену или другое препятствие, что вызовет прерывание и регулировку рулевого управления.
Я немного узнал об алгоритмах планирования RTOS на курсе по встраиваемым системам и о упреждающей постановке в очередь на курсе по сетевой производительности, поэтому мне было интересно, выиграю ли я от применения какой-либо из этих концепций к этой задаче при программировании микроконтроллера, или я слишком много думаю? Основная цель — разработать его таким образом, чтобы автомобиль ехал как можно быстрее без столкновений, но я также хотел бы, чтобы он не был нервным в качестве второстепенной цели.
Итак, я полагаю, в смысле высокого уровня, существует ли конкретный метод, схема или тип политики планирования для использования прерываний, которые привели бы к наилучшей производительности для такой системы, как эта? Существуют ли какие-либо конкретные критические разделы, для которых я должен отключить прерывания? Для справки об аппаратных ограничениях я планирую использовать микроконтроллер, похожий на arduino, возможно, с тремя ИК-датчиками. Любые советы или предложения приветствуются.
Ответ №1:
Использование RTOS здесь является излишеством. О чем вам нужно подумать, так это:
- Какой тип датчиков вы будете использовать: расстояние (которое вернет расстояние до объекта) или присутствие (которое будет указывать только, есть препятствие или нет)? Датчики расстояния потребуют некоторой обработки to (либо выполнения преобразования АЦП, либо считывания I2C), в то время как датчики присутствия могут быть напрямую подключены к внешнему прерыванию uC.
- Как убедиться, что ваш автомобиль действительно едет прямо? Вы обнаружите, что он может слегка повернуться, даже если теоретически вы приказали ему двигаться прямо.
В зависимости от ответов на приведенные выше вопросы:
-
если вы используете датчики присутствия, обрабатывайте их как можно быстрее. Даже если у вас запущен какой-либо другой алгоритм управления (например, какой-нибудь PID), прервать его не составит проблемы.
-
если вы используете аналоговые датчики расстояния, используйте прерывание готовности к преобразованию АЦП. Затем, если у вас есть датчики, смотрящие в стороны, вы можете использовать возвращаемое значение, чтобы сохранять постоянное расстояние от стены и, в результате, двигаться прямо (посмотрите на роботов micromouse)
Итог: если вы хотите ехать быстро и не врезаться в стены — обрабатывайте датчики как можно быстрее.
Комментарии:
1. Спасибо за все советы. Мне любопытно узнать об обработке для датчиков расстояния. Я думал, что датчик присутствия будет прямым аппаратным прерыванием, но датчики расстояния будут обработаны, а затем использованы в качестве программного прерывания. Это неправильно? Я планирую использовать датчики расстояния, но мой микроконтроллер напрямую не поддерживает программные прерывания.
2. Предполагая, что вы используете Arduino с Atmega328 — у вас есть
ISR(ADC_vect)
прерывание. Если ваша обработка не займет много времени, просто поместите ее сюда. Или просто прочитайте значения АЦП здесь и обработайте их в основном цикле, как только они поступят.