你好,
我们开发了一个响应按钮中断的程序,类似于SleepMode和Prox_reporter程序。
在我们的案例中,该计划永远不会睡眠 - 它始终是广告或在后台进行计时器,以重新启动未来广告。按下按钮时,我们希望更改广告的有效载荷并停止响应按钮几秒钟(即忽略多次按下或双击)。
我们注意到SleepMode程序具有单个回调以响应按钮事件(由wkupct_register_callback设置的user_app_button_press_cb),但prox_reporter有2个回调:app_button_press_cb由wkupct_register_callback和app_wakeup_cb设置,由app_easy_wakeup_set设置。
在Prox_Reporter中,App_button_press_cb呼叫似乎执行一些低级操作(periph_init,arch_set_sleep_mode,Arch_ble_force_wakeup,Arch_ble_ext_wakeup_off),然后调用app_easy_wakeup,它发送一个应该启动app_wakeup_cb的事件,该事件将启动app_wakeup_cb,这将开发高级逻辑。
我们假设需要双回调算法才能让系统完成其唤醒操作,或防止高级操作连续多次调用多次。出于某种原因,我们的app_wakeup_cb不会被调用(我们调试代码并注意到调用app_easy_wakeup(),但是之后不调用app_wakeup_cb ......)。
然后我们直接从user_app_button_press_cb(而不是调用app_easy_wakeup())调用app_wakeup_cb(),但我们不确定这是安全的。
不使用app_easy_wakeup的副作用是什么?我们的假设是否正确?为什么它缺少睡眠模型程序?您是否有类似的程序,该程序响应只需一次单击一次,即在按下按钮后禁用IRQ,并仅在几秒钟后重新启用IRQ?
我们注意到,在App_Button_Press_CB结束时,它会再次调用app_button_enable()。在我们的情况下,我们不想立即重新启动聆听按钮事件,因此我们删除了这一行。这可能是我们的问题,导致app_wakeup_cb不运行?
谢谢,
oren zomer.
嗨oren,
两个例子BLE_APP_SLEEPMODE和PERXIMITY RECORER遵循相同的过程才能退出永久睡眠模式,BLE_APP_SLEEPMODE调用APP_BUTTON_ENABLE()APP_EASY_WAKEUP_SET(APP_WAKEUP_CB);和wkupct_register_callback(app_button_press_cb);原因是因为如果直接从WKUPCT回调和BLE核心调用BLE操作,但仍然没有清醒,那么BLE操作不会被执行,这就是为什么有app_easy_wakeup_set()和app_easy_wakeup()的原因函数,以确保在BLE核心唤醒时将执行在为App_easy_wakeup_set()函数中注册的函数中的任何东西。我没有看到BLE_APP_SLEEPMODE中缺少的任何缺失,它们都注册了两个回调,以便从外部中断唤醒。关于您的问题不执行app_easy_wakeup()请确保已启用Corponding模块,转到user_modules_config.h文件,并确保Complude_dlg_msg的值设置为0,以便包含模块。
谢谢mt_dialog.