【FreeRTOS】【STM32】06.1 FreeRTOS的使用1(对06的补充)

news2024/11/24 17:21:47

前后台系统(裸机)

裸机又称前后台系统,在一个while中不停循环处理各个task。
中断服务函数作为前台程序
大循环while(1)作为后台程序
裸机

多任务系统

通过任务调度的方式,执行各个任务,优先级高的先执行,执行完了释放CPU使用权,交予优先级低的。优先级低的执行完了之后,释放使用权到优先级更低的。
在这里插入图片描述

任务调度器职责

1.RTOS任务 调度器来决定具体运行哪个任务,RTOS 调度器会重复的开启、关闭每个任务。
2.RTOS 调度器需要确保当一个任务开始执行的时候其上下文环境(寄存器值,堆栈内容等)和任务上一次退出的时候相同。(每个任务都必须有个堆栈,当任务切换的时候将上下文环境保存在堆栈中,这样当任务再次执行的时候就可以从堆栈中取出上下文环境,任务恢复运行

任务控制块

FreeRTOS 的每个任务都有一些属性需要存储,FreeRTOS 把这些属性集合到一起用一个结构体来表示,这个结构体叫做任务控制块.此结构体在文件 tasks.c 中有定义。

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;

任务堆栈

FreeRTOS 之所以能正确的恢复一个任务的运行就是因为有任务堆栈.,每一个任务都有自己的堆栈。

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

创建任务的时候需要给任务指定堆栈:
使用的函数 xTaskCreate()创建任务(动态方法)的话那么任务堆栈就会由函数 xTaskCreate()自动创建.

使用函数 xTaskCreateStatic()创建任务(静态方法)的话就需要程序员自行定义任务堆栈,然后堆栈首地址作为函数的参数 puxStackBuffer 传递给函数。
静态方法创建任务:

TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
	 const char * const pcName,
	const uint32_t ulStackDepth,
	void * const pvParameters,
	UBaseType_t uxPriority,
	StackType_t * const puxStackBuffer, (1)//堆栈首地址 puxStackBuffer
	StaticTask_t * const pxTaskBuffer )
	//(1)、任务堆栈,静态方法下需要用户定义,然后将堆栈首地址传递给这个参数

堆栈首地址 puxStackBuffer类型为StackType_t *

堆栈大小

不管是使用函数 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;

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

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

相关文章

智慧工地管理系统(Smart site management system)源码

智慧工地管理系统是面向建筑工程施工企业提供的工地智能交互平台,基于云计算、物联网、人工智能等技术的应用,对现场人员、材料、机械、质量、安全等进行高效管控,以实现项目管理人员对现场的实时把控、及时预警、精准决策,从而为…

Golang学习:基础篇练习(二)—— 数组切片小实验

Golang学习:基础篇练习(二)—— 数组切片小实验 本次实验是对数组切片的,目的就是为了加深理解,一起来看看吧。 1、下面这段代码有问题吗?为什么 func main() {greeting : make([]string, 3, 5)// 3 is len…

FPGA基于1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、我这里已有的以太网方案3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲IP地址、端口号的修改Tri Mode Ethernet MAC1G/2.5G Ethernet PCS/PMA or SGMIIQT上位机和源…

08-网络篇-一步步完成网络通信

上面的章节描述了Tcp/ip四层网络模型,并介绍了每一层的常见的协议,本章来讨论一下,一个主机是怎样与外网中的另一个主机通信。 假如网络结构如下 上图是一个典型的网络结构图,若主机1是电脑,主机4是服务器,…

申请者用Chat GPT写申请文书?国外大学纷纷采取措施

近来,人工智能聊天机器人ChatGPT实火。ChatGPT拥有强大的信息整合能力、自然语言处理能力,可谓是“上知天文,下知地理”,而且还能根据要求进行聊天、撰写文章等。 ChatGPT一经推出,便迅速在社交媒体上走红&#xff0c…

NTP时间同步协议

NTP net working protocol网络时间同步协议概述 同步互联网中主机和路由器之间的时钟在局域网上提供亚毫秒精度,在广域网上提供几十毫秒精度冗余服务器和多种网络路径保证了可靠性工程算法用于减少抖动,缓解多个源和避免不正确操作的服务器 How NTP wo…

百度上怎么录视频?全攻略来了,一看就会!

在这个信息化高度发达的时代,通过网络平台录制视频已经成为许多人生活中不可或缺的一部分。无论是展示自己的工作成果、分享自己的生活点滴,还是传播知识与信息,录制视频都是一个非常受欢迎的方式。而百度作为全球最大的中文搜索引擎&#xf…

智能门锁产品中应用的抗干扰低功耗触摸感应芯片

智能门锁是指区别于传统机械锁的基础上改进的,在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能门锁区别于传统机械锁, 是具有安全性, 便利性, 先进技术的复合型锁具。使用非机械钥匙作为用户识别ID的成熟技术。 …

嵌入式开发实战系列:QSPI Flash驱动功能解析

嵌入式开发实战系列:QSPI Flash驱动功能解析 前言 首先,请问大家几个小小问题,你清楚: QSPI协议的基本内容与功能应用场景吗?QSPI Flash驱动读写过程中存在哪些不一样的操作模式呢?基于AUTOSAR架构下Flas…

云爬虫系统设计-云平台资源管理优化爬虫性能

在构建爬虫系统时,充分利用云平台的资源管理功能可以优化爬虫的性能,提高爬取速度。在本文中,我将与大家分享如何设计一个高效的云爬虫系统,以实现资源管理的优化。通过合理配置云平台,我们可以充分发挥云计算的优势&a…

内裤洗衣机有用吗?内衣洗衣机推荐

冬天正在临近,普通的衣服有日常的洗衣机洗,但内衣裤就成了很多小伙伴的困扰,在我们的观念中,内衣裤是绝对不可以和普通的衣服一起清洗,在冰冷的冬季还要手洗这些贴身衣物,真的很难受,所以拥有一…

xml schema中的all元素

说明 xml schema中的all元素表示其中的子元素可以按照任何顺序出现&#xff0c;每个元素可以出现0次或者1次。 https://www.w3.org/TR/xmlschema-1/#element-all maxOccurs的默认值是1&#xff0c;minOccurs 的默认值是1。 举例 <element name"TradePriceRequest&…

【nginx】监听80端口不生效问题

技巧&#xff1a;查询当前nginx监听的端口号有哪些 sudo netstat -tulpn | grep nginx 我是学自这篇文章 Nginx在配置监听80端口不生效问题_nginx启动监听不到9090端口_乌鸦啊的博客-CSDN博客Nginx安装之后在/etc/nginx/nginx.conf配置文件引用其它文件的配置&#xff0c;如…

LoRa无线温控器的技术选择及应用优势

一、LoRa无线扩频技术在无线温控器市场需求分析 中央空调系统末端风机盘管智能化节能运行已经成为行业的发展趋势&#xff0c;实现风机盘管智能化运行需要强大的通讯技术支持。各种先进的现场总线技术如LonWorks、BACnet MS/TP总线技术联网型房间温控器相继进入市场,而低成本的…

【JVM面试题】JVM分代年龄为何是15次?能设置为16吗?

系列文章目录 【JVM系列】第一章 运行时数据区 【JVM面试题】第二章 从JDK7 到 JDK8, JVM为啥用元空间替换永久代&#xff1f; 【JVM面试题】第三章 JVM分代年龄为何是15次&#xff1f;能设置为16吗&#xff1f; 大家好&#xff0c;我是青花。拥有多项发明专利&#xff08;都是…

c++中的继承(下)

首先我们先回忆一下&#xff0c;在派生类&#xff08;子类&#xff09;中默认的成员函数做了什么事情&#xff1f;我们现在可以这么认为对于普通类来说呢&#xff1f;只需要看待两个部分的成员&#xff1a;内置类型和自定义类型。而对于派生类而言序言看待三个部分的成员&#…

Mybatis 配置自动生成代码飘红 解决方法

在配置Mybatis自动生成代码的时候&#xff0c;明明按照教程一字不落地拷贝下来了&#xff0c;还是报了大片的错&#xff0c;gpt也无法给出有效的解决方法。 后来发现&#xff0c;是引用的头文件不对。 例如&#xff1a; 无法解析 StringUtils 中的方法 isNotBlank gpt给出的…

VS2022:结构化诊断

对于许多 C 开发人员来说&#xff0c;如果编译器爆出了大量的编译错误&#xff0c;且错误之间还没有明显的关联&#xff0c;这可就不好玩了。 如果开发环境可以提供更容易理解的错误提示和诊断体验&#xff0c;则开发人员就更加容易的找到错误原因并修复它。 我曾经写了一篇文…

【软考-中级】系统集成项目管理工程师-风险管理历年案例

持续更新。。。。。。。。。。。。。。。 目录 2020 下 试题三(20分) 2020 下 试题三(20分) 2018 年底&#xff0c;某公司承接了大型企业数据中心的运行维护服务项目&#xff0c;任命经验丰富的王伟为项目经理。 2019 年1月初项目启动会后&#xff0c;王伟根据经验编制了风险管…

超声波清洗机需要注意什么?不能错过的超声波清洗机

超声波清洗机在当今社会已经越来越受到人们的欢迎&#xff0c;它利用超声波的振动来清洁物品表面&#xff0c;能够快速、高效地清除污垢、油脂等。但是&#xff0c;在购买超声波清洗机时&#xff0c;需要注意哪些问题呢&#xff1f;本文将为您介绍购买超声波清洗机需要注意的几…