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

2023-05-16

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

学习了那么久的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的学习经验和方法,以及写的笔记,供大家参考,我也是一点一点从小白成长的,大家加油!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 一道有趣的C语言题:int *p=(int *)((int)a+1);

    偶然间看到这样一个c语言题目 xff1a 小端模式 int main void int a 5 61 1 2 3 4 5 int p 61 int int a 43 1 xff1b printf 34 X r n 34 p return 0
  • 一、FREERTOS学习之 freertos移植流程步骤

    目录 一 FREERTOS资源包下载 二 移植 1 资源包整理 三 工程添加 1 添加 2 编译路径添加 3 修改FreeRTOSConfig h 4 修改stm32f10x it c 5 注意 一 FREERTOS资源包下载 官网 xff
  • 三、FreeRTOS学习之 freertos的任务创建

    目录 一 任务创建 xff1a 1 静态创建 xff1a 2 动态创建 xff1a 3 任务句柄 4 例 xff1a 一 任务创建 xff1a 在freertos中 xff0c 提供了两种创建任务的方式 xff1a 静态创建 xff0c 动
  • 七、FreeRTOS学习之 软件定时器

    一 基本概念 在freertos中 xff0c 软件定时器的功能跟单片机中使用的定时器差不多 xff0c 通过设置一段时间 xff0c 等到时间到达 xff0c 定时器进入中断 xff0c 执行相应的功能函数 xff0c 被调用的函数叫做定
  • 软件iic 的编写与调试

    一 了解 1 硬件iic 其对应的芯片上有iic外设 xff0c iic的引脚是固定的 xff0c 硬件iic是直接配置内部的寄存器 xff0c 只要配置好寄存器 xff0c 外设就会产生标准的协议时序 xff0c 只需要直接调用控制函数
  • 运算符重载(),[]

    include lt iostream gt include lt cstring gt using namespace std class yunsuan private int a b c int len num char name 3
  • vector

    include lt iostream gt include lt vector gt include lt algorithm gt using namespace std 容器 xff1a vector 相当于一个数组 迭代器 xff1
  • STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解

    TIM 定时器是stm32单片机中的一个外设 xff0c STM32有8个定时器 xff0c 分别是2个高级定时器TIM1TIM8 xff0c 4个通用定时器TIM2 5 2个基本定时器TIM67 根据不同型号的单片机 xff0c 挂载的定
  • Java多线程之~~~~使用wait和notify实现生产者消费者模型

    在多线程开发中 xff0c 最经典的一个模型就是生产者消费者模型 xff0c 他们有一个缓冲区 xff0c 缓冲区有最大限制 xff0c 当缓冲区满 的时候 xff0c 生产者是不能将产品放入到缓冲区里面的 xff0c 当然 xff0c 当
  • 拷贝、移动构造

    include lt iostream gt using namespace std class temp private char a public temp char c char b a 61 new char 2 a 0 61 c
  • Dockerfile

    Dockerfile Dockerfile简介1 Dockerfile基本介绍2 Dockerfile构建过程3 Dockerfile指令用法 Dockerfile构建镜像1 Dockerfile使用CentOS构建apache镜像1 1相
  • MySQL数据库备份与恢复

    在项目的开发过程中数据库的备份是非常重要的 xff0c 为了防止数据库受到破坏 xff0c 造成不可估量的损失 xff0c 所以一定要进行数据库的备份 xff0c 并且需要掌握数据库恢复方法 xff0c 在发生数据库损坏的时候 xff0c
  • Linux设备驱动基础知识

    一 认识驱动 1 什么是驱动 不知道的情况下 xff0c 我们一般会去问度娘 xff0c 但是度娘的这个回答比较专业化 xff0c 对小白来说并不容易理解 xff0c 依旧不明白驱动到底是个啥 度娘 xff1a 驱动 xff0c 计算机软件
  • 接口及实现方法

    什么是接口 接口 xff08 英文 xff1a Interface xff09 xff0c 在JAVA编程语言中是一个抽象类型 xff0c 是抽象方法的集合 xff08 接口中的所有的方法都是抽象方法 xff09 xff0c 接口通常以in
  • JS中Document对象

    Document对象 Document对象就是一个标记性文档对象 它就是HTML文件本身 当浏览器把一个html文件加载到内存中之后 xff0c 在内存中就会形成这个document对象 document URL xff1a 返回当前页面的
  • Sphinx环境配置以及VScode编写Rst文档转html

    Sphinx环境配置 安装python3通过python3安装sphinx sphinx官方网站 xff1a Installing Sphinx Sphinx documentation python官方网站 xff1a Welcome t
  • js实现防抖和节流

    防抖 xff1a 防抖就是在连续多次触发该事件 xff0c 事件触发间隔小于设定的事件 xff0c 事件只会执行最后一次 节流 xff1a 规定的时间内 xff0c 只能触发一次该事件 接下来看代码 xff1a lt DOCTYPE htm
  • 树莓派系统镜像一键瘦身备份脚本, 生成最小化镜像img(一)

    开发 测试环境 树莓派 xff1a Raspberry Pi 3b 43 TF 存储卡 xff1a 32GB操作系统 xff1a 2020 05 27 raspios buster full armhf xff08 官方版本 xff09 程
  • 分享——网页上的虚拟机

    大家还记得之前的Windows系统吗 xff1f 相信大家一定想要重温或体验以前Windows的系统吧 xff0c 可有些朋友想体验但又嫌装虚拟机太麻烦 xff0c 怎么办呢 其实 xff0c 还有 网上的虚拟机 现在 xff0c 我就给大
  • 单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

    单片机编程中的裸机系统和多任务系统 学习了那么久的stm32还停留在裸机 xff1f xff1f xff1f 单片机编程中的裸机系统和多任务系统 1 裸机系统1 1轮询系统1 2 前后台系统 2 多任务操作系统3 为什么要学习多任务操作系统