RM电控RTOS
OS即(operating system)操作系统,比如我们常用的windows系统,mac系统,android系统,ios系统,linux系统等,都属于操作系统。操作系统的本质是一个特殊的软件,它直接管理硬件,同时为各个应用程序划分资源(内存,堆栈,时间片等),并提供控制(调度,同步)。不管是计算机还是单片机,在任意时刻都只能运行一段代码,顶多是运行速度上会有差距,为什么我们能够在电脑上打开多个软件同时流畅的使用,就需要归功于操作系统对于软件的控制,操作系统会将各个应用程序抽象成进程,给每个进程独立的分配资源,同时对他们进行调度,使得每一个进程都仿佛是在独占整个计算机。
以下图为例,该图较为清晰的反映了硬件,操作系统和应用程序之间的层次关系。可以发现操作系统operating system位于硬件computer hardware之上,应用程序application programs又位于操作系统operating system之上,各个应用程序如compiler(编译器),assembler(组译器),text editor(文本编辑器),database system(数据库系统)等都被抽象成了用户(user)。

由于单片机的资源比较少,一般在单片机上运行的操作系统具有功能精简,实时性强的特点,也被称为RTOS(real time operating system)实时操作系统。单片机上的RTOS非常多,国外常见的RTOS包括FreeRTOS,uCOSⅡ等,国内这几年做的RT-Thread操作系统也发展的很好,阿里和腾讯蹭物联网热点弄了些AliOS啥的乱七八糟的东西,但是好像没啥动静,个人感觉国内真正有竞争力的还是RT-Thread。
没有运行OS的计算机统称为裸机,一般我们利用中断和循环构建前后台系统完成的工程都是裸机工程,中断是前台,针对各种突发的中断源进行及时响应,循环是后台,稳定执行一些常驻的重复性工作。在裸机工程中,编写者对于代码的执行情况是一清二楚的,只要编写者清楚中断到来的时刻,就能知道每一时刻中单片机在执行哪段代码,另外裸机工程由用户手动分配堆栈,所以总体上裸机工程是完全可控的,这也使得裸机的调试难度比较低,但是当工程复杂,耗时、耗资源的任务多时,裸机工程必须在中断中编写复杂的逻辑或者执行耗时的任务,这就会导致裸机工程的执行效率非常低下,响应丧失实时性。
而OS则不一样,由于任务调度和堆栈分配都是由OS来完成的,编写者并不知道任意时刻OS内部的执行情况,因此如果OS的执行出了问题,调试难度是比较大的,很多时候需要借助特殊的调试工具帮助查找问题,比如FreeRTOS就有专用的调试工具FreeRTOSViewer。
另一方面是时间利用率高,之前说过,裸机工程最大的问题就是在工程复杂时,不得不往中断中增加一些执行起来很耗时的代码,继而导致实时性大大下降,比如工程中有一个定时器中断和一个串口中断,两个中断到来的间隔时间位1ms,定时器中断的优先级高于串口中断,只要定时器中断中的代码需要大于1ms的时间来执行,就会导致串口中断无法得到响应。可以想象当中断数量更多,各个中断之间的间隔时间更短,而需要执行的任务耗时更长的情况下,裸机工程跑起来会是个什么惨状。而使用OS时,耗时的代码全部放到任务中,交给OS来调度;中断中只需要执行耗时短的重要代码,这样中断就能够得到及时的响应,即使有多个复杂,耗时的任务也能够实时的进行处理,下图就是一个典型的RTOS执行的时序,可以看到中断消耗的时间很短,耗时的代码都被放到任务中去了。

此外OS还可以提供一些裸机不具备的功能,比如信号量,消息队列,任务通知等,用来管理复杂情况下的资源分配或者进程同步。以信号量为例,信号量的功能是实现各个任务对临界资源的互斥访问,比如一辆步兵车采用双板方案,云台和底盘各有一块开发板,两板采用串口进行通讯。下板需要将底盘yaw轴电机角度信息和功率信息发送给上板,yaw轴电机角度的发送和功率信息的发送各自在一个定时器中断和一个串口中断中进行,这时上下板通讯所使用的串口就是一个临界资源,必须采用信号量进行保护,即当一个任务正在访问通讯串口时,会占有信号量,另一个任务到来之后必须处于阻塞状态,等待上一个任务访问完毕,释放信号量后才能访问通讯串口。
如果不进行保护的话,有可能会出现这种情况:串口中断中发送的功率信息只发送到一半 ,定时中断就绪了,串口中断被打断,剩下的一半发送的信息变成了yaw轴电机角度信息,两个信息一拼之后就变成了没有意义的乱码,发送给上板之后会引发各种奇奇怪怪的问题。
最后,现在的RTOS基本都是有自己的生态圈的,各种开发商会基于RTOS提供各种便利的组件,包括网络,蓝牙,GUI图形界面,文件管理系统等。选择使用OS开发的话就能够直接在工程中调用这些组件的接口,并且有丰富的文档支持,而如果是裸机的话就得自己造很多轮子,过于浪费时间精力。

所以在RM比赛中,到底有没有必要跑OS?我觉得其实是没有必要的,按照上文所说,除非出现工程过于复杂,耗时耗资源的任务过多的情况下,裸机才会有比较严重的问题,其他情况下裸机的可控性和调试方便程度都优于OS,而RM比赛中,一般一段中断里面的代码不过几百行,执行起来的耗时根本到不了毫秒级,用OS也并不能体现出任何优势,另外上面举例的信号量处理临界资源竞争的问题,其实两个中断撞到一起的概率非常非常的小,就算有也可以通过合理的设置中断优先级,或者代码逻辑来避免问题。
但是没有必要不等于不能够或者不应该上OS,如果编写者对OS的机制比较熟悉的话,使用OS就能够有非常好的编码体验,整个工程的抽象度得到了提升,代码的逻辑分层更加的清晰,不同兵种之间进行代码迁移也会比较容易。目前使用OS的参赛队还是很多的,我观摩过几个学校的代码,还是很有水平的。
任务调度机制
这里以FreeRTOS为例,介绍一下OS的任务调度机制。
我们先简单介绍一下进程的概念,对于进程,我们很难找到一个准确的定义,一般我们会将程序的一次执行当成一个进程,更准确的说,我们将一个程序在一个数据集合上的运行过程当成一个进程,这说明进程包含着动态的概念,一段程序执行时,我们一般划分成三个阶段,开始执行--->执行中--->执行完成。这也恰好对应了进程的工作状态:就绪态--->运行态--->挂起态。
进程除了以上三种状态,还有一个重要的状态被称位阻塞态(Blocke),对应的是一个程序执行到一般时被暂停的状态。
在FreeRTOS中,进程的四种基本工作状态是就绪态(Ready),运行态(Running),阻塞态(Blocked)和挂起态(Suspended),各个状态的相互转换关系如下图:

我们编写一段代码,来展示OS下的任务代码编写和裸机代码编写之间的区别:
void green_led_task(void const * argu)
{while(1){HAL_GPIO_TogglePin(GREEN_LED_PORT,GREEN_LED_PIN);osDelay(100);}
}
这段程序的功能是控制一个绿色LED闪烁,如果我们在普通的裸机工程中将其作为一个函数调用,程序就会一直卡在这段闪烁的循环里,不会执行后续的代码,假如我们再写一个红色LED闪烁的代码,在裸机工程中调用,红色LED是不会闪烁的(这里我使用的是OS中的延时函数osDelay,裸机工程中对应的是HAL_Delay函数)。
void red_led_task(void const * argu)
{while(1){HAL_GPIO_TogglePin(RED_LED_PORT,RED_LED_PIN);osDelay(100);}
}
但是我们通过如下的代码将上面两个函数注册为两个进程之后:
osThreadDef(GreenLEDTask, green_led_task, osPriorityNormal, 0, 128);
green_led_task_t = osThreadCreate(osThread(GreenLEDTask), NULL);osThreadDef(RedLEDTask, red_led_task, osPriorityNormal, 0, 128);
red_led_task_t = osThreadCreate(osThread(RedLEDTask), NULL);
OS就会自动将上面两个代码进行调度,最后我们看到的结果是红绿LED一起以1s为周期闪烁。
OS的调度过程是这样的——当绿色LED闪烁进程green_led_task执行到osDelay处时,OS会将该进程由运行态变成阻塞态,直到500ms之后才会将其恢复为就绪态。当绿色LED闪烁进程处于运行态时,如果红色LED闪烁进程red_led_task在此时就绪了,就需要优先等待绿色LED闪烁进程从运行态变成阻塞态,才可以从就绪态变成运行态。
所以调度的实质就是OS按照某种调度算法的原则,安排各个进程的运行状态,使得它们以近乎“并行”的方式得到执行。关于调度的具体算法,这里不加以详细的介绍,主要是三个:先来先服务(FCFS)调度算法,优先级调度算法和时间片轮转调度算法。三种算法同时执行,合作完成任务调度功能。
相关文章:
RM电控RTOS
OS即(operating system)操作系统,比如我们常用的windows系统,mac系统,android系统,ios系统,linux系统等,都属于操作系统。操作系统的本质是一个特殊的软件,它直接管理硬件…...
Arduino开源四足蜘蛛机器人制作教程
视频教程:手把手叫你做四足蜘蛛机器人——1零件介绍_哔哩哔哩_bilibili 一、项目介绍 1.1 项目介绍 Arduino主控,图形化编程,趣味学习 Arduino nano开发板舵机扩展底板 4.8V可充电电池,支持Arduino C语言编程和米思齐图形化编程…...
【Axure高保真原型】中继器表格——标签使用情况案例
今天和大家分享中继器表格——标签使用情况案例的原型模板,效果包括: 模糊搜索——输入标签编号或者标签名称,可以快速查找对应的数据 排序——点击排序按钮,可以按升序或降序排列 分页——点击上拉列表,可以选择表格…...
ABAP字符串反转 and 寻找字符所在位置 and 根据数量汇总时把数量转为非数值类型
1.字符串反转 and 寻找字符所在位置 LOOP AT gt_wlmc ASSIGNING FIELD-SYMBOL(<fs_wlmc>). "遍历内表<fs_wlmc>-matnr <fs_wlmc>-matnr(8).DATA: l_output TYPE char50,v_off2 TYPE i,str TYPE i,str2 TYPE i.CALL FUNCTION STRING_REVERS…...
【机器学习第十二章——计算学习理论】
机器学习第十二章——计算学习理论 12.计算学习理论12.1 基础知识12.1 可能学习近似正确假设(PAC)12.3 有限假设空间12.4 VC维 12.计算学习理论 12.1 基础知识 从理论上刻画了若干类型的机器学习问题中的困难和若干类型的机器学习算法的能力 这个理论要…...
Docker私人学习笔记
俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步! 此笔记主要是antlr4.13版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的地方欢迎大家指正。 一、基础概念:…...
谷粒商城实战笔记-233~235-商城业务-认证服务-单点登录流程-原理
文章目录 一,场景二,单点登录流程 一,场景 包含以下三节的内容: 一,233-商城业务-认证服务-单点登录流程-1二,233-商城业务-认证服务-单点登录流程-2三,233-商城业务-认证服务-单点登录流程-3…...
机器学习在旅游业的革新之旅
机器学习在旅游业的革新之旅 随着科技的飞速发展,尤其是人工智能(AI)技术的广泛应用,各个行业都迎来了前所未有的变革。其中,旅游业作为全球经济的重要支柱之一,更是受益匪浅。机器学习(Machin…...
OpenCTI:开源网络威胁情报平台
OpenCTI 是一个开源平台,旨在帮助组织管理其网络威胁情报 (CTI) 数据和可观察数据。 该平台由 Filigran 开发,使用基于 STIX2 标准的知识模式构建数据。 它采用现代 Web 应用程序架构,配备 GraphQL API 和用户友好的前端。 OpenCTI 与 MIS…...
linux shell 脚本 let 数学计算
linux shell 脚本 let 数学计算 http://www.codebaoku.com/it-shell/ let命令中的算术表达式必须用双引号括起来,以避免解释器对特殊字符进行处理。 在变量的计算中,不需要使用$符号来表示变量, #!/bin/shweek_daydate %u echo $week_day…...
mp3和mp4的区别是什么?怎么把mp3转成mp4?(全)
在生活中我们或多或少会听到“mp3”和“mp4”,那么什么是mp3和mp4呢?mp3和mp4的区别是什么?mp3是一种音频压缩技术,旨在在不显著牺牲音质的前提下减小音频文件的体积,使其适用于音乐和其他音频内容的存储与传输。相比之…...
合并params和query参数
场景:三级分类只有query参数,搜索框使用params参数。为了解决这个问题,文中在typeNav的index.vue和Head/index.vue分别进行了判断和处理,确保在不同的路径下合并params和query参数能正确合并并传递。 如何当点击联动框时跳转到se…...
[数据集][目标检测]工程机械车辆检测数据集VOC+YOLO格式3189张10类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3189 标注数量(xml文件个数):3189 标注数量(txt文件个数):3189 标注…...
构建域名服务器-BIND:Linux端的安装过程及配置文件详解
文章目录 构建域名服务器工具-BINDBIND的安装BIND配置文件详解1. /etc/named.conf:2. /etc/named.rfc1912.zones:3. /var/named/named.localhost:4./etc/logrotate.d/named5./etc/named.iscdlv.key6./etc/named.root.key7./etc/rndc.conf8./e…...
linux查询目录文件基础操作
基础命令 展示所有目录 ls 长格式列出(显示文件权限、所有者、大小和最后修改时间): ls -l 忽略大小写查询 ls | grep -i name 查找特定名称的文件: find /path/to/search -name "filename" 忽略大小写查找文件&#…...
搭建TestBench,收藏这几条基本框架就够了
Verilog功能模块HDL设计完成后,并不代表设计工作的结束,还需要对设计进行进一步的仿真验证。掌握验证的方法,即如何调试自己的程序非常重要。在RTL逻辑设计中,要学会根据硬件逻辑来写测试程序即写Testbench。Verilog测试平台是一个…...
怎么利用住宅代理提高数据抓取效率
在大数据时代,数据抓取已经是从互联网收集数据的关键手段,得到了广泛的应用。不论是网络营销、电商平台、或者是新闻网站,数据抓取都可以帮助企业或者是个人收集到大量的数据。但是随着反爬虫技术的不断发展,传统的爬虫方法已经不…...
c#中的ManuaResetEvent
在C#中,ManualResetEvent 是一个同步事件,用于线程间通信。它允许一个或多个等待的线程等待某个事件的发生。当事件被设置为已发生(或称为“信号”)状态时,所有等待的线程都会被释放,并且可以继续执行。 以…...
EE trade:黄金投资的利弊与要点
黄金投资作为一种相对传统的投资途径,存在着特定的优势与风险。接下来详细剖析一下黄金投资的优缺点。 1、黄金投资的优点 有效对抗通货膨胀 在通货膨胀时期,黄金往往能有出色的表现,其价值通常会上升,如此一来便能够为投资者提…...
数据仓库模型评估的标准
面试中,肯定有数仓同学被问到:数据模型如何去评估、如何优化,那今天就聊一聊这个话题。 基本概念 模型:表达的是某一个主题、某一个业务过程,赋值业务价值,最终落地还是一个建表的过程 数仓模型…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...
