on_ble_powered()回调

了解更多常见问题教程

4新职位/ 0
最后发表
mkelwood
离线
最后看到:4个月2周前
加入:2017-05-19的人们
on_ble_powered()回调

我们有一个应用程序,其中主机单片机发送一个4 k页面的数据DA14585每~ 6.3秒通过SPI接口。然后DA14585继电器这些数据通过广播通知。页面之间,我们进入睡眠模式,和主单片机醒来DA14585使用唤醒定时器。通过DMA SPI数据接收,DMA完成硬中断请求优先级别处理程序然后帖子自定义消息内核启动nofications和回到睡眠。这一切似乎工作得很好,除了如下:

内核消息似乎只有通过DMA IRQ时如果BLE核心活动执行处理程序(实际上回调)和消息发送。阅读部分7.1.2 SW平台的参考建议与祝福核心信息需要同步。我推断的目的,这是on_ble_powered()回调。我修改了代码在DMA IRQ设置一个标记处理程序,然后检查的国旗on_ble_powered()回调函数。如果设置了国旗,我发送消息启动通知/特征值更新和清晰的国旗。

然而,有了这段代码,甚至DA14585未能做广告了。为什么要添加一个on_ble_powered()回调代码打破?有更好的方法来“同步BLE核心”当一个异步事件需要发送消息?

下面是相关的函数:

DMA完成回调函数:
静态孔隙epilog_spi_dma_done (void *用户数据,uint16_t len)
{
为蓝牙* / / *准备数据
eeg_rt。数据= rteeg_buffer;
memcpy (&eeg_rt。pageaddr, spi。parmbuf BTSPI_PARM_LEN);

* / / *复位SPI状态
spi_reset_state ();
spi_int_bit_clear ();
NVIC_ClearPendingIRQ (SPI_IRQn);
spi_enable_irq ();

RTPageReady = true;
/ / epilog_spi_send_page_done_msg (&eeg_rt rteeg_buffer + EEG_PAGE_SIZE);
}

on_ble_powered()回调:
arch_main_loop_callback_ret_t send_page_on_ble_powered(空白)
{
如果(RTPageReady) {
epilog_spi_send_page_done_msg (&eeg_rt rteeg_buffer + EEG_PAGE_SIZE);
RTPageReady = false;
}

返回KEEP_POWERED;
}

页面发送功能:
静态孔隙epilog_spi_send_page_done_msg (struct eegdata *脑电图,uint8_t * evt)
{
struct msg_page_done * msg_param;

msg_param = KE_MSG_ALLOC (APPMSG_PAGE_RECEIVED TASK_APP TASK_APP,
msg_page_done);

msg_param - >脑电图=脑电图;
msg_param - > evt = evt;

ke_msg_send (msg_param);
}

最后,从user_catch_rest_hndl剪断()函数来处理APPMSG_PAGE_RECEIVED味精:
案例APPMSG_PAGE_RECEIVED:
{
struct msg_page_done * msg_param = (struct msg_page_done *)参数;
uint8_t状态= ke_state_get (TASK_APP);

如果(状态= = APP_CONNECTED) {
eegdata_start_notify (msg_param - >脑电图);
eegevent_start_notify (msg_param - >脑电图,msg_param - > evt);
}

/ * * /重新启用睡眠模式
app_enable_wakeup ();/ *设置wkupct * /
arch_set_extended_sleep(假);

}
打破;

提前感谢你能提供任何建议。

关键词:
设备:
MT_dialog
离线
最后看到:3天6小时前
工作人员
加入:2015-06-08 34
嗨mkelwood,

嗨mkelwood,

你是正确的调度信息和设备只安排而祝福时主动和核心rwip_schedule()函数执行。消息可以发送asychornously向堆栈但他们将同步rwip_schedule时被执行。我不要看到什么毛病代码发布,似乎好了。你不能做广告虽然应该是其他的东西,我的意思是,据我所知从代码一旦设备开始广告代码将穿过on_ble_powered国旗应该是假的所以没有额外的代码将运行在广告过程。所以我不认为on_ble_powered中的代码()是影响广告的functionallity,别的应该。检查什么设备。检查广告完成回调是否得到调用,并检查广告的原因取消,如果取消广告。也据我所知你总是返回KEEP_POWER不仅如果你有数据,这将让你的设备保持活跃,不会允许它去睡觉。

由于MT_dialog

mkelwood
离线
最后看到:4个月2周前
加入:2017-05-19的人们
这在调试器中运行,

这在调试器中运行,很明显,敝中断处理程序被绊倒,表明看门狗定时器已经过期了。添加一个watchdog_reload()的开始on_ble_powered恢复BLE函数()处理程序。显然即使非常短on_ble_powered监督()处理程序太长。

谢谢你的澄清,可以将消息发送到内核异步,虽然他们不会处理直到BLE核心。这将是对我们的应用程序,所以我不需要on_ble_powered毕竟()处理程序;我可以发送消息到内核的尾端dma完成处理程序。在这个问题上,我希望文档更清楚——这意味着你甚至不能然后祝福核心时发送消息。

看来我的真正的问题是在SPI通信处理程序。我将开始另一个线程如果我需要答案。再次感谢。

MT_dialog
离线
最后看到:3天6小时前
工作人员
加入:2015-06-08 34
嗨mkelwood,

嗨mkelwood,

很高兴它帮助。

MT_dialog问好