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

news/2024/11/19 9:27:00/

前后台系统(裸机)

裸机又称前后台系统,在一个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 相关设置
#endifListItem_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,//如果是动态创建的就为 pdFALSEuint8_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)//堆栈首地址 puxStackBufferStaticTask_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.ppmy.cn/news/1158489.html

相关文章

137.【SpringCloud-快速搭建】

微服务框架搭建 (一)、SpringCloud-Parent1.创建一个SpringBoot项目2.导入我们的依赖 (二)、SpringCloud-API (实体类)1.创建一个SpringBoot项目2.导入我们的依赖3.创建我们的实体类 (三)、SpringCloud-dept (业务A)1.创建一个SpringBoot项目2.导入我们的依赖3.配置我们的配置信…

linux系统编程之一

1)fcntl的使用方法 fcntl作用:可以用fcntl函数改变一个已打开的文件属性而不必重新打开文件; 堆排序是完全二叉树,但不是排序二叉树; 排序二叉树要求兄弟节点之间有大小关系,比如说左小右大; 堆排序仅要求…

GitHub验证的2FA

一、 起因: GitHub需要双重身份验证 (2FA) 是登录网站或应用时使用的额外保护层。启用 2FA 时,必须使用您的用户名和密码登录,并提供另一种只有您知道或可以访问的身份验证形式。 二、解决: 2.1 这里使用chrome的身份验证插件进…

GitHub仓库的README文件无法显示图片问题-非域名污染原因

之前上自己仓库就偶然发现图片不显示现象,当时以为是网络问题就没有留意这事。但是一直不显示就有问题了!于是网上搜了一遭,看见大家遇到此现象的原因普遍归于DNS污染1而我的问题原来是MarkDown格式! 在图片语法前不要加分区语法…

【C/C++】静态库和动态库命名规范及最佳实践

在软件开发中,静态库和动态库是常用的代码复用形式。为了保持良好的代码组织和可维护性,以及遵循统一的命名规范是非常重要的。本文将介绍静态库和动态库的命名规范,并提供一些最佳实践,以帮助开发人员在项目中正确命名库文件。 …

DevExpress WinForms甘特图组件 - 轻松集成项目管理功能到应用

DevExpress WinForms Gantt(甘特图)控件允许您在下一个WinForms桌面应用程序中快速合并项目规划和任务调度功能。 DevExpress WinForms有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于…

大厂秋招真题【DP】小红书20230726秋招提前批T3-连续子数组最大和【欧弟算法】全网最全大厂秋招题解

题目描述与示例 题目描述 小红拿到了一个数组,她希望进行最多一次操作:将一个元素修改为x。小红想知道,最终的连续子数组最大和最大是多少? 输入描述 第一行输入一个正整数t,代表询问次数。 对于每次询问&#xf…

读书笔记:Effective C++ 2.0 版,条款9(避免隐藏标准形式的new)、条款10(new、delete对称定义)

条款9: 避免隐藏标准形式的new #include <cstddef> #include <new> #include <iostream> class MyClass { public:// 用户定义的带有参数的 operator newstatic void* operator new(std::size_t size, int extra) {std::cout << "Custom new wit…