函数/任务的区别:
•调用函数:立即进入该函数,执行函数语句,实现函数功能
•安排任务:给系统安排任务,当系统空闲时,才会执行任务。
system_os_task 创建系统任务

system_os_post 给系统安排任务

在创建任务和给系统安排任务之前,需要设置消息队列深度。
- 消息队列深度有什么作用呢?
- 答:假设我现在给系统安排了一个任务,在系统还没来得及执行这个任务之前,又给它安排了另外一个任务,那么他会不会接受第二个任务呢?这就要取决于消息队列深度了,在这里我将消息队列深度设置为2,也就是说如果系统有一个未执行的任务,现在我又给它发送了第二个任务,他将接受第二个任务那么他空闲的时候,会依次接受这两个任务,那么如果系统有两个未执行的任务,我又给它发了第三个任务,那么他将丢弃第三个任务,也就是说当他空闲的时候,他只会执行前两个任务。
#define MESSAGE_QUEUE_LEN 2 // 消息队列深度(对于同一个任务,系统最多接受的叠加任务数)
- 接下来定义任务指针
- // 全局变量
- //=========================================================
- os_event_t * Pointer_Task_1 ; // 定义任务1(串口打印任务) // 第①步:定义任务指针
![]()
- typedef struct ETSEventTag ETSEvent;
-
- struct ETSEventTag {
- ETSSignal sig;
- ETSParam par;
- };
- 接下来我们需要为任务分配内存
- (sizeof(os_event_t))*MESSAGE_QUEUE_LEN 意思是任务结构体大小乘上了队列深度就是任务需要的空间大小
- os_malloc 向系统申请相应大小的内存
- (os_event_t*)将内存的首地址强制转换为任务指针赋值给刚才定义的任务指针Pointer_Task_1
- // 给任务1分配空间(任务1空间 = 1个队列空间 * 队列数) // 第②步:为任务分配内存
- //-------------------------------------------------------------------------------
- Pointer_Task_1=(os_event_t*)os_malloc((sizeof(os_event_t))*MESSAGE_QUEUE_LEN);
- 任务执行函数(形参:类型必须为【os_event_t *】) 第③步:创建任务函数
- void Func_Task_1(os_event_t * Task_message) // Task_message = Pointer_Task_1
- {
- // Task_message->sig=消息类型、Task_message->par=消息参数 // 第⑥步:编写任务函数(根据消息类型/消息参数实现相应功能)
- //--------------------------------------------------------------------------------
-
- os_printf("消息类型=%d,消息参数=%c\r\n",Task_message->sig, Task_message->par);
-
- }
- 创建任务(参数1=任务执行函数 / 参数2=任务等级 / 参数3=任务空间指针 / 参数4=消息队列深度) 第④步:创建任务
system_os_task(Func_Task_1, USER_TASK_PRIO_0, Pointer_Task_1, MESSAGE_QUEUE_LEN);
system_os_post(USER_TASK_PRIO_0, Message_Type++, Message_Para++); // 第⑤步:给系统安排任务
- 任务执行函数Func_Task_1的形参Task_message任务指针指向的成员sig(Task_message->sig)就是接收上面代码中参数二消息类型所传过来的值,任务指针指向的成员par,他接收的是参数三消息参数所传递过来的值
- void ICACHE_FLASH_ATTR user_init(void)
- {
- u8 C_Task = 0 ; // 调用任务计数
- u8 Message_Type = 1; // 消息类型
- u8 Message_Para = 'A'; // 消息参数
-
-
- uart_init(115200,115200); // 初始化串口波特率
- os_delay_us(10000); // 等待串口稳定
- os_printf("\r\n=================================================\r\n");
- os_printf("\t Project:\t%s\r\n", ProjectName);
- os_printf("\t SDK version:\t%s", system_get_sdk_version());
- os_printf("\r\n=================================================\r\n");
-
-
- // 给任务1分配空间(任务1空间 = 1个队列空间 * 队列数) // 第②步:为任务分配内存
- //-------------------------------------------------------------------------------
- Pointer_Task_1=(os_event_t*)os_malloc((sizeof(os_event_t))*MESSAGE_QUEUE_LEN);
-
- // 创建任务(参数1=任务执行函数 / 参数2=任务等级 / 参数3=任务空间指针 / 参数4=消息队列深度) // 第④步:创建任务
- //-----------------------------------------------------------------------------------------
- system_os_task(Func_Task_1, USER_TASK_PRIO_0, Pointer_Task_1, MESSAGE_QUEUE_LEN);
-
-
- // 调用4次任务
- //--------------------------------
- for(C_Task=1; C_Task<=4; C_Task++)
- {
- system_soft_wdt_feed(); // 喂狗,防止复位
-
- delay_ms(1000); // 延时1秒
- os_printf("\r\n安排任务:Task == %d\r\n",C_Task);
-
- // 调用任务(参数1=任务等级 / 参数2=消息类型 / 参数3=消息参数)
- // 注意:参数3必须为无符号整数,否则需要强制类型转换
- //---------------------------------------------------------------
- system_os_post(USER_TASK_PRIO_0, Message_Type++, Message_Para++); // 第⑤步:给系统安排任务
- }
-
- os_printf("\r\n------------------ user_init OVER ----------------\r\n\r\n");
- }
系统只保留了前两次任务,第三第四次被丢弃