Почему я получаю ошибки после вставки функций в пример кода?

Извинения за невероятно смутное название; Я постараюсь быть более конкретным здесь.

Я разрабатываю программу на микроконтроллере 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. Я решил это.

Другие вопросы по тегам