0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用FreeRTOS的多任务机制优化程序呢?

冬至子 来源:月月望归鸟 作者:K.Fire 2023-11-13 11:12 次阅读

1

创建任务

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

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 );//任务句柄,以后使用它来操作这个任务

参数说明:

  • pvTaskCode:函数指针,可以简单地认为任务就是一个C函数。它稍微特殊一点:永远不退出,或者退出时要调用"vTaskDelete(NULL)"
  • pcName:任务的名字,FreeRTOS内部不使用它,仅仅起调试作用。长度为:confifigMAX_TASK_NAME_LEN
  • usStackDepth:每个任务都有自己的栈,这里指定栈大小。单位是 word ,比如传入 100 ,表示栈大小为 100 word ,也就是 400 字节。最大值为 uint16_t 的最大值。怎么确定栈的大小,并不容易,很多时候是估计。精确的办法是看反汇编码。
  • pvParameters:传入参数,调用 pvTaskCode 函数指针时用到:pvTaskCode(pvParameters)
  • uxPriorit:优先级范围:0~(confifigMAX_PRIORITIES – 1) 数值越小优先级越低, 如果传入过大的值,xTaskCreate会把它调整为(confifigMAX_PRIORITIES – 1)
  • pxCreatedTask:用来保存 xTaskCreate 的输出结果:task handle 。以后如果想操作这个任务,比如修改它的优先级,就需要这个 handle 。如果不想使用该 handle ,可以传入 NULL 。
  • 返回值:成功:pdPASS ;失败:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY( 失败原因只有内存不足 )
  • 注意:文档里都说失败时返回值是 pdFAIL ,这不对。pdFAIL 是 0 , errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 是 -1 。

实例:

void Task1Function(void * param)
{
  while (1)
  {
    printf("1");
  }
}
void Task2Function(void * param)
{
  while (1)
  {
    printf("2");
  }
}
xTaskCreate(Task1Function, "Task1", 100, NULL, 1, &xHandleTask1);
xTaskCreate(Task2Function, "Task2", 100, NULL, 1, NULL);

开启任务调度:

vTaskStartScheduler();          //开启任务调度

结果:

图片

2

删除任务

删除任务使用的函数如下:

void vTaskDelete( TaskHandle_t xTaskToDelete );

参数说明:

  • xTaskToDelete:任务句柄,使用 xTaskCreate 创建任务时可以得到一个句柄,也可传入NULL ,这表示删除自己。
  • 句柄的实质就是这个任务结构体的指针,在FreeRTOS中任务的创建利用面向对象的思想,创建的一个个任务都是结构体,删除任务的实质就类似于C语言中的free释放内存

实例:

void vTask1( void *pvParameters )
{
const TickType_t xDelay100ms = pdMS_TO_TICKS( 100UL );
BaseType_t ret; 
/* 任务函数的主体一般都是无限循环 */
for( ;; ) 
{ 
/* 打印任务的信息 */ 
printf("Task1 is runningrn");
ret = xTaskCreate( vTask2, "Task 2", 1000, NULL, 2, &xTask2Handle ); 
if (ret != pdPASS) printf("Create Task2 Failedrn");
// 如果不休眠的话, Idle任务无法得到执行 
// Idel任务会清理任务2使用的内存
// 如果不休眠则Idle任务无法执行, 最后内存耗尽
vTaskDelay( xDelay100ms ); 
}

3

任务状态

  • 当前正在进行的任务,是running状态;其他所有任务都处于not running状态
  • "not running"状态还可以细分为:
    ready :就绪,随时可以运行
    
      blocked :阻塞,该任务在等待某一事件发生
    
      suspended :挂起,该任务暂停休息
    

图片

当创建任务并开始任务调度后,所有任务都处于Ready就绪状态,系统随机挑选一个任务Running,正在执行的任务可以使用vTaskSuspend函数使自己进入挂起状态(传入参数NULL或自己的句柄),也可以使其他任务进入挂起状态(传入参数为需要挂起任务的句柄),进入暂停状态后,需要在别的任务执行过程中调用vTaskResume函数该任务才会重新进入Ready状态;

在任务执行过程中,需要等待某个函数或事件的发生,则进入挂起状态(Baocked),当等待的事件(可能是中断或某个任务)发生后该任务才会恢复Ready状态。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128795
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61351
  • 状态机
    +关注

    关注

    2

    文章

    486

    浏览量

    27182
收藏 人收藏

    评论

    相关推荐

    RTOS的多任务机制应用演示

    的执行路径。深入理解和实现RTOS深入理解和实现RTOS_连载5_多任务机制应用.pdf (247.18 KB )
    发表于 02-17 23:30

    基于 stm32 的 FreeRTOS 的详细移植步骤及其多任务应用 精选资料分享

    目录本文简介:学习 FreeRTOS 原理,在 STM32 下完成一个基于 FreeRTOS多任务程序,执行 3 个周期性 task ,具体任务
    发表于 08-03 07:21

    在STM32下完成FreeRTOS多任务程序开发

    基于在STM32下完成FreeRTOS多任务程序开发 序言 二.项目说明三.实战过程 1)实验器材 2)开始实战 3)任务实现 4)效果展示四. 结语 序言(一)
    发表于 08-09 07:27

    如何去实现基于stm32的FreeRTOS多任务程序

    基于 stm32 的 FreeRTOS多任务程序实现一、什么是FreeRTOS二、AHT20数据采集原理电路绘制三、FreeRTOS
    发表于 08-24 07:45

    FreeRTOS多任务系统的相关资料推荐

    目录单片机各编程系统特点1、裸机系统(1)轮询系统(2)前后台系统2、多任务系统单片机各编程系统特点单片机编程中有裸机系统与多任务系统。裸机系统又分为轮询系统和前后台系统,FreeRTOS就是一种
    发表于 01-13 07:51

    如何在STM32下完成一个基于FreeRTOS多任务程序

    任务要求:在STM32下完成一个基于FreeRTOS多任务程序,执行3个周期性task;目录一.介绍FreeRTOS二.
    发表于 01-17 07:10

    如何利用FreeRTOS程序完成多任务功能?

    如何利用FreeRTOS程序完成多任务功能?
    发表于 01-18 06:43

    如何在STM32下完成一个基于FreeRTOS多任务程序

    文章目录前言一、添加温湿度采集模块二、基于FreeRTOS多任务程序总结前言此次,本菜鸟有两个任务1.在菜鸟入门5的stm32最小系统中添加 AHT20数据采集原理电路(温湿度传感器
    发表于 02-10 08:02

    什么是多任务系统?FreeRTOS任务与协程简析

    FreeRTOS学习之FreeRTOS任务基础知识转行小白一枚,通过博客记录自我学习,望更多博友多多指点,感激不尽!RTOS系统的核心就是任务管理,学习RTOS系统主要是为了使用RTO
    发表于 02-18 06:38

    介绍一种基于FreeRTOS的STM32多任务程序

    基于FreeRTOS的STM32多任务程序一、材料准备二、 FreeRTOS移植FreeRTOS是什么F
    发表于 02-21 06:00

    keil下的FreeRtos多任务程序学习

    keil下的FreeRtos多任务程序学习目标手动移植FreeRtos(以STM32F103为例)直接使用野火的模板学习目标学习FreeRTOS
    发表于 02-21 06:14

    基于消息驱动的多任务操作机制

    本文对多任务操作机制与传统的单任务操作机制进行了比较,分析了多任务系统中数据交换的方法,特别是目前最为流行的用消息驱动方式实现的系统。结合程
    发表于 05-14 16:56 0次下载

    51单片机多任务机制的实现策略研究

    从操作系统实现多任务机制的原理入手,分析了51单片机实现多任务机制的基本条件,论述了5l单片机实现多任务控制的二种方案。
    发表于 09-19 17:26 159次下载
    51单片机<b class='flag-5'>多任务</b><b class='flag-5'>机制</b>的实现策略研究

    stm32基于FreeRTOS多任务程序

    目录实验环境实验目的实验步骤代码:实验环境1.野火STM32MINI开发板2.keil5实验目的在STM32下完成一个基于FreeRTOS多任务程序,执行3个周期性task,具体任务
    发表于 12-07 10:36 14次下载
    stm32基于<b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>多任务</b><b class='flag-5'>程序</b>

    基于FreeRTOS的STM32多任务程序

    基于FreeRTOS的STM32多任务程序一、材料准备二、 FreeRTOS移植FreeRTOS是什么F
    发表于 12-27 18:38 26次下载
    基于<b class='flag-5'>FreeRTOS</b>的STM32<b class='flag-5'>多任务</b><b class='flag-5'>程序</b>