FreeRTOS任务基础

2023-10-26

任务特性

  • 没有数量限制(一个优先级下也可以拥有多个任务)
  • 支持抢占(FreeRTOS为抢占式内核高优先级可以抢占低优先级的CPU使用权)
  • 支持优先级(决定任务运行的先后)
  • 每个任务都拥有堆栈导致了RAM使用量增大
  • 抢占需考虑重入问题

任务状态

  • 运行态(当前任务正在运行就是运行态)
  • 就绪态(任务准备运行,所有就绪态态中优先级最高的任务下一次运行)
  • 阻塞态(某个需要事件来引发的任务,事件没有发生时该任务的状态)
  • 挂起态(暂停运行,有挂起和解挂两个过程)
    这四个状态是可以互相转化的,刚创建好的任务是处于就绪态的,具体的转化过程如下图所示:
    在这里插入图片描述

任务优先级

任务的优先级决定了任务执行的先后,在FreeRTOS中有32个优先级即0到31,数字越大优先级越高!

任务实现

void vATaskFunction(void *pvParameters)
{
	while(1)//for(;;)
	{
	任务程序
	vTaskDelay();
	}
vTaskDelay();
}

上方代码为任务实现的基本框架,要注意的是任务中途不能返回或退出,如果一定要退出的话需要调用vTaskDelay(NULL)来删除此任务。

任务控制块(描述任务属性的数据结构)

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

typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack; //任务堆栈栈顶
#if ( portUSING_MPU_WRAPPERS == 1 )
xMPU_SETTINGSxMPUSettings; //MPU 相关设置
#endif
ListItem_t xStateListItem; //状态列表项
ListItem_t xEventListItem; //事件列表项
UBaseType_t uxPriority; //任务优先级
StackType_t *pxStack; //任务堆栈起始地址
char pcTaskName[ configMAX_TASK_NAME_LEN ];//任务名字
#if ( portSTACK_GROWTH > 0 )
StackType_t *pxEndOfStack; //任务堆栈栈底
#endif
#if ( portCRITICAL_NESTING_IN_TCB == 1 )
UBaseType_t uxCriticalNesting; //临界区嵌套深度
#endif
#if ( configUSE_TRACE_FACILITY == 1 ) //trace 或到 debug 的时候用到
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 )
uint32_t ulRunTimeCounter; //用来记录任务运行总时间
#endif
#if ( configUSE_NEWLIB_REENTRANT == 1 )
struct _reent xNewLib_reent; //定义一个 newlib 结构体变量
#endif
#if( configUSE_TASK_NOTIFICATIONS == 1 )//任务通知相关变量
volatile uint32_t ulNotifiedValue; //任务通知值
volatile uint8_t ucNotifyState; //任务通知状态
#endif
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
//用来标记任务是动态创建的还是静态创建的,如果是静态创建的此变量就为 pdTURE,
//如果是动态创建的就为 pdFALSE
uint8_t ucStaticallyAllocated; 
#endif
#if( INCLUDE_xTaskAbortDelay == 1 )
uint8_t ucDelayAborted;
#endif
} tskTCB;
//新版本的 FreeRTOS 任务控制块重命名为 TCB_t,但是本质上还是 tskTCB,主要是为了兼容
//旧版本的应用。
typedef tskTCB TCB_t;

上述代码为TCB_t结构体在tasks.c 中的定义。

任务堆栈

FreeRTOS是依靠堆栈来回复一个任务的运行的,任务调度器在切换任务的时候就是使用堆栈来恢复任务原现场的。
创建任务的时候需要给任务指定堆栈,如果使用的函数 xTaskCreate()创建任务(动态方法)
的话那么任务堆栈就会由函数 xTaskCreate()自动创建;如果使用函数 xTaskCreateStatic()创建任务(静态方法)的话就需要程序员自行定义任务堆栈,然。后堆栈首地址作为函数的参数 puxStackBuffer 传递给函数。

堆栈的大小

不管是使用函数 xTaskCreate()还是 xTaskCreateStatic()创建任务都需要指定任务堆栈大小。任务堆栈的数据类型为 StackType_t,StackType_t 本质上是 uint32_t,在 portmacro.h 中有如下定义

#define portSTACK_TYPE uint32_t
#define portBASE_TYPE long
typedef portSTACK_TYPE StackType_t;
typedef long BaseType_t;
typedef unsigned long UBaseType_t;

注意:StackType_t 类型的变量为 4 个字节,那么任务的实际堆栈大小就应该是我们所
定义的 4 倍

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

FreeRTOS任务基础 的相关文章

  • Ubuntu下如何将普通用户提升到root权限

    1 打开超级终端 输入指令sudo gedit etc passwd 2 则找到crystal x 1000 1000 crystal home linuxidc bin bash 将两个1000改成0即可 3 重新登陆之后打开超级终端发现
  • BLEU 评价指标总结

    Bleu 评测 一 Bleu通常用来度量一组机器产生的翻译句子集合 candidates 与一组人工翻译句子集合 references 的相似程度 Bleu的具体计算过程看下图 在这里解释一下 式中的n 为当前匹配n gram的长度 这里的
  • Win10 + vs2017 编译并配置tesseract4.1.0

    tesseract 是一个开源的OCR Optical Character Recognition 光学字符识别 引擎 本文就介绍一下自己在编译 tesseract4 1 0时遇到的一些坑 希望能给大家带来一些帮助 一 下载 tessera

随机推荐

  • mybatis mysql autoreconnect=true_Mysql8.0主从搭建,shardingsphere+springboot+mybatis读写分离...

    cd usr local mysql mkdir mysql files chown mysql mysql mysql files chmod 750 mysql files bin mysqld initialize user mysq
  • StringUtils中 isNotEmpty 和isNotBlank的区别 以及StringUtil类的方法

    StringUtils方法的操作对象是java lang String类型的对象 是JDK提供的String类型操作方法的补充 并且是null安全的 即如果输入参数String为null则不会抛出NullPointerException 而
  • Apollo:实时通信架构CyberRT入门

    发现一开始就深入源码 很容易陷进去 特别是模块非常多的情况 需要看很多遍才能理解清楚 要写出更容易理解的文档 需要的不是事无巨细的分析代码 更主要的是能够把复杂的东西抽象出来 变为简单的东西 一个很简答的例子是画函数调用流程图很简单 但是要
  • C++指针定义和使用

    目录 1 指针简介 2 指针的声明和使用 1 指针简介 学习指针前需要先分清几个概念 1 1内存单元的地址和内存单元的内容 在程序中定义一个变量 当程序进行编译时就会给定义的变量分配内存单元 这个内存单元的大小由变量的数据类型决定 例如对有
  • 算法

    算法的效率 算法的效率主要由以下两个复杂度来评估 时间复杂度 评估执行程序所需要的时间 可以估算出程序对处理器的使用程度 空间复杂度 评估执行程序所需要的的存储空间 可以估算出程序对计算机内存的使用程度 设计算法时 一般要先考虑系统环境 然
  • torch.exp()的使用举例

    参考链接 torch exp input out None 参考链接 exp 代码实验展示 Microsoft Windows 版本 10 0 18363 1256 c 2019 Microsoft Corporation 保留所有权利 C
  • Highcharts的3D饼图上下颠倒及解决办法

    我需要的样式效果 那发现常规的echarts不满足了 就改成了highcharts进行3d图表开发 but在开发的过程中发现了这个现象 来吧 看看问题 第一次进入页面 饼图是正常的 戳这个进去瞅瞅 喵 那你进去就看到这个样子的饼图呢 但是由
  • Spring5框架一:IOC实现的两种方式和底层原理

    1 概念 先了解 原理后面再写 1 spring是一个轻量级的开源的JavaEE框架 引入jar包的数量以及体积都比较小 2 spring框架可以解决企业应用开发的复杂性 3 spring里面有很多组成部分 IOC和AOP两个核心部分 IO
  • OpenVX 的 立即模式(immediate mode)和图模式(graph mode)和示例讲解

    OpenVX 的 立即模式 immediate mode 和图模式 graph mode openvx的执行模型一般分为 立即模式 和 图模式 直接模式非常简单 以vxu 开头的函数类似于opencv 习惯于传统的opencv api的 能
  • 整理gitHub项目JavaGuide-CSDN版

    文章目录 java 基础 基础知识系统总结 重要知识点详解 其他 容器 并发 面试题总结 面试常问知识点 JVM 其他 网络 操作系统 Linux系统 数据结构与算法 数据结构 算法 常见算法问题总结 数据库 MySQL 总结 重要知识点
  • 小程序文件系统之 -- 读写文件

    1 文件写入 获取文件系统管理器 const fs wx getFileSystemManager const writeFile data url gt const filePath wx env USER DATA PATH test
  • JAVA8将集合中的某个字段相加、批量修改某个值、高效率循环、高效便捷遍历map

    1 集合中的某个字段相加 BigDecimal 类型保留两位 Objects为你的list集合 BigDecimal freightSum objects stream map Object getMoney reduce BigDecim
  • 获得python的list中含有重复值的index

    关于怎么获得 我想其实网上有很多答案 list index 获得值的索引值 但是如果list中含有的值一样 例如含有两个11 22 这样每次获得的都是第一个值的位置 那么怎么去解决这个问题呢 下面的程序对这个问题做了一定的解答 usr bi
  • 二维码图片生成,并返回给前端

    GetMapping value qrCode produces MediaType IMAGE PNG VALUE public byte qrCode return demoService qrCode public byte qrCo
  • vscode+ssh连接远程linux系统服务器,并用anaconda管理python环境

    vscode ssh连接远程linux系统服务器 并用anaconda管理python环境 一 vscode连接服务器 1 vscode下载插件 remote SSH 2 连接服务器 3 修改配置 二 将代码拷贝到服务器上与代码同步 1 转
  • 在内部局域网内搭建HTTPs

    在内部局域网内搭建HTTPs 配置环境 Windows版本 Windows Server 2008 R2 Standard Service Pack 1 系统类型 64 位操作系统 内存 4GB 了解HTTPS 为什么需要 HTTPS 多数
  • 使用Python,OpenCV应用EAST文本检测器检测自然场景图像中的文本

    使用Python OpenCV应用EAST文本检测器检测自然场景图像中的文本 1 效果图 2 原理 2 1 为什么自然场景文本检测如此具有挑战性 2 2 替代EAST文本检测实现 3 源码 3 1 text detection py 3 2
  • Mac电脑开机出现带问号的文件夹并且闪烁 apple.com/support -2003F

    文章目录 1 视界 2 背景 2 1 开始 2 2 恐慌 2 3 转机 2 3 1 时间机器 2 3 2 重新安装 3 2 3 磁盘恢复 4 欣喜 5 神转折 6 忐忑 7 凉凉了 8 root账户 9 磁盘管理 10 两天后 11 小结
  • 性能测试-JMeter influxdb grafana性能测试监控平台-食用指南

    目录 influxdb grafana安装 influxdb grafana启动 JMeter性能数据写入influxdb JMeter 后端监听器 grafana配置 influxdb grafana安装 yum install infl
  • FreeRTOS任务基础

    任务特性 没有数量限制 一个优先级下也可以拥有多个任务 支持抢占 FreeRTOS为抢占式内核高优先级可以抢占低优先级的CPU使用权 支持优先级 决定任务运行的先后 每个任务都拥有堆栈导致了RAM使用量增大 抢占需考虑重入问题 任务状态 运