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)

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大话特征工程:1.维数灾难与特征轮回

一、维度深渊 公元 2147 年&#xff0c;人类文明进入了数据驱动的超级智能时代。从金融到医疗&#xff0c;从教育到娱乐&#xff0c;所有决策都仰赖“全维计算网络”&#xff08;高维特征空间&#xff09;。这套系统将全球所有信息抽象成数以亿计的多维特征&#xff08…

从ai产品推荐到利用cursor快速掌握一个开源项目再到langchain手搓一个Text2Sql agent

目录 0. 经验分享&#xff1a;产品推荐 1. 经验分享&#xff1a;提示词优化 2. 经验分享&#xff1a;使用cursor 阅读一篇文章 3. 经验分享&#xff1a;使用cursor 阅读一个完全陌生的开源项目 4. 经验分享&#xff1a;手搓一个text2sql agent &#xff08;使用langchain l…

《STL基础之hashtable》

【hashtable导读】STL为大家提供了丰富的容器&#xff0c;hashtable也是值得大家学习和掌握的基础容器&#xff0c;而且面试官经常会把它和hashmap混在一起&#xff0c;让同学们做下区分。因此关于hashtable的一些特性&#xff0c;比如&#xff1a;底层的数据结构、插入、查找元…

本地大模型编程实战(02)语义检索(2)

文章目录 准备按批次嵌入加载csv文件&#xff0c;分割文档并嵌入测试嵌入效果总结代码 上一篇文章&#xff1a; 本地大模型编程实战(02)语义检索(1) 详细介绍了如何使用 langchain 实现语义检索&#xff0c;为了演示方便&#xff0c;使用的是 langchain 提供的内存数据库。 在实…

猿人学第一题 js混淆源码乱码

首先检查刷新网络可知&#xff0c;m参数被加密&#xff0c;这是一个ajax请求 那么我们直接去定位该路径 定位成功 观察堆栈之后可以分析出来这应该是一个混淆&#xff0c;我们放到解码平台去还原一下 window["url"] "/api/match/1";request function…

Dev-C++分辨率低-解决办法

目录 【工具】Dev-C分辨率低-解决办法问题背景完整操作指南第一步&#xff1a;打开属性设置 【工具】Dev-C分辨率低-解决办法 问题背景 Dev-C因版本老旧&#xff08;长期未更新&#xff09;&#xff0c;在高分辨率显示器上存在界面模糊问题。通过修改Windows兼容性设置可优化…

Linux 小火车

1.添加epel软件源 2.安装sl 3. 安装完成后输入&#xff1a; sl

iic、spi以及uart

何为总线&#xff1f; 连接多个部件的信息传输线&#xff0c;是部件共享的传输介质 总线的作用&#xff1f; 实现数据传输&#xff0c;即模块之间的通信 总线如何分类&#xff1f; 根据总线连接的外设属于内部外设还是外部外设将总线可以分为片内总线和片外总线 可分为数…

Linux_线程控制

线程控制的相关接口 进程创建相关 之前我们已经认识到了pthread_create函数用来创建线程&#xff0c;这里不再赘述。 pthread_self函数 void* routine(void* args) {std::cout << "我是新线程..." << pthread_self() << std::endl;return null…

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

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

Ubuntu-手动安装 SBT

文章目录 前言Ubuntu-手动安装 SBT1. SBT是什么?1.1. SBT 的特点1.2. SBT 的基本功能1.3. SBT 的常用命令 2. 安装2.1. 下载2.2. 解压 sbt 二进制包2.3. 确认 sbt 可执行文件的位置2.4. 设置执行权限2.5. 创建符号链接2.6. 更新 PATH 环境变量2.7. 验证 sbt 安装 前言 如果您觉…

【ProtoBuf 安装】ProtoBuf在window/Linux下的安装 创建/删除swap分区

文章目录 1.ProtoBuf在window下的安装2.ProtoBuf在Linux下的安装创建swap分区命令解析关闭swap分区删除swap分区的影响 1.ProtoBuf在window下的安装 1、下载ProtoBuf编译器 下载地址&#xff1a;https://github.com/protocolbuffers/protobuf/releases 如果要在 C 下使用 Pro…

BAHD酰基转移酶对紫草素的手性催化-文献精读105

Two BAHD Acyltransferases Catalyze the Last Step in the Shikonin/Alkannin Biosynthetic Pathway 两个BAHD酰基转移酶催化了紫草素/左旋紫草素生物合成途径中的最后一步 一个BAHD酰基转移酶专门催化紫草素的酰基化&#xff0c;而另一个BAHD酰基转移酶则仅催化紫草素的对映…

C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】

1. 题目描述 力扣在线OJ题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 输入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 输出&#xff1a;[9,4] 2. 思路 直接暴力…

在Docker 容器中安装 Oracle 19c

在 Docker 容器中安装 Oracle 19c 是可行的&#xff0c;但它相较于其他数据库&#xff08;如 MySQL、PostgreSQL 等&#xff09;会复杂一些&#xff0c;因为 Oracle 数据库有一些特定的要求&#xff0c;如操作系统和库的依赖&#xff0c;以及许可证问题。 不过&#xff0c;Ora…

WGCLOUD使用介绍 - 如何监控ActiveMQ和RabbitMQ

根据WGCLOUD官网的信息&#xff0c;目前没有针对ActiveMQ和RabbitMQ这两个组件专门做适配 不过可以使用WGCLOUD已经具备的通用监测模块&#xff1a;进程监测、端口监测或者日志监测、接口监测 来对这两个组件进行监控

初学stm32 --- FreeRTOS移植

目录 移植前准备 1. 基础工程 2. FreeRTOS 源码 添加 FreeRTOS 文件 1. 添加 FreeRTOS 源码 2. 将文件添加到工程 3. 添加头文件路径 4. 添加 FreeRTOSConfig.h 文件 (1) FreeRTOSConfig.h 获取途径一 (2) FreeRTOSConfig.h 获取途径二 (3) FreeRTOSConfig.h 获取途径…

ThreadLocal概述、解决SimpleDateFormat出现的异常、内存泄漏、弱引用、remove方法

①. ThreadLocal简介 ①. ThreadLocal是什么 ①. ThreadLocal本地线程变量,线程自带的变量副本(实现了每一个线程副本都有一个专属的本地变量,主要解决的就是让每一个线程绑定自己的值,自己用自己的,不跟别人争抢。通过使用get()和set()方法,获取默认值或将其值更改为当前线程…

【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾

我的2024年创作之旅&#xff1a;从C语言到人工智能&#xff0c;个人成长与突破的全景回顾 引言 回望2024年&#xff0c;我不仅收获了技术上的成长&#xff0c;更收获了来自CSDN平台上无数粉丝、朋友以及网友们的支持与鼓励。在这条创作之路上&#xff0c;CSDN不仅是我展示技术成…

Windows11恢复传统右键菜单

Windows11恢复传统右键菜单 执行下面的命令(管理员下) reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /vetaskkill /f /im explorer.exestart explorer.exe或者 reg add "HKCU\Software\Classes\CLSID\{8…