FreeRTOS学习笔记(一)初认RTOS

news2024/12/23 13:42:59

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、RTOS的引入
  • 二、Free RTOS的基本内容
    • 2.1 FreeRTOS的特点
    • 2.2 Free RTOS编程风格
    • 2.3 Free RTOS的配置文件


前言

  笔者在去年曾经开始过rtos的学习(虽然后面一直没更新),最近趁着有时间更新一下这部分内容,本节主要是对以前的文章进行优化和整理,已经看过的朋友可以跳过了。


一、RTOS的引入

  实时操作系统(Real Time Operating System,简称RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。这里我们借用韦东山老师的例子进行说明:一个妈妈需要同时要给孩子喂饭和给同事回信息,下面是二者的代码。

// 裸机(无rtos)
void main(){
	while(1){
		喂饭();
		回消息();
	}
}

// 有rtos
void main(){
	creat_task(喂饭);
	creat_task(回消息);
	start_scheduler();
	while(1){
		sleep();
	}
}

  从这段代码中,可以明显看到对于不同的对象,前者妈妈在同一时间只能做一件事情(长时间一件事是而让另一个人等待),而后者妈妈将时间碎片化(可能是喂饭喂了一班转头去回一半消息),这样让两个人都感觉好像自己同时获得的“回应”。
  这里要注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 UCOS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。本次所学的FreeROTS 就是一个免费的 RTOS 类系统,他十分小巧可以在资源有限的MCU中运行当然它也可以被扩展到其他的控制器中。

二、Free RTOS的基本内容

  FreeRTOS 是一个轻量级的实时操作系统(RTOS),广泛应用于嵌入式系统中,尤其是在资源有限的微控制器和小型嵌入式设备上。它由Richard Barry开发,并以开放源代码的方式提供,支持多种架构和平台。FreeRTOS 通常由以下基本组件构成:

  • 任务(Task):独立的执行单元,每个任务有自己的堆栈和控制块。
  • 调度器(Scheduler):管理任务的执行顺序和时间,支持优先级调度。
  • 队列(Queue):用于任务间的数据传递,支持多生产者多消费者模型。
  • 信号量(Semaphore):实现任务间的同步和互斥,防止资源竞争。
  • 事件组(Event Group):允许任务等待多个事件的发生,提供位标志的方式进行同步。
  • 软件定时器(Software Timer):实现基于时间的回调函数,方便定时任务的执行。

2.1 FreeRTOS的特点

   FreeRTOS是一个可裁剪的小型RTOS系统,其特点包括:

  • 轻量级和高效性:代码体积小,运行效率高,通常只占用4k~9k的字节空间,非常适合微控制器等资源有限的设备。
  • 多平台支持:兼容多种处理器架构,如ARM Cortex-M系列、AVR、PIC等,具有良好的可移植性。
  • 丰富的功能模块:
    • 任务管理:支持多任务,允许创建优先级不同的任务。
    • 调度器:提供抢占式和协作式调度机制,确保关键任务的实时性。
    • 同步机制:提供信号量、互斥量、队列等,方便任务间通信与同步。
    • 内存管理:支持多种内存分配策略,满足不同应用需求。

2.2 Free RTOS编程风格

  1. 数据类型
新定义的数据类型对应C标准类型备注
portCHARchar
portSHORTshort16bit
portLONGlong32bit
portTickTypeunsigned (short) int用于定义系统时其计数器的值和阻塞时间的值,在头文件Free RTOSConfig.h头文件中的宏configUSE_16BIT_TICKS为1时,则为16bit,为0时,则为32bit
portBASE_TYPElong根据处理器的架构来决定多少位,如果是32/16/8bit的处理器则对应32/16/8bit的数据类型,一般用于定义函数的返回值或者布尔类型
  1. 变量前缀
      例如char型变量的前缀是c,short型的变量前缀是s, long型变量的前缀是l, portBASE_TYPE类型的前缀是x,还有其他的数据类型例如数据结构、任务句柄、队列句柄等定义的变量名前缀也是x。如果是一个无符号型的前面还会有一个u的前缀,如果是一个指针型变量型则会有一个前缀p。
  2. 函数前缀
      如果是一个私有的函数,则会加一个prv(private)的前缀。如果在函数前加上一个v的前缀,则表示该函数的返回值为void的类型;若函数前缀为x,则返回值为上文所提到的portBASE_TYPE类型。
前缀所在宏定义文件
portportable.h
tasktask.h
pdprojdefsh
configFreeRTOSConfig.h
errprojdefsh

2.3 Free RTOS的配置文件

  configASSERT(x):断言,类似 C 标准库中的 assert()函数,调试代码的时候可以检查传入的参数是否合理,FreeRTOS 内核中的关键点都会调用 configASSERT(x),当 x 为 0 的时候说明有错误发生。

  configUSE_PREEMPTION:使能抢占式调度器,为 1 时使用抢占式调度器,为 0 时使用协程。如果使用抢占式调度器的话内核会在每个时钟节拍中断中进行任务切换,在任务结束后CPU不会等待低优先级任务,直接由高优先级占取,而使用协程的话会在如下地方进行任务切换:

  • 一个任务调用了函数 taskYIELD( );
  • 一个任务调用了可以使任务进入阻塞态的 API 函数;
  • 应用程序明确定义了在中断中执行上下文切换。

  configUSE_TIME_SLICING:使能时间片调度器,默认情况下为高电平,此时FreeRTOS 使用抢占式调度器,这意味着调度器永远都在执行已经就绪了的最高优先级任务,优先级相同的任务在时钟节拍中断中进行切换,当该宏为 0 的时候不会在时钟节拍中断中执行相同优先级任务的任务切换。值得一提的是某些运行FreeRTOS的硬件有以下两种方法:通用方法和特殊方法(硬件)。

  configUSE_PORT_OPTIMISED_TASK_SELECTION: 是否启用特殊方法来执行下一个任务,为高电平时使能tickless低功耗模式;低电平时保持系统节拍中断一直进行 。与此同时,若该宏为1,则采用上述的通用方式,若该宏为0,则采用特殊方法。

  configUSE_TICKLESS_IDLE:是否启动低功耗模式。置1:使能低功耗模式;置0:关闭低功耗模式。

  configCPU_CLOCK_HZ (SystemCoreClock):配置CPU时钟频率。

  configTICK_RATE_HZ (1000):配置系统节拍中断的频率,即一秒钟中断的次数,每次中断RTOS都会进行任务调动。此频率也是滴答定时器的中断频率,需要使用此宏来配置滴答定时器的中断。

  configMAX_PRIORITIES (32):配置优先级数字越大优先级越高,数字越小优先级越低。

  configMINIMAL_STACK_SIZE((unsigned short)130):设置空闲任务的最小任务堆栈大小,以字为单位,不是字节。比如在STM32 上设置为100的话,那么真正的堆栈大小就是 100*4=400 字节

  configMAX_TASK_NAME_LEN:设置任务名最大长度。

  configUSE_16_BIT_TICKS: 设置系统节拍计数器变量数据类型,系统节拍计数器变量类型为 TickType_t,当该宏为1的时候 TickType_t 就是 16 位的,当 configUSE_16_BIT_TICKS为 0 的话 TickType_t 就是 32 位。

  configIDLE_SHOULD_YIELD :默认为高电平,此时空闲任务放弃CPU的使用权给其他同优先级的任务。

  configUSE_QUEUE_SETS:默认为低电平,启动队列。

  configUSE_TASK_NOTIFICATIONS:默认为高电平,开启任务通知功能。

  configUSE_MUTEXES :默认为高电平,使用互斥信号。

  configUSE_COUNTING_SEMAPHORES:设置为 1 的时候启用计数型信号量,相关的 API 函数会被编译。

  configQUEUE_REGISTRY_SIZE:设置可以注册的队列和信号量的最大数量,在使用内核调试器查看信号量和队列的时候需要设置此宏,而且要先将消息队列和信号量进行注册,只有注册了的队列和信号量才会再内核 调试器中看到,如果不使用内核调试器的话此宏设置为 0 即可。

  configSUPPORT_DYNAMIC_ALLOCATION:默认为高电平,此时在创建 FreeRTOS 的内核对象的时候所需要的 RAM 就会从 FreeRTOS 的堆中动态的获取内存,如果定义为 0 的话所需的 RAM 就需要用户自行提供,默认情况下宏configSUPPORT_DYNAMIC_ALLOCATION 为 1。

   configTOTAL_HEAP_SIZE ((size_t)(20*1024)) :设置系统所有堆大小,如果使用了动态内存管理的话,FreeRTOS 在创建任务、信号量、队列等的时候 就 会 使 用 heap_x.c(x 为 1~5) 中 的 内 存 申 请 函 数 来 申 请 内 存 。 这 些 内 存 就 是 从 堆 ucHeap[configTOTAL_HEAP_SIZE]中申请的,堆的大小由 configTOTAL_HEAP_SIZE 来定义。

  configUSE_IDLE_HOOK:默认为低电平,使用空闲任务钩子函数,用户需要实现空闲任务钩子函数,函数的原型为:void vApplicationIdleHook( void )。这个函数在每个空闲任务周期都会被调用,对已经删除的任务空闲任务可以释放给他们堆栈内存,因此需要保证空闲任务可以被CPU所执行,不可调用的任务会引起空闲任务阻塞的API函数。

  configUSE_TICK_HOOK:默认为低电平,也是一个函数void vApplicationTickHook( void )。时间片中断可以周期调用,但必须十分短小,不可使用大量的堆栈,并且不能以调用"FromISR"或者"FROM_ISR"结尾的API函数。

  configGENERATE_RUN_TIME_STATS: 默认为低电平,设置为 1 开启时间统计功能,相应的 API 函数会被编译,为 0 时关闭时间统计功能。如果宏 configGENERATE_RUN_TIME_STATS 为 1 的话还需要定义下表中的宏。
Alt
免责声明:本文参考了网上公开资料,仅用于学习交流,若有错误或侵权请联系笔者。

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

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

相关文章

模型中间部分的卷积可视化

整体代码如下: def forward(self, x):x self.conv1(x)x1 xout_img3 x1.squeeze()print(out_img3.shape)print("经过第一个卷积之后的输出:",x.shape) import yaml from omegaconf import OmegaConf from pathlib import Path from PIL imp…

景联文科技:提供高质量多模态数据标注,推动智能化转型

随着人工智能技术的快速发展,多模态数据标注成为推动智能系统更深层次理解和应用的关键技术之一。 作为行业领先的多模态数据标注服务商,景联文科技凭借其在技术、流程和人才方面的综合优势,推出了全面的多模态标注解决方案,助力…

C语言详细笔记--构造数据类型(共用体)

目录 一、共用体类型声明 二、共用体变量的定义 三、共用体变量的初始化 四、共用体变量的引用 一、共用体类型声明 共用体类型是一种多个不同类型数据共享存储空间的构造类型,即共用体变量的所以成员占用同一个存储空间,一般声明格式如下&#xff…

【LeetCode面试150】——205同构字符串

博客昵称:沈小农学编程 作者简介:一名在读硕士,**定期更新相关算法面试题**,欢迎关注小弟! PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大…

录屏没声音怎么办?3招解决,教您秒变声音大师

在录屏的过程中,突然发现录制的视频没有声音,这无疑会让人感到沮丧。声音作为视频的重要组成部分,一旦缺失,便会让整个作品失去生动性。然而,不必过于担心,因为录屏没声音的问题并非无法解决。 接下来&…

新手c语言讲解及题目分享(十七)--运算符与表达式专项练习

本文主要讲解c语言的基础部分,运算符与表达式的学习,在这一部分中,往往有许多细节的东西需要去记住。当各种运算符一起用时,就会存在优先级的关系,本文末尾有各种运算符的优先级顺序表。 参考书目和推荐学习书目&#…

开放式耳机哪个牌子好?长文传授6招秘籍,彻底远离坑货!

​大家好,作为一位专注于评测各类数码产品的博主,今天我特别推荐开放式耳机作为我们日常的首选。这种耳机以其独特的设计,避免了传统耳机长时间佩戴可能带来的不适和感染风险。开放式耳机佩戴简便且稳固,尤其适合热爱跑步和运动的…

解决TMP_InputField 在WebGL(抖音)上不能唤起虚拟键盘,不能使用手机内置输入法的问题

整整花费了一天时间测试和解决。试验了多个方法,花了不少美刀,最终才发现抖音这个官方文档,哭了: https://partner.open-douyin.com/docs/resource/zh-CN/mini-game/develop/guide/game-engine/rd-to-SCgame/open-capacity/capabi…

[Python] 从0到1实现一个简单的数字图像识别大模型

目录 前言介绍 神经网络 简单的神经网络 使用均方误差与正规方程实现神经网络 随机梯度下降与批量梯度下降实现神经网络 用更复杂的梯度下降实现一个神经网络 利用Sigmoid激活函数实现神经网络 使用 PyTorch 框架快速构建一个神经网络、 案例实战 前言介绍 大模型的本…

python-网页自动化(二)

获取元素属性 1. 获取属性 以百度首页的logo为例&#xff0c;获取logo相关属性 <img hidefocus"true" id"s_lg_img" class"index-logo-src" src"//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" width"270…

微服务-nacos

nacos-注册中心 启动 服务注册到nacos

【MIT 6.5840/6.824】In Search of an Understandable Consensus Algorithm 学习笔记

In Search of an Understandable Consensus Algorithm 1 Introduction2 Replicated state machines3 What’s wrong with Paxos?4 Designing for understandability5 The Raft consensus algorithm5.1 Raft basics5.2 Leader election5.3 Log replication5.4 Safety5.4.1 Elec…

知识付费最新版知识付费做的最好的平台,网创资源知识付费 知识付费网站搭建,搭建知识付费APP平台教学:在线教育系统源码。

目录 前言&#xff1a; 一、知识付费平台特点 二、知识付费平台功能 三、 知识付费小程序 前言&#xff1a; 知识付费小程序是一种在线学习平台&#xff0c;用户可以通过该小程序以一定的费用获取专业知识和技能。这些知识和技能可以来自行业专家、教育机构或个人创作者。知…

Docker 容器技术:简化 MySQL 主从复制部署与优化

文章目录 前言一、为什么基于Docker搭建&#xff1f;二、利用Docker搭建主从服务器2.1 配置Master&#xff08;主&#xff09;2.2 配置Slave&#xff08;从&#xff09;2.3 链接Master&#xff08;主&#xff09;和Slave&#xff08;从&#xff09;2.4 测试主从复制 三、常见问…

面试官:你有写过自定义指令吗?自定义指令的应用场景有哪些?

一、什么是指令 开始之前我们先学习一下指令系统这个词 指令系统是计算机硬件的语言系统&#xff0c;也叫机器语言&#xff0c;它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力 在vue中提供了一套为数据驱动视图更为方便的…

VMWARE VCENTER6.7 VCSA通过Web5480进行版本升级

VCENTER当前版本如下图 操作前先给VCENTER打一个快照&#xff0c;出问题可以立即回退 1、先下载VCSA镜像&#xff0c;并将VCSA镜像上传至DataStore中&#xff1b; 2、选中VCSA虚拟机&#xff0c;编辑配置 3、挂载新上传的VCSA镜像&#xff0c;一定要勾选“已连接”和“打开电源…

自定义string类

#include <iostream> #include <string> int main() { std::string str "Hello, World!"; // 使用 c_str() 将 std::string 转换为 C 风格字符串&#xff0c;并传递给 printf printf("The string is: %s\n", str.c_str()); // 尝试修改…

网络层 V(IPv6)【★★★★★★】

一、IPv6 的特点 IP 是互联网的核心协议。现在使用的 IP&#xff08;即 IPv4 ) 是在 20 世纪 70 年代末期设计的。互联网经过几十年的飞速发展&#xff0c;到 2011 年 2 月&#xff0c;IPv4 的地址已经耗尽&#xff0c; ISP 已经不能再申请到新的 IP 地址块了。我国在 2014 年…

全能与专精:探索未来AI模型的发展趋势与市场潜力

文章目录 每日一句正能量前言AI模型的全面评估和比较AI模型的专精化和可扩展性AI模型的合理使用和道德规范后记 每日一句正能量 一个人&#xff0c;如果没有经受过投资失败的痛楚&#xff0c;又怎么会看到绝望之后的海阔天空。很多时候&#xff0c;经历了人生中最艰难的事&…

告别繁琐切换,可道云teamOS让企业微信和钉钉无缝对接,爽到飞起

在当今快节奏的工作环境中&#xff0c;企业对于高效办公工具的需求日益增强。特别是企业微信和钉钉的普及&#xff0c;已成为许多企业日常沟通协作的基石。然而&#xff0c;传统企业网盘与这些平台的割裂&#xff0c;常常让工作流程变得繁琐。 幸运的是&#xff0c;teamOS的出…