<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的級別;而且經過測試,頻繁的定時器會影響到網絡信號的傳輸.
如果需要輪訓,可以使用下面的方式
輪訓一次任務的時間基本上是固定的,可以使用變量累加來執行定時操作
停止輪訓