单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

news2024/11/15 13:32:14

单片机编程中的裸机系统和多任务系统

学习了那么久的stm32还停留在裸机???

  • 单片机编程中的裸机系统和多任务系统
  • .1 裸机系统
    • 1.1轮询系统
    • 1.2 前后台系统
  • 2 多任务操作系统
  • 3 为什么要学习多任务操作系统??
  • 4 怎么学习FreeRTOS系统?
  • 5 初步认识一下RTOS

.1 裸机系统

裸机系统通常分成轮询系统和前后台系统,有关这两者的具体实现方式请看下面的讲解。

1.1轮询系统

轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情,大概的伪代码看下方代码块轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。在代码清单 中,如果只是实现 LED 翻转,串口输出,液晶显示等
这些操作,那么使用轮询系统将会非常完美。但是,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。假设DoSomething3 是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响应,并做紧急处理,而这个时候程序刚好执行到 DoSomething1,要命的是 DoSomethingg1需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到 DoSomething3的时候就会丢失掉一次事件。足见,轮询系统只适合顺序执行的功能代码,当有外部事件
驱动时,实时性就会降低。
代码清单轮询系统伪代码

1 int main(void)
2 {
3 /* 硬件相关初始化 */
4 HardWareInit();
5 
6 /* 无限循环 */
7 for (;;) {
8 /* 处理事情 1 */
9 DoSomething1();
10 
11 /* 处理事情 2 */
12 DoSomething2();
13 
14 /* 处理事情 3 */
15 DoSomething3();
16 }
17 }

1.2 前后台系统

相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断在这里我们称为前台,main 函数里面的无限循环我们称为后台,大概的伪代码见代码清单
代码清单 前后台系统伪代码

1 int flag1 = 0;
2 int flag2 = 0;
3 int flag3 = 0;
4 
5 int main(void)
6 {
7 /* 硬件相关初始化 */
8 HardWareInit();
9 
10 /* 无限循环 */
11 for (;;) {
12 if (flag1) {
13 /* 处理事情 1 */
14 DoSomething1();
15 }
16 
17 if (flag2) {
18 /* 处理事情 2 */
19 DoSomething2();
20 }
21 
22 if (flag3) {
23 /* 处理事情 3 */
24 DoSomething3();
25 }
26 }
27 }
28 
29 void ISR1(void)
30 {
31 /* 置位标志位 */
32 flag1 = 1;
33 /* 如果事件处理时间很短,则在中断里面处理
34 如果事件处理时间比较长,在回到前台处理 */
35 DoSomething1();
36 }
37 
38 void ISR2(void)
39 {
40 /* 置位标志位 */
41 flag2 = 1;
42 
43 /* 如果事件处理时间很短,则在中断里面处理
44 如果事件处理时间比较长,在回到前台处理 */
45 DoSomething2();
46 }
47 
48 void ISR3(void)
49 {
50 /* 置位标志位 */
51 flag3 = 1;

53 /* 如果事件处理时间很短,则在中断里面处理
54 如果事件处理时间比较长,在回到前台处理 */
55 DoSomething3();
56 }

在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序里面标记事件,如果事件要处理的事情很简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回到后台程序里面处理。虽然事件的响应和处理是分开了,但是事件的处理还是在后台里面顺序执行的,但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力。在大多数的中小型项目中,前后台系统运用的好,堪称有操作系统的效果。只是有操作系统的效果哦。

2 多任务操作系统

、当我们进入嵌入式这个领域的时候,往往首先接触的都是单片机编程,单片机编程又首选 51 单片机来入门。这里面说的单片机编程通常都是指裸机编程,即不加入任何 RTOS(Real Time Operating System 实时操作系统)的程序。常用的 RTOS 有国外的FreeRTOS、μC/OS、RTX 和国内的 FreeRTOS、Huawei LiteOS 和 AliOS-Things 等,其中尤以国外开源且免费的 FreeRTOS 的市场占有率最高

3 为什么要学习多任务操作系统??

在裸机系统中,所有的程序基本都是自己写的,所有的操作都是在一个无限的大循环里面实现。现实生活中的很多中小型的电子产品用的都是裸机系统,而且也能够满足需求。
但是为什么还要学习 RTOS 编程,偏偏还要整个操作系统进来?
一是项目需要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,我们可以考虑引入 RTOS 实现多任务管理,这是使用
RTOS 的最大优势。
二是学习的需要,必须学习更高级的东西,实现更好的职业规划,为将来走向人生巅峰迎娶白富美做准备,而不是一味的在裸机编程上面死磕。作为一个合格的嵌入式软件工程师,学习是永远不能停歇的事,时刻都得为将来准备。书到用时方恨少,
我希望机会来临时你不要有这种感觉

4 怎么学习FreeRTOS系统?

从网上搜集了大家常用的几种方法:
1.最简单的方法就是在别人移植好的系统)上,看看RTOS里面的API使用说明,然后
调用这些API实现自已想要的功能即可。
2.另一种就足深入的学习款RTOS,阅读RTQS的源码深究内核和每个组件的实现
方式,这个过程枯燥且痛苦。
3.从0到1实现内核,层层叠加,再看内核资源的实现
方式。
这里我谨代表个人学习过程分享一下血的教训:
刚开始我是跟着野火的教程开始学习FreeRTOS,至于为啥学习FreeRTOS,开源免费!野火的FreeRTOS倡导的是从0-1先从内核底层学起,我尝试了一段时间,发现到中期,根本看不懂,列表和任务的定义之类的函数,又看了原子的教程,但原子的教程大家都懂,不过我看过他家的 HAL库 和这个RTOS抛开他们的代码不说,其他的还是可以的,方式可以,更易懂。先跟着学习移植源码,慢慢刨析函数的底层。

5 初步认识一下RTOS

FreeRTOS由RichardBarry在03年发布,18年被亚马逊收购,改名AWS FreeRTOS。
FreeRTOS是一款免费的实时操作系统。
FreeRTOS 和 OpenRTOS 拥有的代码是一样的,但是可从官方获取到的服务却是不一
样的。FreeRTOS 号称免费,OpenRTOS号称收费,它们的具体区别见表格

在这里插入图片描述

SaveRTOS也是基于FreeRTOS,但是SaveRTOS为某些特定的领域做了安全相关的设
计,有关SaveRTOS获得的安全验证具体见表格
在这里插入图片描述
OPenRTOS:有官方服务,花钱买服务。
SaveRTOS:有安全服务,医疗汽车电子行业有保障。

操作系统允许多个任务同时运行,这个叫做多任务系统。实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行的哪个任务。任务调度在各个任务之间的切换非常快,就给人们造成了同一时刻有多个任务同时运行的错觉。

某些操作系统给每个任务分配同样的运行时间,时间到了就轮到下一个任务,比如Unix操作系统,FreeRTOS操作系统则是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。

FreeRTOS是RTOS系统中的一种,FreeRTOS十分的小巧,可以在资源有限的微控器中使用,当然FreeRTOS不仅仅局限于在微控器中使用,但从文件数中来说FreeRTOS要比uc/OS小的多。

接下来,我会从这个合集中,一点一点分享RTOS的学习经验和方法,以及写的笔记,供大家参考,我也是一点一点从小白成长的,大家加油!

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

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

相关文章

诊断CAPL自动化(6) —— 诊断自动化测试,实战演示

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 下图是UDS协议测试的部分测试用例,该表格在文章末尾网盘自己获取经过前面几…

Cesium实践(4)——空间数据加载

文章目录 前言几何形体点线面体 标签文字图标 几何文件GeoJsonKMLCZML 三维模型总结 前言 本文介绍Cesium如何加载空间数据,空间数据即明确定义在三维空间中的数据,空间数据包括以下几类:1、几何形体(点、线、面、体)…

“支付+SaaS”赋能传统产业数字化转型

易观:传统支付业务利润空间在政策监管和市场竞争下不断被压缩,多家上市支付机构逐步将业务经营重点转移切入到企业交易环节,为企业提供包括SaaS服务、行业解决方案、营销服务及金融科技服务等在内的企业服务收入成为新的增长点。 伴随着“十四…

OSCP-AuthBy(Server 2008提权)

目录 扫描 FTP WEB 提权 扫描 nmap -sV -sC -p- 192.168.73.46 FTP 检查端口21上的匿名登录 导航到accounts目录,可以观察ftp服务上的帐户 Offsec, anonymous, admin

Java8函数式编程(Lambda表达式,Stream流,Optional)

一.函数式编程思想 面向对象思想主要是关注对象能完成什么事情,函数式编程思想就像函数式,主要是针对数据操作;代码简洁容易理解,方便于并发编程,不需要过分关注线程安全问题 二.lambda表达式 1.概念 lambda表达式…

提升金融写作效率:金融校对软件的优势与应用

金融行业的写作任务繁重且要求高度专业,涉及财务报告、研究报告、合同、政策文件等各类文档。金融校对软件应运而生,为金融专业人士提供有效的支持,帮助他们提高写作效率和质量。本文将探讨金融校对软件的优势与应用。 一、金融校对软件的优势…

【NFS共享存储服务】

目录 一、NFS (Network File System)网络文件系统1.1、NFS工作原理1.2、举例1.2.1、共享文件总结 一、NFS (Network File System)网络文件系统 依赖于RPC (远端过程调用) 需安装nfs-utils、rpcbind软件包 系统服务: nfs、rpcbind 共享配置文件: /etc/ex…

跳表的实现

目录 简介跳表的实现 简介 skiplist本质也是一种查找结构,和搜索树、哈希表一样可以作为key或者key/value模型的查找结构,从命名可以看出它也是一个链表结构,链表的查找效率是O(n),作为在链表基础上优化的一种查找结构,跳表的查找…

app拉新充场代理

我认为您可能是想了解APP充值拉新软件的功能吧。通常,APP充值拉新软件会具有以下功能: 充值服务:提供多种支付方式,让用户方便快捷地进行充值操作。 活动推广:通过不同的方式,如折扣、优惠码等&…

Tomcat的部署和优化

Tomcat的组件构成 (1)Web 容器:完成 Web 服务器的功能。 (2)Servlet 容器:名字为 catalina,用于处理 Servlet 代码。 (3)JSP 容器:用于将 JSP 动态网页翻译成…

centos系统安装mysql8.0

centos系统安装mysql8.0 环境说明开始1、查看centos7中是否有MariaDB,MariaDB与MySQL关系请自行查阅2、如果有MariaDB,需要将 步骤1 中查询到的mairadb全部卸载,否则MySQL安装会出现问题3、查看本机是否已经安装过MySQL4、如果安装过MySQL&am…

9.java程序员必知必会类库之加密库

前言 密码学在计算机领域源远流长,应用广泛。当前每时每刻,每一个连接到互联网的终端,手机,电脑,iPad都会和互联网有无数次的数据交互,如果这些数据都是明文传输那将是难以想象的。为了保护用户隐私&#…

算法--前缀和技巧 (蓝桥杯123-灵能传输)

文章目录 什么是前缀和用途什么时候用例题[蓝桥杯 2021 国 ABC] 123题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路代码 灵能传输(蓝桥杯96%,洛谷ac)[蓝桥杯 2019 省 B] 灵能传输题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1…

知识图谱实战开篇-讲述知识图谱是什么,要学哪些知识,一文讲通

大家好,我是微学AI,今天给大家带来知识图谱重要讲述,讲明白什么是知识图谱,知识图谱可以做什么,需要学哪些知识,与自然语言处理的关系。很多人认为知识图谱是关系图谱,可能涉及人工智能的东西不…

【LeetCode】650. 只有两个键的键盘

650. 只有两个键的键盘(中等) 思路 不同于以往通过加减实现的动态规划,这里需要乘除法计算位置。因为粘贴操作是倍数增加,使一个一维数组 dp,其中位置 i 表示延展到长度 i 的最少操作次数。对于每个位置 j &#xff0c…

C++学习 Day6

目录 1. 类对象模型 1.1 如何计算类对象的大小 1.2 类对象的存储方式 1.3 结构体内存对齐规则 2. this指针 2.1 this指针的引出 2.2 this指针的特性 3. 类的6个默认成员函数 4.构造函数 4.1 概念 4.2 特性 1. 类对象模型 1.1 如何计算类对象的大小 class A { publi…

【Java】『蓝桥杯』10道编程题及答案(一)

系列文章 【Java】『蓝桥杯』10道编程题及答案(一) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/130223115 【Java】『蓝桥杯』10道编程题及答案(二) 本文链接:https://blog.csdn.net/y…

【Hello Network】协议

作者:小萌新 专栏:网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍下协议并且设计一个简单的网络服务器 协议 协议的概念结构化数据传输序列化和反序列化网络版计算机服务端代码协议定制客户端代码服务线程执…

[Netty] HashWheelTimer时间轮 (十六)

文章目录 1.常见定时任务实现2.时间轮算法3.HashedWheelTimer源码分析3.1 内部结构分析3.2 构造方法3.3 添加任务3.4 工作线程Worker3.5 停止时间轮 4.HashWheelTimer总结 1.常见定时任务实现 定时器的使用场景包括:成月统计报表、财务对账、会员积分结算、邮件推送…

Linux Podman容器介绍

目录 Podman讲解 Container 和 Container Images 的关系 安装Podman 配置root的容器管理 国内镜像源 配置Podman的镜像源 创建容器相关命令 配置rootless的容器管理 配置Podman镜像源 管理容器镜像 管理容器 将容器作为systemd服务运行 配置普通用户来创建systemd…