【Freertos基础教程】任务管理之基本使用

简介: 【Freertos基础教程】任务管理之基本使用

前言


本freertos是以stm32系列为操作的

任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任务的创建、删除、挂起、恢复和优先级控制等方面的内容。


一、freertos任务管理是什么?


当我们编写一个程序时,通常会有多个任务需要同时执行,比如说检测传感器数据、控制执行器、处理用户输入等等。而FreeRTOS就是一个帮助我们管理这些任务的工具。


任务管理就像是一个调度员,它知道每个任务应该在什么时候执行。它可以创建任务,就像给每个人分配一个工作一样。创建一个任务就相当于告诉系统:“嘿,我有一个任务需要完成,它需要做什么事情,有多重要,还有执行的顺序。”


而任务之间可能也会有一些协作和通信的需求,比如一个任务需要等待另一个任务完成某个操作才能继续执行。FreeRTOS也提供了一些机制,让任务之间可以方便地共享数据、同步操作。


任务管理还可以通过设置任务的优先级,告诉系统哪个任务更重要。例如,一个任务负责处理实时的数据,另一个任务负责打印日志,我们可以设置实时数据任务的优先级更高,这样它就会优先执行。同时,我们还可以暂停或恢复任务的执行,例如当不需要某个任务运行时,可以将其暂停,待需要时再恢复。


总而言之,FreeRTOS的任务管理帮助我们组织、调度和控制多个任务的执行,让我们的程序能够并发地运行,提高效率和可靠性。通过合理设置任务的创建、优先级、通信和同步,我们可以构建出更加复杂和功能强大的嵌入式系统。


二、任务管理涉及到的一些概念


以日常生活为例,比如这个母亲要同时做两件事:

喂饭:这是一个任务

回信息:这是另一个任务


1.任务状态

当前正在喂饭,它是running状态;另一个"回信息"的任务就是"not running"状态

"not running"状态还可以细分:

ready:就绪,随时可以运行

blocked:阻塞,卡住了,母亲在等待同事回信息

suspended:挂起,同事废话太多,不管他了


2.优先级

我工作生活兼顾:喂饭、回信息优先级一样,轮流做

我忙里偷闲:还有空闲任务,休息一下

厨房着火了,什么都别说了,先灭火:优先级更高


3.栈(Stack)

喂小孩时,我要记得上一口喂了米饭,这口要喂青菜了

回信息时,我要记得刚才聊的是啥

做不同的任务,这些细节不一样

对于人来说,当然是记在脑子里

对于程序,是记在栈里

每个任务有自己的栈


4.事件驱动

孩子吃饭太慢:先休息一会,等他咽下去了、等他提醒我了,再喂下一口


5.协助式调度(Co-operative Scheduling)

你在给同事回信息

同事说:好了,你先去给小孩喂一口饭吧,你才能离开

同事不放你走,即使孩子哭了你也不能走

你好不容易可以给孩子喂饭了

孩子说:好了,妈妈你去处理一下工作吧,你才能离开

孩子不放你走,即使同事连发信息你也不能走


二、任务的基本操作


1.创建任务

什么是任务

在FreeRTOS中,任务就是一个函数,原型如下:

void ATaskFunction( void *pvParameters );


要注意的是:

这个函数不能返回

同一个函数,可以用来创建多个任务;换句话说,多个任务可以运行同一个函数

函数内部,尽量使用局部变量:

每个任务都有自己的栈

每个任务运行这个函数时

任务A的局部变量放在任务A的栈里、任务B的局部变量放在任务B的栈里

不同任务的局部变量,有自己的副本

函数使用全局变量、静态变量的话

只有一个副本:多个任务使用的是同一个副本

要防止冲突(后续会讲)

下面是一个示例:

void ATaskFunction( void *pvParameters )
{
  /* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 */
  int32_t var = 0;
  /* 任务函数通常实现为一个无限循环 */
  while(1)
  {
  /* 任务的代码 */
  }
  /* 如果程序从循环中退出,一定要使用vTaskDelete删除自己
  * NULL表示删除的是自己
  */
  vTaskDelete( NULL );
  /* 程序不会执行到这里, 如果执行到这里就出错了 */
}


2.创建任务

创建任务时使用的函数如下:

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字:不会影响什么,但是尽量不要重名
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数:他会他函数参数里面得到
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用
它来操作这个任务


void * const pvParameters他会他函数参数里面得到

在这个函数里面,参数void * const pvParametersTaskHandle_t * const pxCreatedTask可以不填


参数具体说明:

pvTaskCode 函数指针,可以简单地认为任务就是一个C函数。

它稍微特殊一点:永远不退出,或者退出时要调用"vTaskDelete(NULL)"


pcName

任务的名字,FreeRTOS内部不使用它,仅仅起调试作用。

长度为:configMAX_TASK_NAME_LEN


usStackDepth

每个任务都有自己的栈,这里指定栈大小。

单位是word,比如传入100,表示栈大小为100 word,也就是400字节。

最大值为uint16_t的最大值。

怎么确定栈的大小,并不容易,很多时候是估计。

精确的办法是看反汇编码。


pvParameters 调用pvTaskCode函数指针时用到:pvTaskCode(pvParameters)

uxPriority

优先级范围:0~(configMAX_PRIORITIES – 1)

数值越小优先级越低,

如果传入过大的值,xTaskCreate会把它调整为(configMAX_PRIORITIES – 1)


pxCreatedTask

用来保存xTaskCreate的输出结果:task handle。

以后如果想操作这个任务,比如修改它的优先级,就需要这个handle。

如果不想使用该handle,可以传入NULL。


返回值

成功:pdPASS;

失败:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(失败原因只有内存

不足)

注意:文档里都说失败时返回值是pdFAIL,这不对。

pdFAIL是0,errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY是-1。


3.任务的删除

void vTaskDelete( TaskHandle_t xTaskToDelete )使用这个函数即可删除一个任务。

如果是NULL则删除自己


4.任务的调度

vTaskStartScheduler()使用他开启任务调度:必须要有这个,freertos才知道你创建了任务需要我来调用了


5.简单示例

在任务中,我们需要使用vTaskDelay进行延时

参数可以直接填数字,但我建议填pdMS_TO_TICKS(延时数)比较好,因为他是freertos自带的宏

vTaskStartScheduler()使用他开启任务调度:必须要有这个,freertos才知道你创建了任务需要我来调用了

void Task(void *p)
{
  int32_t *i = (int*)p;
  while(1)
  {
    printf("Count:%d\r\n",*i);
   (*i)++;
    vTaskDelay(pdMS_TO_TICKS(500));
  }
  vTaskDelete(NULL);
}
uint32_t count = 0;
TaskHandle_t mytaskHandle;
void TaskTest(void)
{
  xTaskCreate(Task,"MyTask",50,&count,1,&mytaskHandle);
  vTaskStartScheduler();//任务调度,必须要有这个,freertos才知道你创建了任务需要我来调用了
}


调用运行后就会在串口看到打印的消息了,如下:

4b2ab101b9e046f9b1ebaea89b3c33d2.png

除了使用串口来观察,也可以使用HAL_GPIO_TogglePin来观测灯或者其他的一些模块来看到我们的任务效果


总结


任务管理是 FreeRTOS 提供的一个强大功能,它允许开发者以并发的方式组织和管理多个任务。通过任务的创建、删除、挂起、恢复和优先级控制等操作,开发者可以灵活地控制任务的执行顺序和调度策略,从而实现复杂的系统功能。任务通信与同步机制进一步增强了任务的协同工作能力,使任务之间能够高效地共享数据和协调操作。借助 FreeRTOS 提供的任务管理功能,开发者可以更加方便地构建实时嵌入式系统,并具备可靠性和高效性。


需要注意的是,在使用 FreeRTOS 进行任务管理时,开发者需要注意任务的资源管理、优先级设置和调度策略等方面,以确保系统能够稳定地运行,并满足实时性和响应性的要求。

相关文章
|
12月前
|
开发框架 小程序 JavaScript
基于mpvue框架的小程序项目搭建入门教程一
基于mpvue框架的小程序项目搭建入门教程一
146 0
|
16天前
【LVGL快速入门】LVGL开源框架入门教程之框架使用(三)
【LVGL快速入门】LVGL开源框架入门教程之框架使用(三)
【LVGL快速入门】LVGL开源框架入门教程之框架使用(三)
|
16天前
【LVGL快速入门】LVGL开源框架入门教程之框架使用(一)
【LVGL快速入门】LVGL开源框架入门教程之框架使用(一)
|
16天前
|
容器
【LVGL快速入门】LVGL开源框架入门教程之框架使用(二)
【LVGL快速入门】LVGL开源框架入门教程之框架使用(二)
|
3月前
|
定位技术 C# 图形学
从零开始的unity3d入门教程(二)----基本功能讲解
这是一篇Unity3D入门教程,详细介绍了Unity界面操作、游戏物体创建修改、场景搭建、玩家控制、音效添加以及游戏测试和导出的全过程。
从零开始的unity3d入门教程(二)----基本功能讲解
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6月前
|
消息中间件 调度
FreeRTOS入门教程(任务状态)
FreeRTOS入门教程(任务状态)
231 0
|
5月前
|
传感器 物联网 调度
从0入门FreeRTOS之第一节 什么是FreeRTOS?
FreeRTOS(Free Real-Time Operating System)是一款开源的实时操作系统(RTOS),专为嵌入式系统设计。由Real Time Engineers Ltd.开发和维护,FreeRTOS以其小巧、高效、易于使用的特点广受欢迎。FreeRTOS支持多种微控制器和微处理器平台,提供丰富的实时操作系统功能,使开发者能够轻松构建高效、实时响应的应用程序。
320 0
|
6月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的课程资源管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的课程资源管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6月前
|
前端开发 数据库 Nacos