• esp8266 Task任务创建与执行


    ⽤户任务可以分为三个优先级:0、1、2。任务优先级为 2 > 1 > 0。

     函数/任务的区别:

    •调用函数:立即进入该函数,执行函数语句,实现函数功能

    •安排任务:给系统安排任务,当系统空闲时,才会执行任务。

    system_os_task  创建系统任务

     system_os_post  给系统安排任务

    在创建任务和给系统安排任务之前,需要设置消息队列深度。

    • 消息队列深度有什么作用呢?
    • 答:假设我现在给系统安排了一个任务,在系统还没来得及执行这个任务之前,又给它安排了另外一个任务,那么他会不会接受第二个任务呢?这就要取决于消息队列深度了,在这里我将消息队列深度设置为2,也就是说如果系统有一个未执行的任务,现在我又给它发送了第二个任务,他将接受第二个任务那么他空闲的时候,会依次接受这两个任务,那么如果系统有两个未执行的任务,我又给它发了第三个任务,那么他将丢弃第三个任务,也就是说当他空闲的时候,他只会执行前两个任务。
    #define		MESSAGE_QUEUE_LEN	2	// 消息队列深度(对于同一个任务,系统最多接受的叠加任务数)
    
    • 接下来定义任务指针
    1. // 全局变量
    2. //=========================================================
    3. os_event_t * Pointer_Task_1 ; // 定义任务1(串口打印任务) // 第①步:定义任务指针

     我们来看下任务结构体----两个成员一个sig一个par

    1. typedef struct ETSEventTag ETSEvent;
    2. struct ETSEventTag {
    3. ETSSignal sig;
    4. ETSParam par;
    5. };
    • 接下来我们需要为任务分配内存
    • (sizeof(os_event_t))*MESSAGE_QUEUE_LEN  意思是任务结构体大小乘上了队列深度就是任务需要的空间大小
    • os_malloc 向系统申请相应大小的内存
    • (os_event_t*)将内存的首地址强制转换为任务指针赋值给刚才定义的任务指针Pointer_Task_1
    1. // 给任务1分配空间(任务1空间 = 1个队列空间 * 队列数) // 第②步:为任务分配内存
    2. //-------------------------------------------------------------------------------
    3. Pointer_Task_1=(os_event_t*)os_malloc((sizeof(os_event_t))*MESSAGE_QUEUE_LEN);
    •  任务执行函数(形参:类型必须为【os_event_t *】)        第③步:创建任务函数
    1. void Func_Task_1(os_event_t * Task_message) // Task_message = Pointer_Task_1
    2. {
    3. // Task_message->sig=消息类型、Task_message->par=消息参数 // 第⑥步:编写任务函数(根据消息类型/消息参数实现相应功能)
    4. //--------------------------------------------------------------------------------
    5. os_printf("消息类型=%d,消息参数=%c\r\n",Task_message->sig, Task_message->par);
    6. }
    •  创建任务(参数1=任务执行函数 / 参数2=任务等级 / 参数3=任务空间指针 / 参数4=消息队列深度)    第④步:创建任务
    system_os_task(Func_Task_1, USER_TASK_PRIO_0, Pointer_Task_1, MESSAGE_QUEUE_LEN);

     创建完任务后,我们就可以给系统安排任务了,调用给系统安排任务的API

    system_os_post(USER_TASK_PRIO_0, Message_Type++, Message_Para++);	// 第⑤步:给系统安排任务
    • 任务执行函数Func_Task_1的形参Task_message任务指针指向的成员sig(Task_message->sig)就是接收上面代码中参数二消息类型所传过来的值,任务指针指向的成员par,他接收的是参数三消息参数所传递过来的值

    接下来看看user_init函数全貌 

    1. void ICACHE_FLASH_ATTR user_init(void)
    2. {
    3. u8 C_Task = 0 ; // 调用任务计数
    4. u8 Message_Type = 1; // 消息类型
    5. u8 Message_Para = 'A'; // 消息参数
    6. uart_init(115200,115200); // 初始化串口波特率
    7. os_delay_us(10000); // 等待串口稳定
    8. os_printf("\r\n=================================================\r\n");
    9. os_printf("\t Project:\t%s\r\n", ProjectName);
    10. os_printf("\t SDK version:\t%s", system_get_sdk_version());
    11. os_printf("\r\n=================================================\r\n");
    12. // 给任务1分配空间(任务1空间 = 1个队列空间 * 队列数) // 第②步:为任务分配内存
    13. //-------------------------------------------------------------------------------
    14. Pointer_Task_1=(os_event_t*)os_malloc((sizeof(os_event_t))*MESSAGE_QUEUE_LEN);
    15. // 创建任务(参数1=任务执行函数 / 参数2=任务等级 / 参数3=任务空间指针 / 参数4=消息队列深度) // 第④步:创建任务
    16. //-----------------------------------------------------------------------------------------
    17. system_os_task(Func_Task_1, USER_TASK_PRIO_0, Pointer_Task_1, MESSAGE_QUEUE_LEN);
    18. // 调用4次任务
    19. //--------------------------------
    20. for(C_Task=1; C_Task<=4; C_Task++)
    21. {
    22. system_soft_wdt_feed(); // 喂狗,防止复位
    23. delay_ms(1000); // 延时1秒
    24. os_printf("\r\n安排任务:Task == %d\r\n",C_Task);
    25. // 调用任务(参数1=任务等级 / 参数2=消息类型 / 参数3=消息参数)
    26. // 注意:参数3必须为无符号整数,否则需要强制类型转换
    27. //---------------------------------------------------------------
    28. system_os_post(USER_TASK_PRIO_0, Message_Type++, Message_Para++); // 第⑤步:给系统安排任务
    29. }
    30. os_printf("\r\n------------------ user_init OVER ----------------\r\n\r\n");
    31. }

    系统只保留了前两次任务,第三第四次被丢弃

     

     

  • 相关阅读:
    pacemaker常用命令
    try - catch 语句真的会影响性能吗?
    算法之迪杰斯特拉(dijkstra)形象化
    HTTP响应的过程
    Node.js 学习笔记
    Pyqt组合控件与QSpacerItem指南
    基于物联网的花卉养殖监控设计系统与研究
    猫头虎博主赠书二期:《Go黑帽子 渗透测试编程之道(安全技术经典译丛) 》
    TCP IP网络编程(三) 地址族与数据序列
    968. 监控二叉树
  • 原文地址:https://blog.csdn.net/Paradise_Violet/article/details/125893699