MCU小型调度OS之三:任务调度机制

一、结构体类型:

        图1

          图2

        如上图1,task_list是任务节点的结构体,具体参数如下:

        1、task_id是任务ID,一般对某个任务操作时用来区分具体哪个任务;

        2、stat是任务的当前状态,状态类型如图2,三种状态依次为挂起休眠,就绪运行,超时;

        3、pointer是当前运行指针,一般当做状态机来用,区分当前运行到具体哪个位置;

        4、task_timer是任务定时器,上个篇章说过,每个任务都会挂在一个定时器的节点,该定时器的主要功能就是为了处理当前任务的信号量超时、队列超时、定时唤醒能业务功能;

        5、function是任务回调函数,一般当前任务状态就绪时,会调用;

        6、p_arg是运行任务回调函数时传入的参数;

        7、next是任务链表里的下一个任务节点。

二、初始化

         图3

          图4

         如上图3,每个任务创建的时候,做以下动作:

         1、该任务的stat赋值就绪运行状态,创建好之后就会进入任务回调函数;

         2、每个任务创建时候,会创建相应关联的定时器,该定时器ID改成任务ID+0xff00,跟硬定时器ID错开;

         3、该任务关联的定时器初始化时,超时函数都是同一个,TaskOverTimerCallback,该数据传入的参数是初始化时绑定的任务结构体(后面会有介绍),定时器超时时把所绑定任务结构体状态改成OS_STAT_TIMEOUT,这个主要作用就是为了实现后面的每个任务信号量超时、队列超时、定时唤醒能业务功能。

三、任务调度

         图5

         如上图5,主程序里面遍历任务节点链表,如果当前任务节点的stat不是OS_STAT_SUSPEND(可能是OS_STAT_RDY或者OS_STAT_TIMEOUT)都运行该任务函数,然后遍历下一个任务节点。

         图6

         如上图6,遍历每个任务节点链表,判断当前stat,如果非suspend就运行,在其他地方可以通过任务ID对任何一个任务的状态进行修改,假设信号量或者休眠定时唤醒某一个任务时,比如图4,把该ID的任务状态改成OS_STAT_SUSPEND,并开启定时器,如果这段时间没有其他打断,在超时函数里对该任务stat进行修改,修改为超时,下一次轮询任务stat时就会运行。如果在超时期间,有其他工作打断,比如信号量或者突然唤醒等,会停止该定时器。如下图7:

         图7

         这样我们就可以任意挂起与唤醒任意任务,并且有超时阻塞的功能。至于具体的信号量与队列的使用和原理,下面会进行详解。

        调度系统下载链接如下: https://download.csdn.net/download/moonlinux20704/12073629

        

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ESP32上使用FreeRTOS进行任务调度非常简单。首先,你需要创建任务并设置其参数,例如任务函数、任务优先级等。然后,你可以使用调试工具来监视和分析任务的执行情况。 在创建任务之前,你需要准备好硬件和软件。硬件方面,你需要一个NodeMCU ESP32-S V3.0开发板和一条数据线。软件方面,你需要安装vscode和ESP-IDF的vscode扩展。 在代码中,你可以使用FreeRTOS的API函数来创建和管理任务。任务的创建需要指定任务函数,该函数将在任务被调度时执行。你还可以设置任务的优先级以及其他参数。 在任务调度期间,FreeRTOS会根据任务的优先级来决定执行哪个任务。较高优先级的任务将优先执行,而较低优先级的任务将在较高优先级任务执行完毕后才执行。这样可以确保任务按照一定的顺序和优先级进行调度,以满足系统的需求。 总结来说,使用ESP32上的FreeRTOS进行任务调度需要先创建任务并设置参数,然后使用调试工具进行监视和分析。硬件和软件准备也是必要的。最后,在任务调度期间,任务的执行顺序将根据其优先级确定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ESP32 FreeRTOS-任务的创建与删除 (1)](https://blog.csdn.net/believe666/article/details/127175049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [ESP32-IDF开发实例-FreeRTOS任务优先级](https://blog.csdn.net/wujuxKkoolerter/article/details/117655266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值