裸机系统与多线程系统

裸机系统
裸机系统通常分成轮询系统和前后台系统

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

轮询系统伪代码
int main(void)
{/* 硬件相关初始化 */HardWareInit();/* 无限循环 */for (;;) {/* 处理事件1 */DoSomething1();/* 处理事件2 */DoSomething2();/* 处理事件3 */DoSomething3();}}

前后台系统

相较于轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,对事件的处理还是回到轮询系统中完成。在这里我们称中断为“前台”,main()函数里面的无限循环称为“后台”。

 前后台系统伪代码
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;int main(void)
{/* 硬件相关初始化 */HardWareInit();/* 无限循环 */for (;;) {if (flag1) {/* 处理事件1 */DoSomething1();}if (flag2) {/* 处理事件2 */DoSomething2();}if (flag3) {/* 处理事件3 */DoSomething3();}}}void ISR1(void)
{/* 置位标志位 */flag1 = 1;/* 如果事件处理时间很短,则在中断里面处理;如果事件处理时间比较长,则回到后台处理 */DoSomething1();}void ISR2(void){/* 置位标志位 */flag2 = 1;/* 如果事件处理时间很短,则在中断里面处理;如果事件处理时间比较长,则回到后台处理 */DoSomething2();}void ISR3(void){/* 置位标志位 */flag3 = 1;/* 如果事件处理时间很短,则在中断里面处理;如果事件处理时间比较长,则回到后台处理 */DoSomething3();}

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

多线程系统

相比前后台系统,多线程系统的事件响应也是在中断中完成的,但事件的处理是在线程中完成的。在多线程系统中,线程与中断一样,也具有优先级,优先级高的线程会被优先执行。当一个紧急事件在中断中被标记之后,如果事件对应的线程的优先级足够高,就会立刻得到响应。相比前后台系统,多线程系统的实时性又被提高了。

多线程系统伪代码int flag1 = 0;int flag2 = 0;int flag3 = 0;int main(void){/* 硬件相关初始化 */HardWareInit();/* OS初始化 */RTOSInit();/* OS启动,开始多线程调度,不再返回 */RTOSStart();}void ISR1(void){/* 置位标志位 */flag1 = 1;}void ISR2(void){/* 置位标志位 */flag2 = 2;}void ISR3(void){/* 置位标志位 */flag3 = 1;}void DoSomething1(void){/* 无限循环,不能返回 */for (;;) {/* 线程实体 */if (flag1) {}}}void DoSomething2(void){/* 无限循环,不能返回 */for (;;) {/* 线程实体 */if (flag2) {}}}void DoSomething3(void){/* 无限循环,不能返回 */for (;;) {/* 线程实体 */if (flag3) {}}}

相比前后台系统中后台顺序执行的程序主体,在多线程系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的、无限循环且不能返回的小程序,这个小程序我们称之为“线程”。每个线程都是独立的、互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后,我们在编程时不需要再精心设计程序的执行流,不用担心每个功能模块之间是否存在干扰。加入了操作系统,我们的编程反而变得简单了。整个系统带来的额外开销就是操作系统占据的少量FLASH和RAM。现如今,单片机的FLASH和RAM容量越来越大,完全足以支撑RTOS的开销。
无论是轮询系统、前后台系统还是多线程系统,不能单纯地评定孰优孰劣,它们是不同时代的产物,在各自的领域有相当大的应用价值,只有合适的才是最好的。

RTOS rt-thread裸机系统与多线程系统相关推荐

  1. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  2. rt thread系统下添加wiznet软件包后,不插网线CPU利用率100%问题

    rt thread系统下添加wiznet软件包后如果不插网线的话其他任务运行很卡,使用ps命令发现优先级低的任务很多都超时了 rt thread线程错误码 添加了一个可以查看CPU利用率的软件包CPU ...

  3. muduo学习笔记 - 第1章 C++多线程系统编程

    第1章 C++多线程系统编程 1.1 智能指针 C++中动态内存管理是用new和delete完成. 动态内存管理经常出现两种问题: 忘记释放内存造成内存泄露 还有指针引用的内存的情况下释放内存,造成引 ...

  4. 并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等 目录 1. “共享内存系统”,消息传递系统”。 1 1.1. 共享模式 多进程 多线程 1 1.2. Actor消息模式 事件驱动 2

    并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等 目录 1. "共享内存系统",消息传递系统". 1 1.1. 共享模式 多进程 多线程 1 1.2. Ac ...

  5. muduo学习笔记 - 第4章 C++多线程系统编程精要

    第4章 C++多线程系统编程精要 Pthreads只保证统一进程之内,同一时刻的各个线程的id不同,不能保证同一进程先后多个进程具有不同的id,更不要说一台机器上多个进程之间的id唯一性,pthrea ...

  6. 实时多线程系统的日志实现

    实时多线程系统的日志实现 2008-03-21 09:19 黄明/戴颖 软件世界 我要评论(0) 字号:T | T 为了分析软件系统在测试和运行期产生的故障,目前大多数软件系统所广泛使用的一种方法就是 ...

  7. FreeRTOS(一):裸机系统与多任务系统

    裸机系统与多任务系统 3.1裸机系统 3.1.1轮询系统 3.1.2前后台系统 3.2多任务系统 总结 3.1裸机系统 裸机:英文名是Bare machine, Bare metal,指没有配置操作系 ...

  8. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  9. RT Thread根据开发板制作BSP方法

    之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...

最新文章

  1. App Store生存法则:iOS开发者经验分享
  2. stdio.h iostream.h iostream 三者
  3. boost::describe模块和boost::json混合编程的测试程序
  4. RPC创建API 模块
  5. Java BigDecimal toString()方法与示例
  6. Postgresql 按30分钟、小时、天分组
  7. ShardingSphere(六) 读写分离之mysql 主从同步配置
  8. 后疫情时代,华为云会议如何定义未来会议?
  9. delphi 简单的发送字符串消息
  10. java writer 乱码_Java servlet 使用 PrintWriter 时的编码与乱码
  11. [性能调优] mysql 优化变量
  12. [it-ebooks]电子书列表v0.1.1
  13. WinRAR授权/激活(购买许可)
  14. 高中计算机平面设计计划书,日照师范学校计算机平面设计专业教学方案.doc
  15. Proof of Stake-股权证明 系列3
  16. 自动化测试八宗罪- 读Test Automation Snake Oil的一点翻译和感想
  17. 最常被遗忘的 Web 性能优化:浏览器缓存
  18. iOS11以及iPhone X遇到的相关问题
  19. 左右脸软件测试初学者,安卓左右脸对称测试app
  20. C语言自学路之计算平方(输入验证)

热门文章

  1. 用Python做的小游戏合集——飞机大战
  2. 数组的缩减(Java)
  3. 如何运用个人独资企业进行合理税收筹划?
  4. 运维常用单词-会持续更新
  5. CPI总线与ISA总线的区别
  6. Vue项目中使用swiper插件开发3d轮播图
  7. 动漫图片接口整理和爬取
  8. 单相整流及三相整流电路分析-包括整流桥及电容选择计算
  9. python使用Excel文件(增、删、改、查)
  10. “10类”电子劳动合同签署工具:节约时间、高效签署