Я пишу все более сложные прошивки и начинаю замечать, что мне немного не хватает знаний о шаблонах проектирования и архитектуре. Я пытаюсь работать над развитием этих навыков и надеюсь на какой-то вклад. Примечание: это для встроенного c для микроконтроллеров.
Сейчас я работаю с концепцией для нового проекта в качестве упражнения, которое выглядит примерно так:
- У нас есть модуль управления батареями с пользовательским вводом / выводом
- Главный контроллер отвечает за ввод / вывод (кнопка, ЖК-дисплей, отладка UART), обнаружение таких вещей, как зарядное устройство, подключенное / отключенное, и управление операциями высокого уровня.
- Субконтроллер представляет собой контроллер управления батареями (в значительной степени пользовательский PMIC), способный контролировать уровни заряда батареи, запускать зарядку / разрядку встроенного программного обеспечения и т. Д.
- PMIC взаимодействует с ИС датчика уровня топлива, которую он использует для считывания информации о батарее из
- Интерфейс между двумя контроллерами, указателем уровня топлива и ЖК-дисплеем, все I2C
Вот примерная схема системы:
Теперь я пытаюсь придумать хорошую архитектуру прошивки, которая позволит расширить возможности (добавление нескольких батарей, добавление дополнительных датчиков, изменение интерфейса LCD (или другого) с I2C на SPI и т. Д.), и для тестирования (смоделируйте нажатия кнопок через UART, замените показания батареи на смоделированные значения для проверки встроенного ПО заряда PMIC и т. д.).
Обычно я пишу собственный драйвер для каждого периферийного устройства и модуль прошивки для каждого блока. Я бы также внедрил модуль пометки с глобально доступным get / set, который будет использоваться во всей системе. Например, мои таймеры установят флаги 100 Гц, 5 Гц, 1 Гц, которые будет обрабатывать основной цикл и вызывать отдельные модули с желаемой частотой. Затем сами модули могут установить флаги для основного цикла для обработки таких событий, как завершение транзакции I2C, тайм-аут транзакции, превышение температуры и т. Д.
Что я надеюсь получить от этого, так это несколько советов о том, как лучше спроектировать систему для достижения моих целей по масштабируемости, инкапсуляции и абстракции. Похоже, что я делаю что-то вроде псевдо-событийной системы, которая была взломана вместе.
В любом случае вот моя попытка на диаграмме архитектуры: