Почему я получаю ошибки после вставки функций в пример кода?
Извинения за невероятно смутное название; Я постараюсь быть более конкретным здесь.
Я разрабатываю программу на микроконтроллере NRF52832 в SEGGER Embedded Studio IDE, которая получает данные от внешнего АЦП через SPI и выводит сигнал ШИМ с рабочим циклом, который зависит от данных от АЦП.
Я получил пример кода для драйвера SPI и драйвера PWM, работающих в отдельных проектах, и теперь я пытаюсь объединить их. Однако, когда я вставляю функцию из, скажем, драйвера ШИМ в драйвер SPI и вставляю соответствующий включаемый файл в драйвер SPI, я получаю ошибку в (казалось бы) не связанном заголовочном файле. Вот конкретный пример:
(1) я добавляю макрос
APP_PWM_INSTANCE(PWM1,1);
в драйвер SPI для инициализации экземпляра ШИМ, как это делает драйвер ШИМ. Конечно, без заголовочного файла, содержащего определение макроса, я получил бы ошибку.
(2) Итак, я включаю заголовочный файл:
#include "/Users/payton/opt/nRF5_SDK_15.0.0/nRF5_SDK_15.0.0_a53641a/components/libraries/pwm/app_pwm.h"
Компилятор принимает новый заголовочный файл и добавленный макрос, но сборка завершается неудачно из-за следующей ошибки в середине заголовочного файла nrfx_timer.h:
#define NRFX_TIMER_INSTANCE(id) \
{ \
.p_reg = NRFX_CONCAT_2(NRF_TIMER, id), \
.instance_id = NRFX_CONCAT_3(NRFX_TIMER, id, _INST_IDX), \
.cc_channel_count = NRF_TIMER_CC_CHANNEL_COUNT(id), \
}
ERROR:
'NRFX_TIMER1_INST_IDX' undeclared here (not in a function)
in definition of macro 'NRFX_CONCAT_3_'
in expansion of macro 'NRFX_CONCAT_3'
in expansion of macro 'NRFX_TIMER_INSTANCE'
in expansion of macro 'NRF_DRV_TIMER_INSTANCE'
in expansion of macro 'APP_PWM_INSTANCE'
Build failed
Ошибка указывает на строку, которая определяет.instance_id
Есть идеи, почему это происходит?
2 ответа
NRFX_CONCAT_3
(как по названию, так и по выводу ошибки) является макросом, который создает символ путем объединения трех компонентов. Полученный сгенерированный символ не определен.
Возможно, он определен в каком-то другом заголовке, который вы не включили, или имеется некоторая условная компиляция, которая означает, что искомое определение исключено, или, возможно, для вашей цели нет экземпляра таймера 3.
Найти определение для NRFX_TIMER1_INST_IDX
и определить, включен ли файл и в какой конфигурации он определен.
Найдите заголовок файла sdk_config.h и #define NRFX_TIMER1_ENABLED 1. Я решил это.