ESP8266 SDK開發: 外設篇-系統任務(消息隊列,通知)


<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn8266ForSDK" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

 

說明

咱先使用一下這個功能,然后再說明使用這個功能的應用場合

 

寫上以下程序

 

 

#define os_event_t_buff_len 255 /*消息隊列長度;最大255*/
os_event_t    os_event_t_buff[os_event_t_buff_len]; //存儲消息的數組
#define TaskPrio 2 //任務等級(0,1,2),2是最高等級

os_timer_t os_timer_one;//定義軟件定時器結構體變量

 

//定時器回調函數
void os_timer_one_function(void *parg){
    //把消息插入隊列(sig=0;par=0)
    system_os_post(TaskPrio, 0, 0);
}
/* 系統有空余時間的時候會取出消息隊列里面的消息
  如果有消息則會調用其回調函數 */
void os_task_t_callback(os_event_t *events){
    if(events->sig == 0 && events->par ==0){
        os_printf("os_task_t_callback\r\n");
    }
}

 

uart_init_2(BIT_RATE_115200,BIT_RATE_115200);
    //os_task_t_callback:任務回調函數  //TaskPrio:任務等級(0,1,2),2是最高等級
    //os_event_t_buff:消息隊列記錄的數組   //os_event_t_buff_len  消息隊列長度
    system_os_task(os_task_t_callback, TaskPrio, os_event_t_buff, os_event_t_buff_len);

    //配置定時器
    os_timer_setfn(&os_timer_one,os_timer_one_function,NULL);//os_timer_one:定時器結構體變量    os_timer_one_function:回調函數    yang:傳給回調函數的參數
    //使能定時器
    os_timer_arm(&os_timer_one,1000,1);//os_timer_one:定時器變量        1:1s進一次    1:循環

 

下載到開發板以后,打開串口調試助手

會看到程序每隔1S打印 os_task_t_callback

 

 

 

關於ESP8266的系統任務

ESP8266內部可以運行消息隊列任務.總共可以創建3個消息隊列任務

創建任務:

調用創建消息隊列任務函數的時候設置好任務的回調函數, 任務的消息等級, 緩存隊列消息的數組.

下面是固定的形式哈,就是這樣子寫.

 

 

把消息插入消息隊列:

第一個參數 TaskPrio填寫的是任務消息等級;

后面的兩個參數是 0- 4294967296之間的數

后面是把0,0插入了消息隊列.第一個0設置的是消息隊列sig值; 第二個0設置的是消息隊列par的值.

 

 

 

 

系統有空的時候就從消息隊列里面取出數據,然后調用回調函數:

 

 

 

 

假設需要在適當的時候發送個通知關閉定時器

system_os_post可以寫到任意地方,我下面只是演示,就放到了定時器里面

假設咱設置sig為1;par為1的時候用來關閉定時器

 

 

 

 

在網絡通信的時候,官方也是建議使用系統消息隊列的形式關閉網絡連接

 

 

 

使用任務代替定時器

定時器只能定時在5ms和100us的級別;而且經過測試,頻繁的定時器會影響到網絡信號的傳輸.

 

 

如果需要輪訓,可以使用下面的方式

 

 

輪訓一次任務的時間基本上是固定的,可以使用變量累加來執行定時操作

 

 

 

停止輪訓

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM