跳转到主要内容

处理应用程序(用户)任务中的消息

DA14585

1个月前

处理应用程序(用户)任务中的消息

发布的moguilevski60点 3回复
0的问题

你好PM_Dialog,

我正在研究一个应用程序,它将允许DA14585通过UART与另一个ARM处理器通信。当在广告事件之间启用延长睡眠模式时,通信应该可以与间隔为3秒的BLE广告同时进行。我使用SDK中的基本示例作为应用程序中与ble相关的部分的基础。在传入消息的情况下,DA14585被中断激活,触发以下回调函数:

void app_wkup_irq_cb(void) {SetBits16(WKUP_CTRL_REG, WKUP_ENABLE_IRQ, 1);if (GetBits16(SYS_STAT_REG, PER_IS_DOWN)){外围设置();} ke_msg_send_basic(INCOMING_UART_MSG, TASK_APP, 0);app_wkup_irq_init ();}

该函数向应用程序任务(TASK_APP)发送消息,UART消息的接收和处理应该作为user_catch_rest_hndl()的一种情况初始化。当唤醒回调函数被立即执行时,接收和处理只在后续的广告事件之后才会发生(s.图)。

图:当前广告期间

问题是:是否有办法立即处理发送到应用程序任务的消息——在下一个广告事件发生之前——然后回到延长睡眠模式?

在发送消息到TASK_APP之前,我尝试停止广告过程,使用以下函数:

app_easy_timer_cancel (app_adv_data_update_timer_used);app_easy_gap_advertise_stop ();

而不是在user_app_adv_undirect_complete()中重新启动广告,但是这个动作没有很好地工作。

1个月前

PM_Dialog

嗨moguilevski,

谢谢你的在线提问。

当DA14585处于休眠状态时,所有外围块都将断电(包括UART)。当芯片处于延长睡眠模式时,UART活动是不可能的。

所以,就我从你的帖子中所能理解的,你正在使用唤醒=唤醒控制器,以便在UART上有传入数据时唤醒设备。

如果设备处于活动模式,则可以立即处理数据。我假设您可以在唤醒回调函数app_wkup_irq_cb()中执行此操作。

请查看SDK的ble_app_sleepmode示例,它使用唤醒控制器来通过GPIO触发器唤醒。一旦设备被唤醒,就可以在回调中处理数据。

你使用HW流量控制(RTC/CTS)吗?

谢谢,PM_Dialog

1个月前

moguilevski 60点

嗨PM_Dialog,

非常感谢您的回复。

不,我不用流量控制。

GPIO触发器唤醒工作正常,唤醒回调函数立即执行。然而,使用回调函数来提供与另一个处理器的UART通信协议对我来说是一个相当不可取的选择。

我的问题更多的是关于广告中任务之间的交流。为什么立即向应用程序任务发送消息,

ke_msg_send_basic (INCOMING_UART_MSG TASK_APP 0);

但是在user_catch_rest_hndl()中对该消息的处理只有在下一个广告事件完成之后才会发生?

也许可以在唤醒回调中禁用广告,并在与另一个处理器的UART通信结束后重新启用它?

接受答案!

3周之前

PM_Dialog

嗨moguilevski,

关于这张论坛门票,我已经回复你:

//www.xmece.com/support-posts/delayed-processing-messages-user-application-task-during-advertising

谢谢,PM_Dialog