蓝牙Soc调度机制

pengam · 1511次点击 · 2023-06-17

1、应用层私有的调度任务可以放置在user_schedule()里面实现,代码如下:

int main(void)
{
   ble_stack_config();
   rwip_init()    //om_ble_enable();
   co_power_register_user_status(power_sleep_status_handler);
   co_power_register_sleep_event(power_sleep_event_handler);
   while(1)
   {
    rwip_schedule();
    user_schedule();
   }
}

2、需要确保能执行到user_schedule(),必须在power_sleep_status_handler()中将user_power_status设置为POWER_ACTIVE,否则芯片则可能会因没有任何任务了而进入Sleep或者WFI,此时芯片只会在底层有中断或其它事件才会退出Sleep、WFI去执行user_schedule();

需要注意POWER_ACTIVE也会阻止芯片睡眠且CPU一直在运行,如果应用层需要让芯片可以进入休眠,则需要更改user_power_status的值为POWER_SLEEP(或POWER_DEEP_SLEEP、POWER_SHUTDOWN);

static co_power_status_t power_sleep_status_handler(void)
{
    co_power_status_t user_power_status=POWER_ACTIVE;
    return MIN(user_power_status, pmu_power_status());
}

3、软定时器co_timer以及消息处理,都是在rwip_schedule_event()里面;

4、在power_sleep_event_handler()中POWER_SLEEP_LEAVE_TOP_HALF中需要将一些会使用到高速时钟的外设(比如UART、硬件timer等)重新设置一次(因为sleep后外设掉电,休眠前的配置都已丢失),对应函数peripheral_restore();不可在这个函数内放置uart的打印信息,可能无法工作,因为休眠会关闭一些外设;

static void power_sleep_event_handler(co_power_sleep_state_t sleep_state, co_power_status_t power_status)
{
    switch(sleep_state)
    {
        case POWER_SLEEP_ENTRY:
            break;
        case POWER_SLEEP_LEAVE_TOP_HALF:
            peripheral_restore(); 
            break;
        case POWER_SLEEP_LEAVE_BOTTOM_HALF:
            break;
    }
}

5、om_ble_enable()为OM6621E的初始化协议栈,HS6621x系列的初始化协议栈是rwip_init();

      GAPM_RESET为HS6621x系列的复位协议栈,而OM6621E不需要复位协议栈;

6、rwip_schedule_event()在底层,应用层看不到,对应的OM6621E该函数名称是co_sche_once();

7、rwip_schedule()是HS6621x系列的调度函数,对应的OM6621E该函数需要这2个函数组成co_sche_once();co_power_manage();

8、OM6621E的co_sche(); 底层是由下面代码实现的 

   while(1) {

      co_sche_once();  

      co_power_manage(); 

}



芯片调度机制.jpg


被收藏 1  ∙  4 赞  
加入收藏
点赞
14 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站