如何在唤醒时在唤醒时使用ke_timer
ke_timer的想法是使用BLE定时器的使用,并将BLE定时器中断转换为KE_MESSAGE并发送到相应的任务消息队列。
KE_TIMER机制需要主循环计划,主循环计划需要BLE处于活动状态。
在某些应用程序中,系统将在等待外部唤醒的永久睡眠中进入,这将关闭BLE。
CPU唤醒后,CPU将通过key_ble_up()唤醒ble。此功能将写入某些寄存器来发出BLE Wakeup Req。
在几个中断后,BLE最终将活跃,一旦在此阶段设置BLE定时器,系统将获得异常的BLE定时器行为。
在随机睡眠唤醒后,几个客户遇到了Ke_timer并没有正常工作,或者一些客户仅在没有启用睡眠的情况下申请它的设计很好。
该现象是一定的计时器(10s)将发生在随机时间戳中,有时在3s,6s,8s,甚至100ms之后,或者没有执行。
我们标识对话框SDK /参考设计有一个规则要遵循,以确保BLE_TIMER获得正确的编程和定时消息处理程序在唤醒之后正确执行。
在HID参考中,我们以下描述以确保在IDLE_ST开始后确保BLE定时器运行。
****************************************************************************************
@brief handler的虚拟任务_app msg发送到触发Adv Timer
如果从IDLE_ST开始的广告,则将伪消息发送到TASK_APP。
当BLE被唤醒时,此MSG将放入队列中。当处理程序被调用时,
确保BLE正在运行并且定时器可以启动。
*
*
@return ke_msg_consumed.
****************************************************************************************
* /
int app_start_adv_msg_handler(ke_msg_id_t const msgid“
在SDK 3.0.6中,我们有类似的唤醒消息,
//唤醒这里的ble
#if(ext_sleep_enabled)
app_set_extended_sleep();
#elif(deep_sleep_enabled)
app_set_deep_sleep();
#别的
app_disable_sleep();
#万一
setbits32(gp_control_reg,ble_wakeup_req,1);
app_ble_ext_wakeup_off();
ke_msg_send_basic(app_wakeup_msg,task_app,null);
只有在app_wakeup_msg句柄获取后,ke_timer应该只启动。
我们通常会遇到这种情况,因为这种情况很容易发生,低于WakeUp回电的代码将触发此案例:
start_adv_undirected();//邮件句柄将仅在CPU运行到主循环之后执行
app_timer_set(app_hid_adv_timer,task_app,avd_key_press_to);//表示,App_Timer_Set将在任何MSG实际执行的消息之前运行,这实际上将在BLE处于活动状态之前编程BLE定时器。
解决方法
我们已经完成了app_setup_timer的扩展名。它检查BLE是否处于活动状态,如果没有,它将自动生成消息并自动设置计时器。
此解决方法还有一个限制,以确保未发送重复的Dummy App_Create_New_Timer。
uint8_t app_check_ble_active(void)
{
返回((getBits16(clk_radio_reg,ble_enable)== 1)&&
(getBits32(BLE_DEEPSLCNTL_REG,Deep_sleep_stat)== 0)&&
!(rwip_prevent_sleep_get()&rw_wake_up_ongoing)));
}
int app_create_new_timer(ke_msg_id_t const msgid,
const struct create_new_timer_struct * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
ke_timer_set(param-> timer_id,param-> task_id,param-> delay);
return(ke_msg_consumed);
}
/ **
****************************************************************************************
* @brief开始一个内核计时器
*
* @return void.
****************************************************************************************
* /
void app_timer_set(ke_msg_id_t const timer_id,ke_task_id_t const task_id,uint16_t延迟)
{
//延迟不得超过最大允许
if(delay> ke_timer_delay_max)
{
delay = ke_timer_delay_max;
}
//延迟不应为零
否则if(delay == 0)
{
延迟= 1;
}
if(app_check_ble_active()))
ke_timer_set(timer_id,task_id,延迟);
别的
{
app_ble_force_wakeup();// key_up ble.
//在执行之前发送消息等待BLE在执行之前醒来
struct create_new_timer_struct * req = ke_msg_alloc(app_create_new_timer,task_app,task_app,
create_new_timer_struct);
req->延迟=延迟;
req-> task_id = task_id;
req-> timer_id = timer_id;
KE_MSG_SEND(REQ);
}