Так как ресурсы микроконтроллера не велики, основным методом настройки программного обеспечения под конкретную плату, конкретную архитектуру является использование препроцессора (CPP – C PreProcessor).
Есть несколько стандартных приёмов в использовании препроцессора:
- Условная компиляция. Используется для выбора одного из нескольких вариантов реализаций исходного кода что включаются в программу. В частном случае реализуется выбор одного из двух вариантов исходного кода или ещё проще – выбор включения или исключения исходного кода:
- позволяет сократить исходный код, убрать/вставить только нужный приложению код
- позволяет сократить дерево разбора if else если во время компиляции результат заранее известен
- позволяет вызывать вместо одних функций другие в зависимости от необходимого результата
- позволяет игнорировать некоторые переменные при вызове функции-макроса
- позволяет вставлять в исходный код дополнительные отладочные функции, которые при выпуске финальной версии программы убираются (напр: ASSERT)
#ifndef _DRiCONFIG_H_
#define _DRiCONFIG_H_ 1
#define DRi_UART 1
#define DRi_UART_NXP2xxx0 (DRi_UART && 1)
#define DRi_UART_NXP2xxx3 0
#endif
- Макроподстановка констант и формул вычисления. Используется для настройки конкретных величин в программе:
- заменяет константы, что иногда не требует выделения памяти
- позволяет вычислять некоторые значения во время компиляции, что позволяет избегать громозкой операции деления Примеры: Частота кварца и формулы, вычисляющие константы для стандартных скоростей UART
#define DRI_TTYS_DEFAULT_BAUDERATE 115200
#define DRI_CLOCK_COUNTER (CPU_FREQ/16/DRI_TTYS_DEFAULT_BAUDERATE)
Cуществует несколько способов подставить те или иные определения препроцессора (#define) в проект:
- В командной строке указать ключ -Dsome_define=1
- В командной строке указать список директорий для заголовочных файлов(ключ -I../port_dir), с тем чтобы в проект попали именно те определения, в случае если в проекте есть несколько заголовочных файлов с одинаковым именем
- В проекте завести один или несколько заголовочных файлов – объявить их файлами конфигурации и вставлять их в каждый компилируемый файл, что берётся за правило
Помимо использования препроцессора есть ещё один метод настройки проекта – включение и исключения исходных *.с *.сpp файлов из компиляции и линковки, данный способ настройки должен определяться системой сборки, котороая опять-таки настраивается в некотором файле.
В хорошо организованном проекте должны существовать несколько отдельно выделеных конфигурационных файлов.
Другие страницы