HS6621CG定时器事件调度
例程
生成一个定时器事件,每隔100毫秒运行一次函数
co_timer_t simple_timer;
void wifi_timer_handler(co_timer_t *timer, void *param)
{
/* 这里是定时器事件回调函数 */
}
int main(void)
{
/* 初始化 */
ble_stack_config();
hardware_init();
rwip_init(RESET_NO_ERROR);
co_power_register_sleep_event(power_sleep_event_handler); //低功耗回调函数
/* 包含广播 */
appm_init();
pmu_lowpower_prevent(PMU_LP_USER); //拒绝低功耗
/* 设置定时器事件 */
co_timer_set(&simple_timer, //定时器事件
100, //定时事件,单位ms
TIMER_REPEAT, //重复运行
wifi_timer_handler, //事件执行函数
NULL); //参数
while(1){
rwip_schedule();
}
}
一、Schedule
事件管理
1.先取出最高优先级 task 的消息事件,该消息从消息队列中 pop 出来
2.根据 task 的状态和消息 ID 来得到对应的 handler
3.执行该 handler 回调
4.根据回调的返回值对消息进行处理
1)如果返回 KE_MSG_CONSUMED,则内核free掉该消息。
2)如果返回 KE_MSG_NO_FREE,则内核不处理该消息,但该消息也不会重新放到消息队列,即内核不能再从消息队列中获得该消息。
3)如果返回 KE_MSG_SAVED,则内核不free该消息,并且将该消息重新入列。
二、TIMER
2.1 定时单位
1ms,RW内核提供一个定时器。对定时器的初始化等工作是在BLE初始化内部的,不需要用户编程设置。用户只需要调用RW内核的TIMER接口即可。
2.2 设置timer
/**
* @brief Setup a software timer with millisecond
*
* @param[in] timer the timer object (must be static or global variable)
* @param[in] delay it uint is 1ms
* @param[in] mode one shot or repeat
* @param[in] callback expire callback
* @param[in] param params
*
* @return false: Set timer fail;
* true: Set timer success
**/
bool co_timer_set(co_timer_t *timer, uint32_t delay, co_timer_mode_t mode,
co_timer_callback_t callback, void *param);
当时间到达时,RW 内核会发送 timer_id 到目标 task 的消息队列。当内核 schedule 时即会执行定时器相应的回调。
主函数中只有一个 rwip_schedule() 事件管理函数,所有动作都在定时器回调函数中执行,执行完成后才会执行下一次回调函数,串口中断,GPIO中断都能够响应。
- 初入职场的新人,网上这颗芯片的资料较少,这只是我在工程中自己的一些体会,如有不足之处还望多多包涵,也欢迎交流