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

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

3天内不再提示

FreeRTOS任务实现和控制块

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-09-28 11:28 次阅读

任务实现

FreeRTOS 官方给出的任务函数模板如下:

void vATaskFunction(void *pvParameters)
{
  for( ; ; )
  {
    --任务应用程序-- 
    vTaskDelay(); 
  }

  vTaskDelete(NULL); 
}

(1)、任务函数本质也是函数,所以肯定有任务名什么的,不过这里我们要注意:任务函数 的返回类型一定要为 void 类型,也就是无返回值,而且任务的参数也是 void 指针类型的!任务 函数名可以根据实际情况定义。

(2)、任务的具体执行过程是一个大循环,for(; ; )就代表一个循环,作用和 while(1)一样,博主习惯用 while(1)。

(3)、循环里面就是真正的任务代码了,此任务具体要干的活就在这里实现!

(4)、FreeRTOS 的延时函数,此处不一定要用延时函数,其他只要能让 FreeRTOS 发生任务 切换的 API 函数都可以,比如请求信号量、队列等,甚至直接调用任务调度器。只不过最常用 的就是 FreeRTOS 的延时函数。

(5)、任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用 函数 vTaskDelete(NULL)删除此任务!

FreeRTOS 的任务函数和 UCOS 的任务函数模式基本相同的,不止 FreeRTOS,其他 RTOS 的任务函数基本也是这种方式的。

任务控制块

FreeRTOS 的每个任务都有一些属性需要存储,FreeRTOS 把这些属性集合到一起用一个结构体来表示,这个结构体叫做任务控制块:TCB_t,在使用函数 xTaskCreate()创建任务的时候就会自动的给每个任务分配一个任务控制块。

此结构体在文件 tasks.c 中有定义。类似于 Linux 的 task_struct 结构体,保存进程信息用的,每个进程有一个。

任务堆栈

FreeRTOS 之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,任务调度器在进行任务切换的时候会将当前任务的现场(CPU 寄存器值等)保存在此任务的任务堆栈中,等到此任务下次运行的时候就会先用堆栈中保存的值来恢复现场,恢复现场以后任务就会接着从上次中断的地方开始运行。

创建任务的时候需要给任务指定堆栈,如果使用的函数 xTaskCreate()创建任务(动态方法)的话那么任务堆栈就会由函数 xTaskCreate()自动创建。如果使用函数 xTaskCreateStatic()创建任务(静态方法)的话就需要程序员自行定义任务堆栈,然后堆栈首地址作为函数的参数 puxStackBuffer 传递给函数。

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

    关注

    5056

    文章

    18950

    浏览量

    301467
  • 函数
    +关注

    关注

    3

    文章

    4273

    浏览量

    62288
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    61892
  • 控制块
    +关注

    关注

    0

    文章

    5

    浏览量

    6378
  • 任务
    +关注

    关注

    1

    文章

    20

    浏览量

    8525
收藏 人收藏

    评论

    相关推荐

    FreeRTOS介绍与基础任务创建

    本篇介绍FreeRTOS与基础任务创建
    的头像 发表于 09-26 09:00 2299次阅读
    <b class='flag-5'>FreeRTOS</b>介绍与基础<b class='flag-5'>任务</b>创建

    FreeRTOS中的任务管理

    任务FreeRTOS 中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS 中的任务是基于优先级的抢占式调度,优先级高的任务
    的头像 发表于 11-27 17:03 912次阅读

    请教:有SPC560B的多任务实时系统的例程吗(freertos

    请教:有SPC560B的多任务实时系统的例程吗(freertos
    发表于 01-15 17:04

    静态方法创建任务删除后内存如何回收?

    最近学习原子哥的FreeRTOS例程,在静态方法创建和删除任务实验中,任务删除后好像没有释放内存的部分。是不是一定是Malloc分配的内存才有free对应,像例程中这种//任务堆栈
    发表于 06-19 06:23

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

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

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

    功能,初学者必须先掌握——任务的创建、删除、挂起和恢复等操作。本章节分为如下几部分:*什么是多任务系统*FreeRTOS任务与协程*初次使用*任务
    发表于 02-18 06:38

    如何轻松几步实现在STM32上运行FreeRTOS任务

    轻松几步实现在STM32上运行FreeRTOS任务
    的头像 发表于 03-01 12:07 8379次阅读
    如何轻松几步<b class='flag-5'>实现</b>在STM32上运行<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>

    初入FreeRTOS

    源码3、FreeRTOS移植操作三、在STM32下完成一个基于FreeRTOS的多任务程序1、任务要求2、任务实施3、
    发表于 12-06 21:06 40次下载
    初入<b class='flag-5'>FreeRTOS</b>

    (一)FreeRTOS学习之FreeRTOS任务基础知识

    功能,初学者必须先掌握——任务的创建、删除、挂起和恢复等操作。本章节分为如下几部分:*什么是多任务系统*FreeRTOS任务与协程*初次使用*任务
    发表于 12-23 19:57 3次下载
    (一)<b class='flag-5'>FreeRTOS</b>学习之<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>基础知识

    FreeRTOS任务详解

    详细讲解freeRTOS任务
    发表于 12-23 20:01 11次下载
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>任务</b>详解

    FreeRTOS系列第11篇---FreeRTOS任务控制

    FreeRTOS任务控制API函数主要实现任务延时、任务挂起、解除任务挂起、
    发表于 01-26 17:54 12次下载
    <b class='flag-5'>FreeRTOS</b>系列第11篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b><b class='flag-5'>控制</b>

    freeRTOS任务

    freeRTOS系统的任务切换的具体过程最终都是在pendSV中断服务函数里面完成的。
    的头像 发表于 02-10 11:02 1488次阅读
    <b class='flag-5'>freeRTOS</b>的<b class='flag-5'>任务</b>

    FreeRTOS任务间通信,怎么实现

    FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,十分好用,而且没有任务数限制,在此之前分析过很多了,简单来说,FreeRTOS实时系统能够创建多个独立的
    的头像 发表于 02-23 09:21 1934次阅读

    FreeRTOS任务通知简介

    个 32 位的通知值,任务控制中的成员变量 ulNotifiedValue 就是这个通知值。任务通知是一个事件,假如某个任务通知的接收
    的头像 发表于 07-30 11:34 698次阅读

    freertos最多支持多少个任务

    以下几个因素: 系统资源 :FreeRTOS能够支持的任务数量受到系统硬件资源的限制,特别是处理器的RAM大小和性能。RAM用于存储任务控制
    的头像 发表于 09-02 14:21 592次阅读