如何在唤醒时在唤醒时使用ke_timer

如何在唤醒时在唤醒时使用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);

}