**

单片机开发的两种类型

**
最近学了一下ROS操作系统的工作原理和使用方法,想到了对于单片机来说的操作系统RTOS开发的一些概念,觉得有必要在细说一下单片机开发的两种方式。
首先,单片机开发一般有两种类型,一种是状态机编程,一种是操作系统编程。这里,我们在学习单片机的时候一般使用的都是状态机编程。
什么是状态机编程?
状态机编程的一个显著特点就是要放置大量的标志变量。比如,我为单片机编写一个程序,我要实现的功能是,按下某个按键,然后某个程序执行。这个程序估计大家都做过吧,有使用按键扫描实现的,有使用中断实现的。但是有没有发现不管是那种实现方法,都是要使用一个变量用来说明检测到了按键,然后另一部分程序检测这个标志,如果检测到了就执行程序,如果没检测到就继续检测。这个信息的传递过程是通过共享一个变量的状态实现的。这个就叫做状态机编程。
状态机编程有状好处也有坏处,好处是不用关心程序执行过程的内存分配问题,坏处也很明显,就是程序在及其复杂的时候,你会创建非常多的状态变量,会使得程序变得很乱,以至于到后期没办法维护。而能完美解决这一个缺点的编程方式是使用RTOS。
什么是ROTS编程
RTOS为实时操作系统。为什么单片机程序复杂的时候要使用这一种开发方式呢?因为这一种开发方式不需要使用状态机,也就是各个程序间通信依靠的不是状态变量。而是依靠的叫做通信的机制。
RTOS在程序执行时和我们的状态机编程不一样,状态机编程时典型的从上到下一条一条程序地执行,哪怕是进入中断了也得等中断执行完后才能执行下面的语句。而RTOS编程则可以看作是多个程序可以同时运行。就好像你可以一边听歌一边看电视,两者互不干扰地执行。
这样的程序执行方式再与通信配合到一起就使得程序的开发效率显著提升了。比如刚才的检测按键的程序在RTOS中就可以这么编程。1、创建两个进程,一个进程是按键检测程序,另一个进程是按键处理程序 2、给两个进程分别写入程序,对于按键检测程序来说,如果检测到按键按下,则发送一个消息给按键处理程序进程。对于按键处理程序来说,则是接收到消息后则运行程序。
好像看起来没有什么不同对吧。但是实际用起来的时候差距很大,大家都知道中断程序有着一个优先级的问题,就是高优先级的中断可以打断低优先级的中断,这就造成一个问题。比如说我需要用中断不停接收电脑发来的数据,一刻都不能停。但是我有需要另一个中断能及时接收手机通过蓝牙发过来的数据。你会发现,不管这两个中断的优先级怎么分配,总会出现其中一个无法正常工作的状况。要么是接收的电脑数据因为被蓝牙打断导致数据丢失。
要么是蓝牙因为没有电脑中断的优先级高,导致蓝牙无法进入中断。
其实导致这种情况产生的原因还是程序只能一条一条执行的问题,但是如果用RTOS的话,创建两个进程,一个处理电脑数据,一个处理蓝牙数据,互不干扰,就可以同时处理两个数据了,这就是RTOS的优势。

其实在学完stm32后的单片机开发,基本上都要与RTOS打交道,因为很多情况下我们要开发的系统并不是单一流程的,就比如是开发一个无人机,我们需要获取陀螺仪数值,计算各个pid,驱动电机,姿态解算,远程遥控数据解析。。。。。。这些功能要使用状态机编程可以说是难上加难,得创建一大堆的状态变量,而且各个中断优先级也要仔细斟酌。如果用RTOS的话,对每个功能创建一个进程,让各个过程同步处理,将处理完后的数据通过发送消息的方式,在各个进程间通信。这样可以大幅提高开发效率。而且近些年火起来的物联网概念,其实也是RTOS的应用,中国出名的RTOS有RT-Thread ,华为的LiteOS,腾讯的Tencent OS,阿里的Alios, 外国的FREERTOS ,UCOS 等。都是单片机上的RTOS。当然,至于RTOS和单片机裸机编程的区别还是要自己试过才知道。

单片机开发的两种类型相关推荐

  1. Mixly第三方库开发的两种方法——U8g2库二次开发

    Mixly第三方库开发的两种方法--U8g2库二次开发 前言 方法一:自定义库 1.创建库文件夹 2.开始编程 2.1.定义图形块的基本信息 2.2.定义图形块的外观样式 2.3.定义图形块与C语言的 ...

  2. M.2 固态硬盘的两种类型:SATA 和 NVMe 的区别?

    参考 https://www.kingston.com.cn/cn/solutions/pc-performance/two-types-m2-vs-ssd 前言 在存储技术领域,当我们讨论 M.2 ...

  3. 单片机学c语言还是python好_单片机开发用哪种语言最好?

    在过去的几十年中,单片机的规格变化不大,但是语言和支持软件的扩展为应用程序开发开辟了许多途径.多年来,对单片机进行编程涉及到两种语言的选择:C语言和汇编语言.但是随着现在可用于微处理器的新语言,用户在 ...

  4. 手机号段对应地区编码_什么是编码器?了解两种类型的编码器

    编码器提供反馈,以精确控制速度和位置.转子角位置是通过两个相差90度的方波和每转一圈发生的可选索引脉冲给出的.有多种技术可获得这些结果. 两种类型的编码器:光学和磁编码器 光学编码器 这种类型的编码器 ...

  5. Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型

    http://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html 本文讲解了在 Spring 中处理 LOB 数据的原理和方法, ...

  6. Ringtone的两种类型三种形式

    文章目录 Ringtone 的两中类型三种形式 两种类型 三种形式 1 最常见的uri形式 2 Settings数据库中的uri形式 3 Android 4.4以后增加了document uri 返回 ...

  7. (发现)问题才是推动创新的动力系列:两种类型硬币(均匀和非均匀)能否用第一次得正面朝上的概率推断“第一第二次依次获得正面反面情况”的概率?

    两种类型硬币(均匀和非均匀)能否用第一次得正概率推断,第一第二次依次获得正反概率? 2种硬币 均匀的 COIN1  正反概率(正0.5  反0.5) 非均匀的COIN2 (正0.9  反0.1) 问题 ...

  8. 设计一个处理两种类型地址的地址簿程序_编译器设计-符号表-中间代码生成

    编译器设计-符号表-中间代码生成 Compiler Design - Symbol Table Compiler - Intermediate Code Generation 一.Compiler D ...

  9. 用implicit和explicit打通两种类型

    我们知道,在c#中,如果两个类型没有继承关系 ,是不能相互值赋的,但有两个关键字implicit和explicit,可以让 Date date = DateTime.Now这样的赋值成为可能. 注:c ...

最新文章

  1. 多传感器融合之滤波(一)——卡尔曼滤波(KF)推导
  2. 3D视觉工坊中秋国庆贺礼!
  3. java7 xp版下载64位_JRE7 64位下载|JRE7 64位(java运行环境) V1.7.0.65官方版
  4. REVIT模型之机器人瓦力
  5. CodeForces - 1453E Dog Snacks(树形dp+贪心)
  6. AES加密算法的学习笔记
  7. linux 查看显卡信号_Linux下如何查看NVIDIA显卡信息
  8. 降本增效利器!趣头条Spark Remote Shuffle Service最佳实践
  9. python之os模块的基本使用
  10. 【经典回顾】静态结构不能满足模型部署性能需求?微软提出动态卷积结构,Top-1准确率提高2.9%!(附复现代码)...
  11. c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?
  12. 搭建PHP官方框架zend framework 2(LINUX)
  13. 铁岭市奔腾计算机学校地址,辽宁省铁岭市奔腾计算机职业高级中学2020年高三数学理上学期期末试题.docx...
  14. h5跳转高德百度导航
  15. School Regional Team Contest, Saratov, 2011-F. Spiders-求树直径
  16. directshow虚拟摄像头
  17. 啤酒每罐2.3元,饮料每罐1.9元
  18. python修改文件格式为jpg_利用python将webp文件转化为jpg文件,将png文件修改为jpg,图像重命名...
  19. Python爬取字节跳动1W+招聘信息
  20. 程序变量命名法:匈牙利命名、驼峰式、帕斯卡命名法

热门文章

  1. AVI格式视频转YUV
  2. 盘古苹果iOS9.2-iOS9.3.3越狱Bug统计:这五点需注意
  3. html设置及格不及格良好优秀,Excel用IF函数算优秀良好及格不及格各等级成绩
  4. Cassandra - A Decentralized Structured Storage System
  5. 安卓将数据库里Fri Jun 22 19:50:49 GMT+08:00 2018格式转化为正常格式
  6. android malware
  7. 【信号处理】数字双相码仿真含Matlab源码
  8. 计算机应用轨道交通bim,BIM大赛获奖案例—上海轨道交通13号线建设阶段BIM技术的应用...
  9. ppt学习总结--一般人需要掌握的内容
  10. Python运维开发工程师养成记(循环语句)