任务Tasks实验
上一节RTOS工程创建已经讲了任务创建,我们来具体的看一下各个参数的细节什么意思,怎么改写吧~
1. 什么是任务
可以观察下图,在FreeRTOS中,任务(Task)是指可独立运行的基本执行单元。任务是并发执行的最小单位,每个任务都有自己的代码逻辑和资源。
在FreeRTOS中,任务由操作系统调度,采用抢占式调度策略。每个任务都有自己的优先级,并且任务的优先级决定了它们在调度时的执行顺序。操作系统会根据任务的优先级和调度算法,将CPU时间片分配给不同的任务,使得系统中的任务能够并发执行。(参考链接)
任务分为四种状态:(参考链接)
运行态
当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在 使用处理器的任务。如果使用的是单核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。
就绪态 处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起),可以运行的任务, 但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!
阻塞态 如果一个任务当前正在等待某个9外部事件的话就说它处于阻塞态,比如说如果某个任务调 用了函数 vTaskDelay()的话就会进入阻塞态,直到延时周期完成。任务在等待队列、信号量、事件组、通知或互斥信号量的时候也会进入阻塞态。任务进入阻塞态会有一个超时时间,当超过 这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!
挂起态 像阻塞态一样,任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间。任务进入和退出挂起态通过调用函数 vTaskSuspend()和 xTaskResume()。
2. 代码说明
上一节创建工程模板,已经说了怎么创建工程和创建任务了,这一节我们讲一下一些API的说明和一些参数说明。
我们首先来到上一节创建好的工程,进入初始化的部分,我们先不讲底层,底层大家自行看,我们先讲如何快速使用,上手做项目。
首先来到freertos.c
, 首先在文件顶部定义了LED_TaskHandle
这种句柄, 其参数应该很明显,分别是任务的名字,任务的给定分配栈的大小,以及任务的优先级:
osThreadId_t LED_TaskHandle;
const osThreadAttr_t LED_Task_attributes = {
.name = "LED_Task",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityLow1,
};
[!Warning|style:flat|label:Warning 注意|iconVisibility:visible] 注意,栈的大小的分配,没给够会卡死!!但给多了浪费~
再看到MX_FREERTOS_Init()
函数中, 可以看到有注册Task的。设定了一个函数,一个传参为NULL,一个句柄。
LED_TaskHandle = osThreadNew(LedTaskFunc, NULL, &LED_Task_attributes);
如此,你就学会了如何创建任务啦~
代码底层的细节,需要大家自己去看哦~