freertos的学习cubemx版

HAL 库的freertos

1 实时

2 任务->线程

3 移植

CMSIS_V2 V1版本

NVIC配置全部是抢占优先级 第四组 抢占级别有 0-15

编码规则,

变量名 :类型前缀,

c - char

S - int16_t

L - int32_t

U - unsigned

Uc - uint8_t

Us - uint16_t

指针变量 需要再变量前加一个P

非标准的类型变量名 X

ux是Ubasetype_t 类型的前缀

函数名:有返回值类型和文件所在组成

xTaskCreate() 这个就是返回类型为BaseType_t 在文件名 task.h定义

vQueueDelete() 返回值类型为void 在文件queue.h定义

pcTimerGetName() 返回值为 char * 在timer.h定义

CMSIS RTOS相关文件定义的函数前缀为 os 不包过返回值类型和所在文件的前缀

例如cmsis_os2.h中得函数osThreadNew().

FreeRTOS的配置和功能裁剪 主要是通过文件 FreeRTOSConfig.h和FreeRTOS.h中得一些宏定义实现的。

Cubemx中得FreeRTOS的 config parameters 配置

MPU/FPU 内存保护单元 和 浮点数单元功能

任务管理:调度器

任务状态:

就绪状态 任务被创建后就进入了就绪状态,就绪任务的优先级高于当前运行任务的优先

级,它就会进入运行状态,如果低于当前任务优先级 他依然是就绪状态

运行状态 正在运行任务状态,如果处于运行态的高优先级任务一直在运行时就会导致低

优先级的就绪态不能够运行,需要使用vTaskSuspend 进入挂起态或者进入阻塞态。

阻塞状态 让任务暂时跳出占用cpu的使用权,处于一种等待状态。通过延时函数

vTaskDelay() 或者 vTaskDelayUntil()进入阻塞状态 ,等待时间达到后,任务进入就绪状态,在下一次的任务调度中进行运行。第二个就是通过进程之间通讯的时间请求函数,例如请求信号量的函数xSemaphoreTake() 运行这个函数后,任务会进入阻塞状态等待信号量和其他函数的延迟。

挂起状态 挂起状态的任务就是不进行调度的任务,需要其他任务进行调用函数,

vTaskResume()进入就绪状态

抢占式和合作式

任务的优先级:总优先级个数是由 FreeRTOSConfig.h中宏congfigMAX_PRIORITIES来定义默认56 数字越小优先级越低

空闲任务:osKernelStart()启动FreeRTOS的任务调度器时 会自动创建一个空闲任务 ldle task 空闲任务的优先级别为 0

主要配置参数:

congfigUSE_TICK_HOOK 是否使用空闲函数的钩子函数 配置1 则可以利用空闲任务的钩子函数,系统空闲时做一些处理

congfigIDLE_SHOULD_YIELD 空闲任务是否对同优先级的任务主动让出cpu控制权

congfigUSE_TICKLESS_IDLE 是否在空闲任务时关闭基础时钟,若配置1 可实现系统低功耗

任务调度方法

抢占式调度方法

上下文切换是通过汇编语言写的 在上面这个函数里面实现了任务调度

任务管理工具函数 :

获取任务句柄的三个函数

获取或者改变任务优先级:

获取

改变

获取任务信息

获取任务名称

任务栈空间 偏小越容易溢出

任务的状态

任务数量

返回所有任务的列表信息 内存消耗比较大

获得所有任务的状态

运行时间 运行时会禁止中断

返回调度器的状态

taskENTER_CRITICAL() 和 taskEXIT_CRITICAL( ) 实现开关中断

这些中断屏蔽函数只能屏蔽 freertos 的中断,不能够屏蔽 硬件中断

硬件触发和软件触发的某些中断是 不可以调用 freertos的api函数,因为这些中断不是freertos的一个任务

进程间通信与消息队列:queue消息队列

队列 queue 一个缓冲区 在进程间传递少量的数据 被称为 消息队列

信号量 semaphore 分为而知信号量和技术信号量 二值信号量适用于进程间同步 计数

信号量一般用于共享资源的管理

互斥量 Mutex 互斥量和递归互斥量 ----- 互斥量具有优先级继承机制,减少优先级翻转

事件组 Event Group 事件组可以用于多个时间触发一个和多个任务运行 实现事件的 广播 还可以实现多个任务的同步运行

流缓冲区和消息缓冲区 v10 版本功能,用于优化进程间通信机制 应用于只有一个 写入者和读取者 适用于多核 cpu 的内核之间传输数据

队列的特点和基本操作

这个函数可以读取数据 读完数据后 就会删除队列

这个函数可以读取数据 读完数据后 不会删除这个队列

在中断服务程序 isr 中操作队列的话就需要 运行这种带有 fromisr 的函数

将队列中得数据全部复位为空

删除一个队列 和一个队列信号量

获取一个队列的名称

为队列设置一个编号

获取队列的编号

获取队列的剩余空间个数

获取队列中等待被读取的消息个数

一个查空一个插满

将消息写入队列的后方

信号量

互斥量

相关的函数:

事件组

信号量

事件组:

相关推荐
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__2 小时前
Web APIs学习 (操作DOM BOM)
学习
数据的世界014 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐5 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
OopspoO7 小时前
qcow2镜像大小压缩
学习·性能优化
A懿轩A7 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒7 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
kkflash38 小时前
提升专业素养的实用指南
学习·职场和发展
1 9 J8 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
6.9410 小时前
Scala——身份证号码查询籍贯
学习·scala