FreeRTOS—任务基础知识

news2024/11/24 9:42:45

文章目录

  • 一、FreeRTOS任务特性
  • 二、FreeRTOS任务状态
  • 三、FreeRTOS任务优先级
  • 四、FreeRTOS任务实现
  • 五、任务控制块
  • 六、任务堆栈

一、FreeRTOS任务特性

  • 简单
  • 没有使用限制(任务数量没有显示,一个优先级下可以有多个任务)
  • 支持抢占(高优先级任务可以抢占低优先级任务的CPU使用权)
  • 支持优先级
  • 每个任务都拥有堆栈,导致RAM使用量增大
    当任务切换时,需要保护现场,保证再次执行该任务时能够从中断的地方继续执行,现场就存储在任务的RAM中。
  • 如果使用抢占,需要考虑重入问题

二、FreeRTOS任务状态

  • 运行态
    任务正在执行时,处于运行态
  • 就绪态
    任务准备就绪,可以运行
  • 阻塞态
    比如某个任务在等待某一个事件发生,此时任务处于阻塞态
  • 挂起态
    挂起态就是任务暂停运行

这四种任务状态是可以互相转换的。任务创建完成之后,处于就绪态。如果任务调度器调度了处于就绪态的任务,此时任务状态变成了就绪态。当然,运行态也可以编程就绪态。比如此时A任务正在运行,此时有一个比A任务优先级高的B任务处于就绪态。这是任务调度器会将A任务的CPU使用权转交给B任务,此时A任务从运行态转入就绪态。

由就绪态到挂起态,可以直接通过函数vTaskSuspend()实现。运行态和阻塞态也可以调用函数vTaskSuspend(),进入挂起态。解挂时,调用vTaskResume()函数即可。

如果处于运行态的任务调用了一些可以阻塞的API函数,比如等待状态量,等待消息队列等,处于运行态的任务就会转到阻塞态。

任务状态间的转换

三、FreeRTOS任务优先级

任务优先级高的任务,会先被执行。在FreeRTOS周末和,任务优先级可选范围在0~configMAX_PRIORITIER - 1,同一优先级下,可以有多个任务。值得注意的是,在FreeRTOS中,数字越大,优先级越大。

四、FreeRTOS任务实现

FreeRTOS官方给出了一个任务函数的模板

void vATaskFunction(void *pvParameters)
{
    for( ; ; )   // 死循环,可以用while(1)
    {
        // 任务应用程序
        vTaskDelay();   // 引起任务调度
    }
}

一般情况下,我们不会从任务中跳出。如果需要调出,一定要将任务删除。删除任务可以调用下面的函数

vTaskDelete(NULL);   // 删除任务

需要注意的是,FreeRTOS的任务函数必须是void类型。

五、任务控制块

FreeRTOS 把任务属性集合到一起,用一个结构体来表示,这个结构体就是任务控制块——TCB_t(Task Control Block)。所以总结来说,任务控制块就是描述任务属性的结构体。任务控制块可以在“task.c”文件中找到。

六、任务堆栈

上面介绍过,当正在执行任务A,需要切换到任务B时,会将当前任务的现场(CPU寄存器值等)保存到人物的任务堆栈中。等到任务A再次运行时,根据从任务A的任务堆栈中存储的值来恢复现场。

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

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

#define portSTACK_TYPE	uint32_t

typedef portSTACK_TYPE StackType_t;

由此可见,任务堆栈StackType_t的变量类型是u32,无符号整型。

比如之前在移植测试程序中创建LED程序时,定义任务堆栈

//任务堆栈大小	
#define LED0_STK_SIZE 		50  

这里的“50”并不是指该任务的任务堆栈大小为50个字节。而是指该任务的任务堆栈大小是50个StackType_t。一个StackType_t是四个字节。因此,该任务的任务堆栈大小应该是4 * 50 = 200 字节。

任务堆栈需要根据任务的实际大小分配,如果任务所需要的内存比较大,需要调整任务堆栈大小。如果出现任务卡死不运行的情况,大多数情况是因为任务堆栈分配太小。但是如果任务卡住,将其堆栈增大到很大,依旧卡住,那应该是其他问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端谷歌浏览器调试

【浏览器调试工具精讲】Chrome Dev Tools精讲,前端必看! 文章目录 命令菜单主题切换截屏窗口停放位置 常用Tabelement查找ID修改样式、样式文件定位 样式的来源如继承、自定义等让某个状态常驻如鼠标悬停全局、部分样式的的选择与取消复制样式某个样式属…

Java开发 - Canal的基本用法

前言 今天给大家带来的是Canal的基本用法,Canal在Java中常被我们用来做数据的同步,当然不是MySQL与MySQL,Redis与Redis之间了,如果是他们,那就好办了,我们可以直接通过配置来完成他们之间的主从、主主&…

【AUTOSAR】BMS开发实际项目讲解(三十)----电池管理系统电池SOH和SOE估算

电池SOH估算 关联的系统需求 Sys_Req_4004、Sys_Req_4005; 功能实现描述 SOH主要包括以下内容: SOH模块输入信息 序号 参数 说明 1 满电电压 4.14V 3 电芯OCV曲线 [CELL] 4 充放电循环次数 [CELL] 2 电芯循环衰减数据表 [CELL] SOH算法 ID Descr…

在docker中使用tomcat

检查本地操作系统版本: [rootnode ~]# cat /etc/os-release NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLO…

第8届Python编程挑战赛初赛真题剖析-2022年全国青少年信息素养大赛

[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛系列的第1讲。 全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计与信…

如何做好云渗透测试的威胁建模(上)

NO.1 威胁建模相关定义 微软针对威胁建模(Threat modeling)的描述:威胁建模是帮助保护系统、应用程序、网络和服务的有效方法。这是一种工程技术,用于识别潜在的威胁和建议,以帮助降低风险并在开发生命周期的早期实现…

nodejs接口联动获取req的各种类型数据,搭建可视化流程引擎平台

nodejs接口联动获取req的各种类型数据,搭建可视化流程引擎平台 搭建nodejs服务创建对外开放端口,获取基础数据GET—queryGET—paramsPOST 联动MYSQL数据库获取websites表的所有书链接数据库 插入 搭建nodejs服务 考虑跨域等性能,简易的工程化…

基于SpringBoot和Mybatis用两种方式实现分页查询

上一篇文章中封装了通用的返回结果、通用分页结果。本文具体记录一下如何基于Mybatis实现分页查询。 参考文章: Github:pagehelper-spring-boot Github:HowToUse.md mybatis-plus分页查询三种方法 MyBatis-Plus分页插件 系列文章指路👉 系列文章-基于Sp…

这会是下一代的 Java 程序员的技术栈吗?

Servlet 与 Reactive 技术栈 打开 Spring 的官方文档我们在 Reactive 一栏中可以看到下面的架构图,其中可以很明显的看到 Reactive 的技术栈跟 Servlet 技术栈是完全并行的。意思是说我们日常开发的 Servlet web 类型只是一半的内容,还有另外一半世界就…

TI AM64x开发板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 评估板简介 创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F多核处理器设计的高性能评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,高性能低功耗,稳…

3.2C++抽象类

C 抽象类 C的抽象类是指至少包含一个纯虚函数的类,不能被实例化。 抽象类的作用是为了实现接口的统一规范,使得不同的子类可以通过实现相同的纯虚函数来实现不同的行为。 定义抽象类时,需要在类中至少包含一个纯虚函数。 抽象类不能被实例…

idea如何连接数据库

输入数据库的用户名和密码就行 Database这里些数据库的名字 快速打开数据库设计 这句话是说时区有问题:因为Mysql用的是美国时区,要搞成中国时区: set global time_zone8:00; 打开cmd窗口: 输入 mysql -u root -p 密码&…

MySql高级篇-006 MySQL架构篇-02MySQL的数据目录:数据库下的主要目录结构、文件系统如何存储数据

第02章_MySQL的数据目录 1.MySQL8的主要目录结构 # 查询名称叫做mysql的文件目录都有哪些[rootatguigu07 ~]# find / -name mysql安装好MySQL 8之后,我们查看如下的目录结构: 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径:/var/…

华为手环8 六月免费表盘上线,让你的腕上表盘更丰富多彩

在如今这个科技与艺术相互融合的时代!工程师们给华为手环8花粉朋友准备的6月这一期好看又免费表盘已经上线。你可以根据自己的审美,选择一款最适合自己的表盘,展现出自己的个性和品味。快来选择你的专属表盘,让华为手环8成为你独特…

移动WEB开发之rem适配布局

css基础(一)css基础(一)_上半场结束,中场已休息,下半场ing的博客-CSDN博客Emmet语法Emmet语法_上半场结束,中场已休息,下半场ing的博客-CSDN博客css基础(二)c…

途乐证券|股市里的游资是什么?有什么特点?

股市是一个充满风险和机会的地方,吸引了各类投资者的目光,游资就是其中一种。那么股市里的游资是什么?有什么特点?途乐证券也为大家准备了相关内容,以供参考。 股市里的游资是什么? 一般来说,股…

【JavaScript】使用qrcode生成二维码

QRCode简介: QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。 使用步骤: 点击下载:https://github.com/davidshimjs/qrcodejs 或者mirrors / davidshimjs / qrco…

selenium 自动化测试 1-如何搭建自动化测试环境,搭建环境过程应该注意的问题

目录 前言: 1、selenium的介绍 2、selenium的版本介绍 3. selenium工作原理 4. selenium安装 4.1 安装selenium 4.2 安装浏览器驱动 4.3 安装浏览器 4.4 验证安装结果 5. 浏览器基本操作 前言: 搭建Selenium自动化测试环境是进行Web应用程序自…

京东到家小程序-在性能及多端能力的探索实践 | 京东云技术团队

一、前言 京东到家小程序最初只有微信小程序,随着业务的发展,同样的功能需要支持容器越来越多,包括支付宝小程序、京东小程序、到家APP、京东APP等,然而每个端分开实现要面临研发成本高、不一致等问题。 为了提高研发效率&#…

关于栈和队列的几个题

思维导图: 1.匹配括号 题目如下: 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以…