现象
在我们使用Nordic的nrf5_SDK进行开发时,如果要使用freeRTOS,一般会从例子中的examples\ble_peripheral\ble_app_hrs_freertos开始。
在宏定义中NRF_SDH_DISPATCH_MODEL可以选择三种:
// <0=> NRF_SDH_DISPATCH_MODEL_INTERRUPT
// <1=> NRF_SDH_DISPATCH_MODEL_APPSH
// <2=> NRF_SDH_DISPATCH_MODEL_POLLING
如果我们不更改,按照默认的设置NRF_SDH_DISPATCH_MODEL_POLLING 则可以接着往下开发。
如果我们将其更改为NRF_SDH_DISPATCH_MODEL_POLLING 后,就会提示Symbol SWI2_EGU2_IRQHandler multiply defined的错误。
// <h> Dispatch model
// <i> This setting configures how Stack events are dispatched to the application.
//==========================================================
// <o> NRF_SDH_DISPATCH_MODEL
// <i> NRF_SDH_DISPATCH_MODEL_INTERRUPT: SoftDevice events are passed to the application from the interrupt context.
// <i> NRF_SDH_DISPATCH_MODEL_APPSH: SoftDevice events are scheduled using @ref app_scheduler.
// <i> NRF_SDH_DISPATCH_MODEL_POLLING: SoftDevice events are to be fetched manually.
// <0=> NRF_SDH_DISPATCH_MODEL_INTERRUPT
// <1=> NRF_SDH_DISPATCH_MODEL_APPSH
// <2=> NRF_SDH_DISPATCH_MODEL_POLLING
#ifndef NRF_SDH_DISPATCH_MODEL
#define NRF_SDH_DISPATCH_MODEL 0
#endif
// </h>
.\_build\nrf52832_xxaa.axf: Error: L6200E: Symbol SWI2_EGU2_IRQHandler multiply defined (by nrf_sdh_freertos.o and nrf_sdh.o).
- keil编译
- GCC编译
原因分析
实际上SWI2_EGU2_IRQHandler是SD_EVT_IRQHandler 经过多次重定义的原始值。
所以,重定义的是void SD_EVT_IRQHandler(void)这个函数。
解决方法
注释掉其中的一个void SD_EVT_IRQHandler(void)即可。
因为这个回调最终都是调用的nrf_sdh_evts_poll();,所以保留一个即可。
我的改法如下:
加入判断FREERTOS开关的一个宏定义来决定是否使用nrf_sdh.c里的SD_EVT_IRQHandler。
#if (NRF_SDH_DISPATCH_MODEL == NRF_SDH_DISPATCH_MODEL_INTERRUPT)
#if !defined(FREERTOS) // 在不使用freeRTOS时开启
void SD_EVT_IRQHandler(void)
{
nrf_sdh_evts_poll();
}
#endif