FreeRtos的使用教程

news2025/3/3 22:57:44

定义:

        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)

注:修改定时器任务的优先级要尽量高一点

        修改任务的优先级要尽量的低一点

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

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

相关文章

基于Ubuntu交叉编译ZLMediaKit

一、确保基于虚拟机VMVare的Ubuntu能正常上网 1、设置WIFI硬件无线网卡上网 菜单栏的“编辑”->选择“虚拟网络编辑器”&#xff0c;在弹出的窗口中&#xff0c;点击桥接模式的VMnet0&#xff0c;然后在下方选择“桥接模式”&#xff0c;网卡下拉栏&#xff0c;选择你目前…

【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM

参考&#xff1a; https://www.youtube.com/watch?veC6Hd1hFvos 目录&#xff1a; 什么是 Fine-tune 为什么需要Fine-tuning 如何进行Fine-tune Fine-tuning- Supervised Fine-tuning 流程 Fine-tuning参数训练的常用方案 LORA 简介 示例代码 一 什么是 Fine-tune …

数字图像处理:实验七

uu们&#xff01;这是我们目前数字图像系列的最后一张&#xff0c;之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中&#xff0c;所以还请大家给咸鱼哥点时间&#xff0c;同时也提前预祝大家2025年新春快乐&#xff01;&#xff08;咸鱼哥真诚的祝愿每一个人&#xf…

通义灵码插件保姆级教学-IDEA(安装及使用)

一、JetBrains IDEA 中安装指南 官方下载指南&#xff1a;通义灵码安装教程-阿里云 步骤 1&#xff1a;准备工作 操作系统&#xff1a;Windows 7 及以上、macOS、Linux&#xff1b; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本&#xff0c;通义灵码与以下 IDE 兼容&…

利用双指针一次遍历实现”找到“并”删除“单链表倒数第K个节点(力扣题目为例)

Problem: 19. 删除链表的倒数第 N 个结点 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲找到倒数第k个节点&#xff0c;即是找到正数的第n-k1、其中n为单链表中节点的个数个节点。 2.为实现只遍历一次单链表&#xff0c;我们先可以使一个指针p1指向链表头部再让其先走k步…

2025美赛倒计时,数学建模五类模型40+常用算法及算法手册汇总

数学建模美赛倒计时&#xff0c;对于第一次参加竞赛且没有相关基础知识的同学来讲&#xff0c;掌握数学建模常用经典的模型算法知识&#xff0c;并熟练使用相关软件进行建模是关键。本文将介绍一些常用的模型算法&#xff0c;以及软件操作教程。 数学建模常用模型包括&#xf…

前端【10】jQuery DOM 操作

目录 jquery捕获查取 获得内容 - text()、html() 以及 val() 获取属性 - attr() ​编辑 jQuery 修改/设置内容和属性 设置内容 - text()、html() 以及 val() 设置属性 - attr() jQuery添加元素 jQuery - 删除元素 前端【9】初识jQuery&#xff1a;让JavaScript变得更简…

汇编的使用总结

一、汇编的组成 1、汇编指令&#xff08;指令集&#xff09; 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令&#xff0c;但是可以起到指令的作用&#xff0c;伪…

想品客老师的第七天:闭包和作用域

闭包之前的内容写在这里 环境、作用域、回收 首先还是数据的回收问题&#xff0c;全局变量一般都是通过关闭页面回收的&#xff1b;而局部变量的值不用了&#xff0c;会被自动回收掉 像这种写在全局里的就不会被主动回收捏&#xff1a; let title 荷叶饭function fn() {ale…

速通Docker === Docker 镜像分层存储机制

目录 分层存储的概念 分层存储的实现 镜像层 容器层 分层存储的优势 1. 镜像轻量化 2. 快速构建与部署 3. 高效的镜像共享 4. 版本控制 分层存储的示例 容器层的临时性与数据持久化 总结 Docker 的分层存储机制是其核心特性之一&#xff0c;它使得镜像的构建、共享和…

开源智慧园区管理系统对比五款主流产品探索智能运营新模式

内容概要 在这个数字化迅速发展的时代&#xff0c;园区管理也迎来了全新的机遇和挑战。众所周知&#xff0c;开源智慧园区管理系统作为一种创新解决方案&#xff0c;正逐步打破传统管理的局限性。它的开放性不仅使得系统可以根据具体需求进行灵活调整&#xff0c;也为用户提供…

非根目录部署 nextjs 项目,资源文件 请求404 的问题

最近在学习next项目编写的代码放到服务器上静态资源404 先分析问题 到服务器上查看是有资源目录的是不是项目配置有问题是不是nginx配置有问题 经过排查1和2是没有问题的目前来看只有3 检查一下nginx配置 尝试着把静态资源的配置禁用 问题解决 我的next项目用的是pm2管理…

mysql 学习5 mysql图形化界面DataGrip下载 安装 使用

一、下载和安装 下载&#xff1a; 其他版本 - DataGrip PS&#xff1a;安装目录最好不要有中文。 C:\Program Files\JetBrains\DataGrip 2023.3.4 二、 夸克网盘分享 当前电脑是下载到 &#xff1a;D:\Ctool\mysql\datagrip2023_3_4\datagrip2024\jetbra-datagrip\scripts …

读写和解析简单的 nc 文件

NetCDF 文件格式在气象数据工程领域占据着举足轻重的地位&#xff0c;其结构灵活、强兼容性等优势使其成为该领域的一个标准。无论是从事学术研究还是工程实践&#xff0c;掌握这种数据格式变得越发重要。其次&#xff0c;我注意到目前社区中气象编程大多数课程都聚焦于某个特定…

LLM:BERT or BART 之BERT

文章目录 前言一、BERT1. Decoder-only2. Encoder-only3. Use of Bidirectional Context4. Masked Language Model (MLM)5. Next Sentence Prediction (NSP)6. Fine-tune1、情感分析2、句对分析3、命名实体识别&#xff08;NER&#xff09; 7. BERT总结 总结 前言 NLP选手对这…

【力扣:新动计划,编程入门 —— 题解 ③】

—— 25.1.26 231. 2 的幂 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&#xff1a;…

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理 安装php8安装ImageMagick1、下载ImageMagick2、解压并安装3、查看是否安装成功 安装imagick扩展包 安装php8 点我安装php8 安装ImageMagick 1、下载ImageMagick wget https://www.imagemagick.org/download/ImageMa…

android的gradle

Gradle User Manual gradle官网 这里有个gradlew很有用&#xff0c;因为这个可以在窗口中运行gradlew脚本 gradlew 和 gradlew.bat 都是 Gradle Wrapper&#xff08;Gradle 包装器&#xff09; 的一部分&#xff0c;它们的作用是让项目可以使用 Gradle 而无需提前在系统中…

2025美赛MCM数学建模A题:《石头台阶的“记忆”:如何用数学揭开历史的足迹》(全网最全思路+模型)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ 《石头台阶的“记忆”&#xff1a;如何用数学揭开历史的足迹》 目录 《石头台阶的“记忆”&#xff1a;如何用数学揭开历史的足迹》 ✨摘要✨ ✨引言✨ 1. 引言的结构 2. 撰写步骤 &#xff08;1&#xff09;研究背景 &#…

【S32K3 RTD LLD篇7】K344中心对齐PWM中心点触发ADC BCTU采样

【S32K3 RTD LLD篇7】K344中心对齐PWM中心点触发ADC BCTU采样 一&#xff0c;文档简介二&#xff0c;中心对齐PWM中心点触发ADC原理2.1 如何生成中心对齐的PWM2.2 如何生成PWM中心点触发标志 三&#xff0c; 软件配置与实现3.1 Demo CT 模块配置3.1.1 引脚配置3.1.2 时钟配置3.…