FreeRTOS任务基础知识

2023-11-19

多任务系统

对于单任务系统,每个任务的优先级都是相同的。多任务将一个大问题分成小问题,每个小任务完成的时间很短,看起来像同时完成,多任务系统通过任务调度器来安排任务优先顺序。FreeROTS根据是一个抢占式的实时多任务系统。高优先级的任务可以打断低优先级任务的运行从而获得CPU的使用权,高优先级的任务执行完成以后重新把CPU的使用权归还给低优先级。

在这里插入图片描述

FreeRTOS任务与协程

任务和协程使用不同的API函数,不能通过队列将数据从任务发送协程,或从协程发送给任务。

任务特性

任何一个时间点只能运行一个任务;
每个任务都有自己的运行环境,不依赖于系统中的其他任务或RTOS调度器;
运行哪个任务由RTOS调度器决定。

任务特性:
在这里插入图片描述

协程特性

所有协程使用同一个堆栈(对于任务,每个任务都有自己的堆栈);
协程使用合作式的调度器,但可以在使用抢占式的调度器中使用协程;
协程是通过宏定义来实现的;
为了降低对RAM的消耗做了很多限制。

任务状态

运行态:正在运行,当前正在使用处理器的任务。

就绪态:已经准备就绪但是还没有运行的任务。

阻塞态:当前正在等待某个外部事件。任务进入阻塞态会有一个超时时间,超时后会退出阻塞态。

挂起态:挂起态不能被调度器调用进入运行态,也没有超时时间。它是通过函数控制的。进入挂起vTaskSuspend(),退出挂起 xTaskResume()。

在这里插入图片描述

任务优先级

每个任务都可以分配一个优先级。
优先级数字越低表示任务的优先级越低。
调度器会选择处于就绪态的最高优先级进行运行。优先级相同时,就会使用时间片轮转调度器获取运行时间。

任务实现

创建任务: xTaskCreate()(动态方法)或xTaskCreateStatic()(静态方法)

任务函数:
本质上就是一个函数,不过任务函数的返回类型一定是void,任务的参数也是void指针类型。

void vATaskFunction(void* pvParameters)
{
  for(; ;) //while(1)
  {
    任务应用程序  //具体要进行的内容
    vTaskDelay();
  }
  vTaskDelete(NULL); //延时函数
}

任务控制块 TCB_t

一个存储任务属性的结构体.。

typedef struct tskTaskControlBlock     
{
    volatile StackType_t * pxTopOfStack;//任务堆栈栈顶

    #if ( portUSING_MPU_WRAPPERS == 1 )
        xMPU_SETTINGS xMPUSettings; //MPU相关设置
    #endif

    ListItem_t xStateListItem;                 //状态列表项
    ListItem_t xEventListItem;                //事件列表项
    UBaseType_t uxPriority;                  //任务优先级
    StackType_t * pxStack;                   //任务堆栈起始地址
    char pcTaskName[ configMAX_TASK_NAME_LEN ];//任务名字
    #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )
        StackType_t * pxEndOfStack;//任务堆栈栈底
    #endif

    #if ( portCRITICAL_NESTING_IN_TCB == 1 )
        UBaseType_t uxCriticalNesting;//临界区嵌套深度
    #endif

    #if ( configUSE_TRACE_FACILITY == 1 )
        UBaseType_t uxTCBNumber;  
        UBaseType_t uxTaskNumber; 
    #endif

    #if ( configUSE_MUTEXES == 1 )
        UBaseType_t uxBasePriority; //任务基础优先级
        UBaseType_t uxMutexesHeld;//任务获取到的互斥信号量个数
    #endif

    #if ( configUSE_APPLICATION_TASK_TAG == 1 )
        TaskHookFunction_t pxTaskTag;
    #endif

    #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )
        void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];
    #endif

    #if ( configGENERATE_RUN_TIME_STATS == 1 )
        configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; //用来记录任务运行时间
    #endif

    #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) )
        configTLS_BLOCK_TYPE xTLSBlock; /*< Memory block used as Thread Local Storage (TLS) Block for the task. */
    #endif

    #if ( configUSE_TASK_NOTIFICATIONS == 1 )
        volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];//任务通知值
        volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];//任务通知状态
    #endif

    /* See the comments in FreeRTOS.h with the definition of
     * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */
    #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) 
        uint8_t ucStaticallyAllocated;              //用来标记动态创建还是静态创建
    #endif

    #if ( INCLUDE_xTaskAbortDelay == 1 )
        uint8_t ucDelayAborted;
    #endif

    #if ( configUSE_POSIX_ERRNO == 1 )
        int iTaskErrno;
    #endif
} tskTCB;

任务堆栈

任务调度器在进行任务切换的时候会将当前任务的现场保存在此任务的的任务堆栈中,等到此任务下次运行的时候会先用堆栈中保存的值来恢复现场,恢复现场以后任务就会接着从上次中断的地方开始。和操作系统的上下文切换类似。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS任务基础知识 的相关文章

  • oracle tcp空包请求,再谈 TCP 的 CLOSE_WAIT

    背景 某日集群告警 hbase regionserver 因 fd 不足导致进程主动退出 简单排查后发现regionserver 到 datanode 的TCP 连接存在大量 CLOSE WAIT 单机总数有10万之多 众所周知 CLOSE

随机推荐

  • HTML表格

    目录 实例 表格 表格和边框属性 表格的表头 表格中的空单元格 更多实例 表格标签 一个完整的实例 本例涉及到的资源 eg background jpg eg cute gif 可以使用 HTML 创建表格 实例 表格 这个例子演示如何在
  • 一台电脑上安装两个Tomcat服务器

    在排查问题来源的时候 由于不想卸载之前下载的Tomcat 需要再安装一个Tomcat服务器 下载压缩版的Tomcat之后 第一个Tomcat配置不变 需要修改第二个Tomcat的配置 1 CATALINA HOME 8081 新的地址 2
  • flex:1可以撑满剩余空间

    flex 1 的妙用 首先 flex 是 flex grow flex shrink flex basis的缩写 当 flex 取值为一个非负数字 则该数字为 flex grow 值 flex shrink 取 1 flex basis 取
  • MySql中left join、right join、inner join实例分析,union与union all的区别,Mybatis中CDATA []的用法

    inner join select from user a inner join grade b on a gid b id 只返回两个表中联结字段相等的行 left join select from user a left join gr
  • bokeh python_Python Bokeh数据可视化教程

    bokeh python Bokeh is an interactive Python data visualization library which targets modern web browsers for presentatio
  • cad隐藏图层命令快捷键_教你学会天正CAD局部隐藏对象技巧

    天正局部隐藏命令 JBYC 即局部隐藏的拼音首字母 其命令全称为TMKHIDE 适用于所有天正软件 建筑 电气 给排水 暖通 天正建筑的工具界面中是有此菜单的 且默认快捷键4为局部隐藏 6为恢复可见 其他软件并未显示 需要通过命令输入使用
  • 基于conda的相关命令

    conda 查看python版本环境 打开Anaconda Prompt的命令输入框 查看自己的python版本 conda env list 激活相应的python版本 环境 conda avtivate python 3 9 若输入以下
  • 我在工作中是如何使用【Linux】的

    目录 前言 一 常用命令 二 文件和目录处理 三 用户与组管理命令 四 进程管理命令 五 网络管理命令 六 帮助命令 七 磁盘管理 前言 大家好 这是我首篇博客 内容是linux工作需用到的内容 在这里我给大家总结出来了 希望多支持支持 感
  • 【Hello mysql】 mysql的事务

    Mysql专栏 Mysql 本篇博客简介 介绍mysql的事务 mysql的事务 事务的概念 事务功能测试 事务的隔离级别 如何理解隔离性 粗浅理解 隔离级别 查看和设置隔离级别 四种隔离级别详解 读 未提交 读 提交 可重复读 串行化 一
  • 6月17日实验课之“H.264文件解析”

    文章目录 1 实验要求 2 实验结果 2 1 SPS 2 1 1 profile idc 2 1 2 level idc 2 1 3 seq parameter set id 2 1 4 log2 max frame num minus4
  • jmeter+接口测试练习+接口关联+Json提取

    1 测试用例设计 2 因为要执行多条用例 所以在Jmeter添加了http信息头管理器和http请求默认值 3 查询用户信息接口需要用到登录的token 但要先登录再把token拿出来传到查询的信息头里 会出现登录信息已过期的提示 考虑用j
  • 从0开始写Vue项目-Vue页面主体布局和登录、注册页面

    1 从0开始写Vue项目 环境和项目搭建 慕言要努力的博客 CSDN博客 2 从0开始写Vue项目 Vue2集成Element ui和后台主体框架搭建 慕言要努力的博客 CSDN博客 一 主体布局 关于主体布局 我们刚开始肯定是做的死数据的
  • 考研数二第三讲 极限存在准则和两个重要极限和极限运算准则

    根据前面介绍的内容 具体推理数列以及函数的极限推理过程 在实际应用中极限的两大准则使用还是比较广泛的 大家需要多多关注 极限存在准则和两个重要极限 准则 I 夹逼准则 如果数列 xn yn zn 满足下列条件 证明 此函数分母的极限为 0
  • 稿费一般多少钱一千字_编写教材的稿费一般是多少

    我们知道编写教材是会受到一定的稿酬的 除了编写教材 还有图书 报纸 个人公开发表等等 公费出书都有可能获取一定的稿酬 那么稿酬是如何计算的呢 编写教材的稿费一般是多少 以下是根据 出版文字作品报酬规定 介绍了基本稿酬的标准 供大家参考 19
  • VUE项目中的全局格式化时间过滤器

    自定义格式化时间 一 问题 这是一个后台管理系统中的商品列表页 其中的时间这一项在调用接口后会发现是以毫秒来计算的 这样当然是不行的啦 要换算成我们日常使用的2020 04 07 17 13 这样的时间格式 二 解决办法 1 打开项目中的m
  • html5 比例尺,高德地图API之缩放比例尺控件+3D转换

    缩放比例尺控件 首先引入控件 amap scale 然后使用 map addcontrol 添加控件map margin 0 padding 0 list style none container width 100 height 100
  • Flutter 画板实现

    import package flutter material dart class DrawingBoard extends StatefulWidget override DrawingBoardState createState gt
  • Unity5.4.1与NGUI出现的问题Ignoring menu item NGUI because it is in no submenu!

    原文 http www tasharen com forum index php topic 14856 0 Hey Arenmook after upgrading to Unity 5 4 1 from 5 3 6p1 and upgr
  • 【CMake】教程:第2步 添加库

    CMake 教程 第2步 添加库 问题 当写的程序由多个模块组成 如何组织这些代码 以及如何利用模块代码生成的库呢 解答思路 编写模块代码 将模块代码生成库 编写调用程序 编译链接模块库 以求一个数的平方根为例 编写模块代码 MathFun
  • FreeRTOS任务基础知识

    多任务系统 对于单任务系统 每个任务的优先级都是相同的 多任务将一个大问题分成小问题 每个小任务完成的时间很短 看起来像同时完成 多任务系统通过任务调度器来安排任务优先顺序 FreeROTS根据是一个抢占式的实时多任务系统 高优先级的任务可