单片机能运行操作系统吗?
先直接上答案:可以!
但是操作系统不是刚需,上操作系统比较占用单片机的资源,比如占用比较多的FLASH和RAM,间接增加了硬件成本,哪怕成本增加1毛钱,对于上量的产品,分分钟是一个工程师的工资。
我做了单片机开发10几年,大多数产品其实还是裸机编程,用到操作系统的比较少。
当然,这个跟产品功能有关,一般产品功能复杂、实时性要求苛刻的就会上操作系统。
目前用的比较多的就是实时操作系统,比如主流有uC/OS-II、FreeRTOS、rt-thread。
下面,简单给大家说下3个系统各自优缺点,如有不对,请指正!
一、uC/OS-II
uC/OS-II 是 Micrium 公司开发的商业实时操作系统,它的内核设计非常稳定和可靠,更加注重调度算法和系统服务的丰富性,适合于需要更高实时性和稳定性的应用。
uC/OS-II 的优缺点如下:
特点:
对开发友好:资料多。
实时性:uC/OS-II 可以提供非常快速的中断响应和任务切换,确保系统实时性。
可移植性:uC/OS-II 可以支持多种不同的处理器架构,使得应用程序更易于移植到不同的硬件平台上。
可靠性:由于 uC/OS-II 的内核设计非常稳定和可靠,因此它被广泛应用于各种不同的嵌入式系统中。
成熟的生态环境:由于 uC/OS-II 已经发布了很长时间,因此它的社区和生态环境非常成熟和完善,用户可以方便地获取文档、示例和支持。
缺点:
商业授权费用:uC/OS-II 是一个商业实时操作系统,用户需要购买商业授权才能使用。
资源占用:uC/OS-II占用单片机资源较多,需要较大的存储空间和内存空间。
另外,开发者是可以剪裁的,也就是说你可以根据你产品的功能修改系统代码做定制,前提是你已经吃透了系统的代码,否则不要轻易尝试,不然很容易给自己挖坑。
二、 FreeRTOS
FreeRTOS 是一个开源的实时操作系统,目前占有率高。
特点:
商业授权费用:可以免费商用
轻量级:FreeRTOS 的内核非常小巧,适合资源受限的单片机。
实时性:FreeRTOS 可以提供非常快速的中断响应和任务切换,确保系统实时性。
可移植性:FreeRTOS 可以支持多种不同的处理器架构,使得应用程序更易于移植到不同的硬件平台上。
社区支持:FreeRTOS 的社区非常活跃,有大量的开发人员参与开发和维护,使得 FreeRTOS 的生态环境非常完善。
良好的文档和资料:FreeRTOS 的文档和资料非常丰富,学习和使用 FreeRTOS 相对较为简单。
缺点:
组件少:部分功能组件不够完善,比如GUI(图形界面)、TCP/IP、文件系统需外扩第三方。
三、rt-thread
这个是国内一款适合物联网产品的实时操作系统,特点是资源占用极低(1.2KB RAM和3KB Flash),代码架构做低功耗功能比较方便。
优点:
轻量级:RT-Thread 的内核非常小巧,适合资源受限的单片机。
实时性:RT-Thread 可以提供非常快速的中断响应和任务切换,确保系统实时性。
可裁剪性:RT-Thread 可以按需选择需要的组件,以减小系统占用的资源。
面向对象:RT-Thread 支持对象化编程,使得代码更加清晰易懂。
跨平台支持:RT-Thread 可以支持多种不同的处理器架构。
缺点:
生态相对不够完善:相比一些成熟的嵌入式操作系统,RT-Thread 的社区和开发人员数量相对较少,生态环境相对不够完善。
学习曲线较陡峭:RT-Thread 是一个相对较新的操作系统,它的文档和资料相对较少,学习曲线相对较陡峭。
不适合大型系统:由于 RT-Thread 的内核设计初衷是轻量级和实时性,所以它不适合构建大型的嵌入式系统。
四、自己对RTOS的理解
最后聊一下,我对这些实时操作系统的理解。
我觉得实时操作系统,本质上就是一个实时性高的程序架构。
实时就是能保证我的任务规定的时间内去执行,这用传统while(1)轮询方式是实现不了的。
程序架构就好比建房子时的地基,只有地基稳了,才能应对外在恶劣环境对房子造成的影响,比如台风、地震。
我们写程序也是一样的,程序架构就是的”地基”,只有地基稳了,你的程序才能应对项目经理突如其来的改功能、换芯片方案,你的代码才经得起折腾、产品功能做得稳定。
可惜啊,很多工程师并没有写程序架构的能力,因为对经验和代码水平要求比较严格。
所以一般复杂的项目,直接上现成的、稳定的实时操作系统就可以了。
这样至少可以保证两点:
1.程序架构上不出问题。
2.程序的实时性不出问题。
不过用现成的也是有缺点的,就是RTOS的功能很多,有很多你产品压根用不上,但是你没办法,你又不会剪裁,这样就会浪费你很多单片机资源。
所以这几年我做项目,一直是用自己写的程序架构,然后程序实时性通过人工去规避。


比如任务初始化、创建、调度管理。
还有实时操作系统一些实用功能,比如队列,也是产品常用的,只是我自己写了更简化的代码。

这套架构的教程我暂时无偿提供给大家学习,很早之前录制的,后面可能会删掉。

这套程序架构最大的好处就是简易占用单片机资源少、移植性强,适用于各种单片机,包括有些51单片机。
不过本质是时间片轮询,不带任务优先级抢占,对实时性要求非常苛刻的项目就不合适了,有兴趣的可以自己修改代码实现。
教程获取方法可以看我下面这篇文章的开头。
《单片机入门到高级开挂学习路径(附教程+工具)》
《单片机入门到高级开挂学习路径(附教程+工具)》
《单片机入门到高级开挂学习路径(附教程+工具)》

相关文章:

单片机能运行操作系统吗?
先直接上答案:可以!但是操作系统不是刚需,上操作系统比较占用单片机的资源,比如占用比较多的FLASH和RAM,间接增加了硬件成本,哪怕成本增加1毛钱,对于上量的产品,分分钟是一个工程师的…...

Python之webmagic爬虫优点与使用
一、webmagic的优点它更偏向于java的语法,对于熟悉java的工程师来说学习成本较低。提供多种选择器,如css选择器、xpath、正则等。有一个模块pipeline:可通过简单地配置,可以将爬虫抽取到的信息,持久化到文件、数据库等…...
代码随想录动态规划 || 121 122
Day42121. 买卖股票的最佳时机力扣题目链接给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返…...

C++STL库中不可或缺的部分—string(模拟实现)
前文大家好,本篇文章主要是讲解一下string一些常用接口的模拟实现。众所周知,在日常生活中,字符串无处不在,如just do it,中国,一坤年等,想要在计算机上将这些字符展现出来就需要用到string类,而对我们C程序…...

MySQL复合查询
文章目录基本查询回顾多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询unionunion all基本查询回顾 查询的员工部门表结构: mysql> show tables; ----------------- | Tables_in_scott | ----------------- | dept …...

PCIe 资料收集2
文章目录感官认识PCIe的存储空间PCIe 在 linux 下的驱动PCIe 验证1.PCIe 传递裸数据2.PCIe 转其他设备PCIe转其他总线RS232USB从用户空间理解PCIe感官认识 总线协议接口 视频介绍PCIe 视频介绍及PCIe文字介绍 PCIe上可以接各种控制器硬盘控制器硬盘声卡控制器音响咪头/耳机显…...
Linux网络编程(使用VScode远程登录ubuntu)
文章目录 前言一、SSH插件的安装1.SSH简单介绍2.SSH插件安装和配置步骤二、安装C/C++插件总结前言 本篇文章将带大家进行网络编程的准备工作,使用vscode进行远程登录ubuntu。为什么要使用vscode进行远程登录ubantu呢?因为有些小伙伴的电脑可能性能不够开启虚拟机后会导致电脑…...

如何提高项目估算精准度?关键看5大影响因子
如何让项目估算工作更加精准,我们需要重点关注5大调整因子。 1、功能点调整因子 首先需要对功能点因子进行调整,区分不同类型的系统特征值。 因为不同的系统,对项目开发的影响程度不同,一般我们把系统特征值分为14种类型ÿ…...

论文阅读笔记《Nctr: Neighborhood Consensus Transformer for Feature Matching》
核心思想 本文提出一种融合邻域一致性的Transfomer结构来实现特征点的匹配(NCTR)。整个的实现流程和思想与SuperGlue相似,改进点在于考虑到了邻域一致性。邻域一致性在许多的传统图像匹配和图匹配任务中都有应用,他基于一个很重要…...

上位机系统Ubuntu 20.04与下位机arduino UNO通讯
目录一、安装arduino IDE1.1安装方法1.1.1终端里命令下载(不推荐)1.1.2官网下载(不推荐)1.1.3论坛下载(不推荐)1.1.4系统应用商店(推荐!)1.2配置项目文件位置1.3测试IDE功…...
hive面试题
1、什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能(HQL) 2、Hive的意义(最初研发的原因) 避免了去写MapReduce,提供快速开发的…...
【CUDA】《CUDA编程:基础与实践》CUDA加速的关键因素
CUDA事件计时 CUDA提供了一种基于CUDA事件(CUDA event)的计时方式,可用来给一段CUDA代码(可能包含主机代码和设备代码)计时。 对计时器的封装: class CUDATimeCost { public:void start() {elapsed_time_ 0.0;// 初始化cudaEventcheckCudaRuntime(cud…...
数据结构【Golang实现】(四)——双向循环链表
目录0. 定义节点1. IsEmpty()2. Length()3. AddFromHead()4. AddFromTail()5. Insert()6. DeleteHead()7. DeleteTail()8. Remove()9. RemoveByValue()10. Contain()11. Traverse()0. 定义节点 type DLNode struct {Data anyPrev, Next *DLNode }// DoublyLoopLinkedLis…...

【Redis】高可用架构之哨兵模式 - Sentinel
Redis 高可用架构之哨兵模式 - Sentinel1. 前言2. Redis Sentinel 哨兵集群搭建2.1 一主两从2.2 三个哨兵3. Redis Sentinel 原理剖析3.1 什么哨兵模式3.2 哨兵机制的主要任务3.2.1 监控(1)每1s发送一次 PING 命令(2)PING 命令的回…...

图片的美白与美化
博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的,…...

面试官:关于CPU你了解多少?
CPU是如何执行程序的? 程序执行的基本过程 第一步,CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据,数据准…...
UI自动化测试-Selenium的使用
文章目录 1. 环境搭建1.1 入门示例1.2 元素操作常用方法1.3 浏览器操作常用方法1.4 获取元素信息常用方法1.5 鼠标操作常用方法1.6 键盘操作常用方法1.7 下拉选择框操作2. 元素定位2.1 id定位2.2 name定位2.3 class_name定位2.4 tag_name定位2.5 link_text定位2.6 partail_link…...

嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置
文章目录前言USART的相关寄存器介绍状态寄存器:USARTX->SR具体位代表的含义实际代码数据寄存器 USARTX->DR波特率寄存器 USARTX->BRR控制寄存器 (USART_CR)控制寄存器1(USART_CR1)控制寄存器2(USART_CR2)GPIO…...

Android setContentView流程分析(一)
对于做Android App的小伙伴来说setContentView这个方法再熟悉不过了,那么有多少小伙伴知道它的调用到底做了多少事情呢?下面就让我们来看看它背后的故事吧? setContentView()方法将分为两节来讲: 第一节:如何获取De…...

doris数据库操作数字遇到的问题
关于doris数据库Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...