FreeRtos的使用教程
定义:
RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。
特点:
支持多任务管理, 处理多个事件, 实现更复杂的逻辑。


与计算机操作系统的区别:
RTOS专注于 轻量级, 实时性, 稳定性, 相对于计算机主流系统, RTOS有严格的时间控制和响应速度, 成本低, 资源开销小, 所以可以用于嵌入式领域。
配置:
core设置非安全模式下的内核支持
heap:设置第四种堆区设置方式

Core: 选择 不适用安全模式
Heap: 在 FreeRTOS内, 支持五种堆空间开辟的方法:

使用过程中的状态转换关系图

任务调度的核心:
抢占式调度,时间片轮询
任务的创建:
通过cubeMX进行任务的添加和设置


相关的MX_FREERTOS_Init函数
/* 任务属性结构体:*/
typedef struct {
const char *name; ///< 任务的名字
uint32_t attr_bits; ///< 操作的标志
void *cb_mem; ///< 任务的内存地址
uint32_t cb_size; ///< 当前任务的内存大小
void *stack_mem; ///< 当前任务的栈内存地址
uint32_t stack_size; ///< 当前栈内存大小
osPriority_t priority; ///< 当前任务的优先级
TZ_ModuleId_t tz_module; ///< TrustZone module identifier
uint32_t reserved; ///< reserved (must be 0)
} osThreadAttr_t;
2.任务的优先级
typedef enum {
osPriorityNone = 0, ///< No priority (not initialized).
osPriorityIdle = 1, ///< Reserved for Idle thread.
osPriorityLow = 8, ///< Priority: low
osPriorityLow1 = 8+1, ///< Priority: low + 1
osPriorityLow2 = 8+2, ///< Priority: low + 2
osPriorityLow3 = 8+3, ///< Priority: low + 3
osPriorityLow4 = 8+4, ///< Priority: low + 4
osPriorityLow5 = 8+5, ///< Priority: low + 5
osPriorityLow6 = 8+6, ///< Priority: low + 6
osPriorityLow7 = 8+7, ///< Priority: low + 7
osPriorityBelowNormal = 16, ///< Priority: below normal
osPriorityBelowNormal1 = 16+1, ///< Priority: below normal + 1
osPriorityBelowNormal2 = 16+2, ///< Priority: below normal + 2
osPriorityBelowNormal3 = 16+3, ///< Priority: below normal + 3
osPriorityBelowNormal4 = 16+4, ///< Priority: below normal + 4
osPriorityBelowNormal5 = 16+5, ///< Priority: below normal + 5
osPriorityBelowNormal6 = 16+6, ///< Priority: below normal + 6
osPriorityBelowNormal7 = 16+7, ///< Priority: below normal + 7
osPriorityNormal = 24, ///< Priority: normal
osPriorityNormal1 = 24+1, ///< Priority: normal + 1
osPriorityNormal2 = 24+2, ///< Priority: normal + 2
osPriorityNormal3 = 24+3, ///< Priority: normal + 3
osPriorityNormal4 = 24+4, ///< Priority: normal + 4
osPriorityNormal5 = 24+5, ///< Priority: normal + 5
osPriorityNormal6 = 24+6, ///< Priority: normal + 6
osPriorityNormal7 = 24+7, ///< Priority: normal + 7
osPriorityAboveNormal = 32, ///< Priority: above normal
osPriorityAboveNormal1 = 32+1, ///< Priority: above normal + 1
osPriorityAboveNormal2 = 32+2, ///< Priority: above normal + 2
osPriorityAboveNormal3 = 32+3, ///< Priority: above normal + 3
osPriorityAboveNormal4 = 32+4, ///< Priority: above normal + 4
osPriorityAboveNormal5 = 32+5, ///< Priority: above normal + 5
osPriorityAboveNormal6 = 32+6, ///< Priority: above normal + 6
osPriorityAboveNormal7 = 32+7, ///< Priority: above normal + 7
osPriorityHigh = 40, ///< Priority: high
osPriorityHigh1 = 40+1, ///< Priority: high + 1
osPriorityHigh2 = 40+2, ///< Priority: high + 2
osPriorityHigh3 = 40+3, ///< Priority: high + 3
osPriorityHigh4 = 40+4, ///< Priority: high + 4
osPriorityHigh5 = 40+5, ///< Priority: high + 5
osPriorityHigh6 = 40+6, ///< Priority: high + 6
osPriorityHigh7 = 40+7, ///< Priority: high + 7
osPriorityRealtime = 48, ///< Priority: realtime
osPriorityRealtime1 = 48+1, ///< Priority: realtime + 1
osPriorityRealtime2 = 48+2, ///< Priority: realtime + 2
osPriorityRealtime3 = 48+3, ///< Priority: realtime + 3
osPriorityRealtime4 = 48+4, ///< Priority: realtime + 4
osPriorityRealtime5 = 48+5, ///< Priority: realtime + 5
osPriorityRealtime6 = 48+6, ///< Priority: realtime + 6
osPriorityRealtime7 = 48+7, ///< Priority: realtime + 7
osPriorityISR = 56, ///< Reserved for ISR deferred thread.
osPriorityError = -1, ///< System cannot determine priority or illegal priority.
osPriorityReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization.
} osPriority_t;
osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr)
void osThreadExit (void)
osStatus_t osDelay (uint32_t ticks)
osStatus_t osThreadDetach (osThreadId_t thread_id);
osStatus_t osThreadJoin (osThreadId_t thread_id)
信号量
信号量实际上就是一个值,这个值被用来解决临界区问题以及实现进程在多处理器环境下的进程同步。主要分为二值信号量和计数信号量,前者主要用于互斥访问和同步,类似于互斥信号量,不同点是二值信号量不具有优先级继承机制,这也使得其适于同步任务。而后者又称为数值信号量,数值大于1时使用的重点不在其中存储了什么数据而是通过数值去事件计数和资源管理(生产者消费者模型)
对于二值信号量的具体使用:
创建、申请or释放信号(p,v操作)
相关函数:
SemaphoreHandle_t xSemaphoreCreateBinary(void)
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xBlockTime)
BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore, BaseType_t* pxHigherPriorityTaskWoken)
BaseType_t xSemaphoreGive(xSemaphore)
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore, BaseType_t* pxHigherPriorityTaskWoken)
对于计数信号量的使用:
事件计数
事件发生释放信号量数值+1,其它事件获取后数值-1,初始值为0
资源管理
信号量的数值代表着可用的资源数量,使用资源先获取,数量-1,用完之后再释放,数量+1, 初值根据资源的数量去决定。
相关函数
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount)
信号量的释放与获取与二值信号量相同:
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xBlockTime)
BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore, BaseType_t* pxHigherPriorityTaskWoken)
BaseType_t xSemaphoreGive(xSemaphore)
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore, BaseType_t* pxHigherPriorityTaskWoken)
uxSemaphoreGetCount(信号量句柄 )
对于对互斥型信号量的使用:
其是一种特殊的二值信号量,特点是优先级继承机制,作用是保护临界资源(类似于互斥锁)
相关函数
SemaphoreHandle_t xSemaphoreCreateMutex(void)
信号量的释放与获取与二值信号量相同:
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xBlockTime)
BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore, BaseType_t* pxHigherPriorityTaskWoken)
BaseType_t xSemaphoreGive(xSemaphore)
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore, BaseType_t* pxHigherPriorityTaskWoken)
事件标志组
为了实现多个任务或事件进行同步。
相关函数:
osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr);
uint32_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags);
uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags,\ uint32_t options, uint32_t timeout);
队列:
用于任务到任务或者任务到中断再到任务的通信数据结构

相关函数:
typedef struct {
const char *name; ///< 消息队列的名称
uint32_t attr_bits; ///< 属性位
void *cb_mem; ///< 控制块(Control Block)的内存指针
uint32_t cb_size; ///< 控制块的大小
void *mq_mem; ///< 数据存储的内存指针
uint32_t mq_size; ///< 数据存储的大小
} osMessageQueueAttr_t;
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size,\ const osMessageQueueAttr_t *attr);
osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr,\ uint8_t msg_prio, uint32_t timeout);
osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr,\ uint8_t *msg_prio, uint32_t timeout);
FREERTOS软件定时器:
可以分为一次性的和周期的即某时间点进行函数功能调用和周期执行某个函数的功能
相关函数:
osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr)
osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks)
osStatus_t osTimerStop (osTimerId_t timer_id)
osTimerDelete (osTimerId_t timer_id)
注:修改定时器任务的优先级要尽量高一点
修改任务的优先级要尽量的低一点
相关文章:
FreeRtos的使用教程
定义: RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。 特点: 支持多任务管理, 处理多个事件, 实现更复杂的逻辑。 与计算…...
windows系统如何检查是否开启了mongodb服务
windows系统如何检查是否开启了mongodb服务!我们有很多软件开发,网站开发时候需要使用到这个mongodb数据库,下面我们看看,如何在windows系统内排查,是否已经启动了本地服务。 在 Windows 系统上,您可以通过…...
windows蓝牙驱动开发-生成和发送蓝牙请求块 (BRB)
以下过程概述了配置文件驱动程序生成和发送蓝牙请求块 (BRB) 应遵循的一般流程。 BRB 是描述要执行的蓝牙操作的数据块。 生成和发送 BRB 分配 IRP。 分配BRB,请调用蓝牙驱动程序堆栈导出以供配置文件驱动程序使用的 BthAllocateBrb 函数。;初始化 BRB…...
基于Ubuntu交叉编译ZLMediaKit
一、确保基于虚拟机VMVare的Ubuntu能正常上网 1、设置WIFI硬件无线网卡上网 菜单栏的“编辑”->选择“虚拟网络编辑器”,在弹出的窗口中,点击桥接模式的VMnet0,然后在下方选择“桥接模式”,网卡下拉栏,选择你目前…...
【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM
参考: https://www.youtube.com/watch?veC6Hd1hFvos 目录: 什么是 Fine-tune 为什么需要Fine-tuning 如何进行Fine-tune Fine-tuning- Supervised Fine-tuning 流程 Fine-tuning参数训练的常用方案 LORA 简介 示例代码 一 什么是 Fine-tune …...
git回退
git回退 1、未使用 git add 缓存代码时 git checkout –- filepathname 放弃单个文件的修改 git checkout . 放弃所有的文件修改 此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不…...
数字图像处理:实验七
uu们!这是我们目前数字图像系列的最后一张,之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中,所以还请大家给咸鱼哥点时间,同时也提前预祝大家2025年新春快乐!(咸鱼哥真诚的祝愿每一个人…...
网易前端开发面试题200道及参考答案 (下)
阐述如何实现 img 按照原比例最大化放置在 div 中? 要让 img 按照原比例最大化放置在 div 中,可通过以下几种方式实现: 使用 object - fit 属性 object - fit 是 CSS 中用于规定如何调整替换元素(如 <img>、<video>)的内容以适应其容器的属性。 object - fit…...
通义灵码插件保姆级教学-IDEA(安装及使用)
一、JetBrains IDEA 中安装指南 官方下载指南:通义灵码安装教程-阿里云 步骤 1:准备工作 操作系统:Windows 7 及以上、macOS、Linux; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本,通义灵码与以下 IDE 兼容&…...
利用双指针一次遍历实现”找到“并”删除“单链表倒数第K个节点(力扣题目为例)
Problem: 19. 删除链表的倒数第 N 个结点 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲找到倒数第k个节点,即是找到正数的第n-k1、其中n为单链表中节点的个数个节点。 2.为实现只遍历一次单链表,我们先可以使一个指针p1指向链表头部再让其先走k步…...
2025美赛倒计时,数学建模五类模型40+常用算法及算法手册汇总
数学建模美赛倒计时,对于第一次参加竞赛且没有相关基础知识的同学来讲,掌握数学建模常用经典的模型算法知识,并熟练使用相关软件进行建模是关键。本文将介绍一些常用的模型算法,以及软件操作教程。 数学建模常用模型包括…...
sql中INNER JOIN、LEFT JOIN、RIGHT JOIN
INNER JOIN 的作用 INNER JOIN 只会将相关联表匹配到的数据进行展示 假设我们有两个表:sys_user和 sys_user_role SELECT s1.* from sys_user s1 INNER JOIN sys_user_role s2 on s1.id s2.user_id 这样只会展示s1.id s2.user_id相匹配到的数据,其他数…...
二十三种设计模式-享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享相同对象来减少内存使用,尤其适合在大量重复对象的情况下。 核心概念 享元模式的核心思想是将对象的**可共享部分(内部状态)提取出来进行共…...
前端【10】jQuery DOM 操作
目录 jquery捕获查取 获得内容 - text()、html() 以及 val() 获取属性 - attr() 编辑 jQuery 修改/设置内容和属性 设置内容 - text()、html() 以及 val() 设置属性 - attr() jQuery添加元素 jQuery - 删除元素 前端【9】初识jQuery:让JavaScript变得更简…...
Day34:字符串的替换
在 Python 中,字符串替换是一个非常常见的操作,主要用于修改字符串中的某些部分。字符串的替换操作通常不修改原始字符串,因为字符串在 Python 中是不可变的,而是返回一个新的字符串。 Python 提供了 str.replace() 方法来执行替…...
汇编的使用总结
一、汇编的组成 1、汇编指令(指令集) 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令,但是可以起到指令的作用,伪…...
力扣【347. 前 K 个高频元素】Java题解(堆)
TopK问题,我们直接上堆。 首先遍历一次然后把各个数字的出现频率存放在哈希表中便于后面堆的操作。 因为是出现频率前 k 高,所以用小顶堆,当我们遍历的频率值大于堆顶值时就可以替换堆顶。 代码: class Solution {public int[] …...
【计算机网络】host文件
host文件的主要功能: 域名解析 本地映射:host文件的主要功能是将**域名映射到相应的 IP 地址**。当计算机需要访问一个网站或服务时,它会首先在 host文件中查找该域名对应的 IP 地址。如果在 host文件中找到了匹配的域名和 IP 地址映射&…...
git如何设置pull的时候有些文件不pull
在 Git 中,没有直接的方法在 git pull 时排除特定文件,但可以通过以下方式实现类似效果: 方法 1: 使用 .gitignore .gitignore 文件可以忽略未跟踪的文件,但对已跟踪的文件无效。如果你希望某些文件不被拉取,可以先将…...
第五节 MATLAB命令
本节的内容将提供常用的一些MATLAB命令。 在之前的篇章中我们已经知道了MATLAB数值计算和数据可视化是一个交互式程序,在它的命令窗口中您可以在MATLAB提示符“>>”下键入命令。 MATLAB管理会话的命令 MATLAB提供管理会话的各种命令。如下表所示:…...
性能测试丨JVM 性能数据采集
什么是JVM性能数据采集? JVM性能数据采集是指通过一些工具和技术采集与Java虚拟机相关的性能数据。这些数据包括但不限于内存使用、CPU使用、垃圾回收(GC)行为、线程活动等。合理地分析这些数据,可以帮助我们找出系统的瓶颈&…...
vue3 vue2区别
Vue 3 和 Vue 2 之间存在多个方面的区别,以下是一些主要的差异点: 1. 性能改进 Vue 3:在性能上有显著提升,包括更小的包体积、更快的渲染速度和更好的内存管理。Vue 2:性能相对较低,尤其是在大型应用中。…...
快速更改WampServer根目录php脚本
快速更改WampServer根目录php脚本 <?php // 配置文件地址 $apacheConfPath C:\Install\CTF\Wampserver\bin\apache\apache2.4.62.1\conf\httpd.conf; $apacheConfPath2 C:\Install\CTF\Wampserver\bin\apache\apache2.4.62.1\conf\extra\httpd-vhosts.conf; // 新根目录…...
金价高企需求疲软,周大福近三个月零售值下降14.2%
1月22日,周大福在港交所发布公告称,截至2024年12月31日止三个月(第三季度),集团零售值下降14.2%。其中,中国内地市场零售值下降13.0%,香港及澳门市场零售值下降20.4%,其他市场零售值…...
想品客老师的第七天:闭包和作用域
闭包之前的内容写在这里 环境、作用域、回收 首先还是数据的回收问题,全局变量一般都是通过关闭页面回收的;而局部变量的值不用了,会被自动回收掉 像这种写在全局里的就不会被主动回收捏: let title 荷叶饭function fn() {ale…...
Web 代理、爬行器和爬虫
目录 Web 在线网页代理服务器的使用方法Web 在线网页代理服务器使用流程详解注意事项 Web 请求和响应中的代理方式Web 开发中的请求方法借助代理进行文件下载的示例 Web 服务器请求代理方式代理、网关和隧道的概念参考文献说明 爬虫的工作原理及案例网络爬虫概述爬虫工作原理 W…...
速通Docker === Docker 镜像分层存储机制
目录 分层存储的概念 分层存储的实现 镜像层 容器层 分层存储的优势 1. 镜像轻量化 2. 快速构建与部署 3. 高效的镜像共享 4. 版本控制 分层存储的示例 容器层的临时性与数据持久化 总结 Docker 的分层存储机制是其核心特性之一,它使得镜像的构建、共享和…...
开源智慧园区管理系统对比五款主流产品探索智能运营新模式
内容概要 在这个数字化迅速发展的时代,园区管理也迎来了全新的机遇和挑战。众所周知,开源智慧园区管理系统作为一种创新解决方案,正逐步打破传统管理的局限性。它的开放性不仅使得系统可以根据具体需求进行灵活调整,也为用户提供…...
用Devc++与easyx一步一步做游戏[启动界面部分]-解决hover闪烁问题及优化
在之前的博文中《用Devc与easyx一步一步做游戏[启动界面部分]-之按钮制作》,我们利用Devc和easyx完成了游戏启动界面按钮的基本制作,实现了按钮的绘制以及鼠标悬停时的信息提示功能。然而,目前还存在一个问题,即鼠标移动时&#x…...
非根目录部署 nextjs 项目,资源文件 请求404 的问题
最近在学习next项目编写的代码放到服务器上静态资源404 先分析问题 到服务器上查看是有资源目录的是不是项目配置有问题是不是nginx配置有问题 经过排查1和2是没有问题的目前来看只有3 检查一下nginx配置 尝试着把静态资源的配置禁用 问题解决 我的next项目用的是pm2管理…...
