Найти в Дзене

С чего все началось

Началось все со знакомства с продуктом Ардуино, на с помощью которого я пытался собрать систему контроля качества воздуха. В моем распоряжении были плата Arduino Mega PRO, датчики пыли, температуры, давления, влажности, концентрации СО2, CO, часы реального времени, интерфейсы обмена данными UART. Стояла задача связать их все вместе и заставить правильно работать. Следует отметить, что датчик CO2  для коррекции своих измерений требует на вход текущие значения температуры, давления и влажности. Все шло отлично, до тех пор, пока не стал вопрос о прошивке. Здесь меня ждал сюрприз. Как оказалось, для некоторых приборов не существует библиотек для Arduino, существующие библиотеки достаточно общие и занимают много flash памяти, хотя по сути, работа там выполняется минимальная. Возникают проблемы с работоспособностью прошивки при включении флага оптимизации -Os (нарушается порядок обработки прерываний и прочее). Эти проблемы возникали у меня на следующих компиляторах gcc-avr, cvavr, mikroC

Началось все со знакомства с продуктом Ардуино, на с помощью которого я пытался собрать систему контроля качества воздуха. В моем распоряжении были плата Arduino Mega PRO, датчики пыли, температуры, давления, влажности, концентрации СО2, CO, часы реального времени, интерфейсы обмена данными UART. Стояла задача связать их все вместе и заставить правильно работать. Следует отметить, что датчик CO2  для коррекции своих измерений требует на вход текущие значения температуры, давления и влажности.

Рисунок 1. - Внешний вид платы, которую я использовал для разработки
Рисунок 1. - Внешний вид платы, которую я использовал для разработки

Все шло отлично, до тех пор, пока не стал вопрос о прошивке. Здесь меня ждал сюрприз. Как оказалось, для некоторых приборов не существует библиотек для Arduino, существующие библиотеки достаточно общие и занимают много flash памяти, хотя по сути, работа там выполняется минимальная. Возникают проблемы с работоспособностью прошивки при включении флага оптимизации -Os (нарушается порядок обработки прерываний и прочее). Эти проблемы возникали у меня на следующих компиляторах gcc-avr, cvavr, mikroC. В какой-то момент я плюнул на все это и решил спуститься до уровня железа, то есть писать прошивки на ассемблере.

Я ничего не имею против C/C++, я использую их при написании программ для PC, но вот для встраиваемых систем использование этих языков программирования подразумевает знание не только железа и ассемблера в частности, но и принцип работы самих компиляторов и то как они генерируют ассемблерный код при различных флагах оптимизации. Кроме этого, ассемблер поддерживает макросы, которые при умелом использовании позволяют писать код также эффективно и лаконично как и C, за тем лишь исключением, что ты точно знаешь, что происходит с системой и какие действия она выполняет.

В своей работе я использую ассемблер avra (https://github.com/Ro5bert/avra.git), прошивальщик avrdude (https://www.nongnu.org/avrdude/).