Я разрабатываю протокол UART для обеспечения связи между двумя платами (мастер-плата и ведомая плата). Ведомая плата включает в себя множество датчиков и исполнительных механизмов, а главная плата должна управлять этой платой с помощью набора команд, таких как GET_SENSOR_VALUE
и SET_MOTOR_SPEED
т. д. В моем проекте должны выполняться многие функции, и должен осуществляться постоянный контроль значений датчиков (пример: главная плата должна получить значение температуры каждые 5 секунд, он будет получать уровень заряда батареи каждые 5 секунд, он должен включать вентиляцию при высокой температуре ...). Все оборудование подключено к плате Slave (датчики и исполнительные механизмы), а основная роль платы Master — мониторинг.
Я прочитал несколько статей о спецификациях и проектировании встроенных систем и понял, что первое, что нужно сделать перед запуском, — это выбрать ядро: RTOS или GPOS (голое железо).
Мой вопрос: в моем случае, если я выберу RTOS (на основной плате), должен ли я реализовать свои потребности в виде отдельных задач/функций?
Если да, поддерживает ли UART время высокоскоростного переключения контекста? пример:
00:00 temperature_task : GET_TEMPERATURE
если температура>порог, отправить START_VENTILATION
00:01 battery_task: GET_LEVEL
если уровень <порог отправить TURN_OFF_SYSTEM
00:02 влажность_задача: GET_HUMIDITY
если уровень <порог отправить DO_SOMETHING
00:03 Temperature_task : GET_TEMPERATURE
если температура>порог отправить START_VENTILATION
00:04 battery_task: GET_LEVEL
если уровень <порог отправить TURN_OFF_SYSTEM
00:05 влажность_задача: GET_HUMIDITY
если уровень < порога отправитьDO_SOMETHING
Да, это вообще ОТЛИЧНАЯ идея разделить функциональность таким образом, когда RTOS находится в системе. Необходимо проявлять большую осторожность, чтобы обеспечить взаимное исключение между задачами и общими ресурсами, такими как общая память или периферийные устройства, чтобы избежать условий гонки и непредсказуемого поведения. Обычный подход к этой проблеме заключается в блокировке каждого периферийного устройства за задачей «привратника», которая управляет входящим и исходящим потоком данных, обычно выполняя функцию обратного вызова для вызывающей стороны, когда ожидаемые данные получены. Прочтите эту статью (глава 7 посвящена именно этому) из документации FreeRTOS. При этом подход «голого железа» может быть вполне адекватным, имея более тесную связь между функциональными модулями программного обеспечения.
Обычно UART является двунаправленным (провод RX + TX), поэтому вы можете отправлять/получать без необходимости переключения.
У меня нет (Arduino) опыта работы с RTOS, однако разделение функциональности на функции всегда полезно. В этом разумном простом случае вам не нужны задачи или RTOS. Это в основном усложнит доступ к UART и необходимый обмен данными между задачами.
О ваших требованиях к «времени»: секунда — это огромное количество времени даже для простого микроконтроллера, такого как Arduino. Вы, вероятно, можете использовать оба Arduino с голым металлом (если вы не планируете использовать сложные расчеты/схемы), при условии, что вы можете установить все датчики на Arduino (или Mega?).
Если вы сделаете это фиксированным (например, всегда 20 байтов для размещения всех значений датчиков), вам не нужен символ новой строки/конец байта сообщения.
О протоколе: почему бы не отправлять каждые x мс все данные со всех датчиков одним пакетом на контроллер (ведомый к ведущему). И мастер может отправлять при необходимости (на лету для малой задержки) короткие сообщения, такие как «Выключить систему» или определенные команды (включая параметры).
Пример команд от ведомого к ведущему:
Byte Meaning
0 Temp sensor
1 Humidity level
2 Battery level (?)
3 ... other sensors
Пример команд от Мастера:
Byte 0 Byte 1
Command Parameter Meaning
0 n.a. Turn off system
1 n.a. Turn on system
2 0-255 Move servo to loc x (as example)
и т. д.
морсильо
Крис Стрэттон
пользователь72833