CSDN话题挑战赛第2期
参赛话题:学习笔记

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?

裸机系统

在嵌入式中,裸机系统通常指的是在main函数中跑一个大循环,通过轮询的方式实现任务处理的单线程操作系统。裸机系统又以前后台系统为主后台指的是main函数大循环中的任务轮询,前台指的是中断服务程序。后台的任务轮询可以被前台中断,跳转到中断服务程序,中断完成后再返回轮询任务中。为了任务执行的实时性,需要尽可能压缩中断服务程序的执行时间,将复杂任务交由后台处理。这种设计方法,可以保证任务在大多数情况下不会丢失。

前后台程序架构图:

来源: µC/OS-III 文档

前后台系统中的运行过程:

  • 在大循环中进行后台任务的轮询。
  • 在执行到Task3时,进入中断服务程序ISR1,Task4flag设置为1
  • ISR1返回后,继续执行完Task3,然后执行Task4
  • 在执行Task4的时候进入ISR2,在ISR2中又进入嵌套的中断ISR3
  • ……

前后台程序的伪代码实现:

int flag1 = 0;
int flag2 = 0;
int flag3 = 0;int main(void){    /* 初始化硬件 */hardware_init();/* 前台的大循环 */while(1){if(flag1) handle_event_1(); /* 处理中断1的事件 */if(flag2) handle_event_2(); /* 处理中断2的事件 */if(flag3) handle_event_3(); /* 处理中断3的事件 */...}
}/* 中断服务程序 ISR1 */
void interrupt1(void){flag1 = 1;
}/* 中断服务程序 ISR2 */
void interrupt2(void){flag2 = 1;
}/* 中断服务程序 ISR3 */
void interrupt3(void){flag3 = 1;
}

裸机 VS RTOS

前后台系统的缺点主要有:

  • CPU在轮询过程中一直被占用,导致了资源的浪费,同时MCU的功耗会比较高。
  • 高优先级的任务只能等当前任务执行完成后才能在下次轮询中被执行,导致实时性不高。
  • 需要自己造轮子,需求变动后维护代码本高,代码复用需要有一定的门槛。

关于第一点,针对以上的伪代码可以进行优化。当后台大循环没有任务要执行时,可以让MCU进入低功耗模式,这样便能够降低功耗。

关于第二点,在前后台的机制下即便是高优先级的任务被中断触发,也只能等待当前任务完成后才能被执行。在RTOS中,有相应的机制来保证高优先级任务能够被及时执行。

关于第三点,一个完备的前后台系统的开发和维护成本很高,但可移植性相对较低。无论是新需求的实现还是工程复用,都需要工程师对现有的系统架构非常熟悉,对于新人不是很友好。相较之下,主流的RTOS提供通用的架构和API,且被充分测试验证过,所以可靠性和可复用性会更好。

相比于RTOS,裸机系统在程序的实时性、任务调度和代码维护上都不占优势,那我们为什么还要学习裸机系统呢?

第一,RTOS并不能移植到所有的MCU上。主流RTOS剪裁的最小系统中对FLASH和RAM大小的要求,超过了许多MCU的上限。

第二,裸机系统是深入理解RTOS的基础。在实际的项目中,裸机系统也需要深思熟虑的架构,来实现对中断的处理和硬件资源的调度。在裸机系统的开发中,能够加深入对MCU中断和各个硬件模块的理解,对于进一步学习RTOS是有极大帮助的。

第三,应用场景的适配。作为一个全面的嵌入式工程师,应该能够活用各种技术满足客户的需求。在很多低功耗场景中,裸机系统是不可替代的。有应用场景,就有值得学习的必要。

所以,虽然前后台系统有以上的缺点,但是并不妨碍其在中小型系统中的广泛应用。

写在最后

以上便是嵌入式前后台系统的学习笔记,虽然做嵌入式也有几年了,但也是最近才开始意识到总结和回顾的必要性。如果一个知识点你没办法转换为语言或者文字,你恐怕难以说服自己是真的掌握了。感谢这次的主题活动,让我也有机会总结和回顾嵌入式的知识。

一个经典的嵌入式裸机系统相关推荐

  1. 基于Yocto构建嵌入式Linux系统U-boot、kernel内核、rootfs文件系统

    前言 Yocto 是一个很强大的构建工具,其功能不仅仅是用来获取BSP源码和简单地编译源码,开发者还可以使用Yocto对其 开发板添加各种第三方开发库,而不需要每次重新从零开始编译源码,解决第三方依赖 ...

  2. python framebuffer gui_基于Framebuffer的嵌入式GUI系统实现

    摘要:本文研究了基于Framebuffer的嵌入式GUI的系统实现,包括其体系结构层次的建立.驱动机制的分析.微型客户端/服务器模式的实现,以及基于Framebuffer的GAL与GDI的设计等关键内 ...

  3. 嵌入式linux系统的基本组成,嵌入式Linux系统的构成

    一个典型的嵌入式Linux系统按照存储空间的划分通常包括引导区,内核区与文件系统区,引导区存放Boot  Loader与系统参数,内核区存放特定嵌入式平台的定制Linux内核 文件系统包括根文件系统和 ...

  4. 构建一个适合stm32mp157系列开发板的嵌入式Linux系统

    在线课堂:https://www.100ask.net/index(课程观看) 论  坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taoba ...

  5. 战斗机嵌入式训练系统中的智能虚拟陪练

    战斗机嵌入式训练系统中的智能虚拟陪练 人工智能技术与咨询 来源:<航空学报> ,作者陈斌等 摘 要:智能化"实虚"对抗是现代先进战斗机嵌入式训练系统的重要功能需求.自主 ...

  6. 【Linux】嵌入式Linux系统的移植(上篇:交叉编译器、连接方式)

    嵌入式Linux系统移植 嵌入式Linux系统移植是进行Linux驱动开发的基础,如果连Linux系统移植都完成不了,那就更不用说驱动开发了.因此,Linux系统移植至关重要. 嵌入式Linux系统的 ...

  7. 这个设计思想能启蒙你很多年,嵌入式裸机按键扫描

    这个设计思想能启蒙你很多年,嵌入式裸机按键扫描 摘要:本文目的是讲述一个按键扫描处理的面向对象开发的设计思想,适用于裸机开发,通过按键扫描,检测到按键是否按下,松开等状态,并将该状态通过其他形式反馈给 ...

  8. 嵌入式Linux系统开发笔记(七)

    嵌入式Linux系统开发笔记(七) 七.U-Boot基础 1.概述 在移植 Linux之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核, ...

  9. 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

最新文章

  1. [转载红鱼儿]kbmmw 开发点滴:ErrorTable用法
  2. 《大话》之 策略模式 Vs 状态模式
  3. python中的位置怎么看_如何知道项目在Python有序字典中的位置
  4. 计算机风格学,由风格学习算法自动生成大规模手写字体
  5. 操作系统死机的12个问题
  6. 关于自我学习停滞的思考
  7. C语言中的static
  8. spring+mybatis 事务管理,配置都正确,但是回滚不了
  9. Matlab - 演化博弈论实现
  10. 2022年春招牛客网最热门的Java岗面试八股文汇总
  11. 银行业的python项目_python练习项目(银行)——开户和查询
  12. SSL证书申请流程,中文域名如何申请证书?
  13. windows商店_Windows 10商店迎来重大改变,PC平台游戏计划公布
  14. hawk大数据基础知识总结(1)
  15. 如何看hbo_如何取消HBO Max订阅
  16. 三方协议服务器不填,三方协议档案转寄地址可以不填吗
  17. android手机红外代码HAL,手机红外遥控器发送红外信号到STM32【HAL库】
  18. 捷联惯导中的姿态更新
  19. 域策略怎么分发计算机软件,AD域中如何布置软件自动分发
  20. 华天软件SiNOVATION 几何造型内核CRUX IV官方介绍信息

热门文章

  1. python3输出不换行_python3不换行输出
  2. atofstrtod
  3. iOS验证码及密码输入框的实现
  4. 如何设置Android中TextView的行间距
  5. Unity 物理模拟不够逼真如何处理
  6. sk cobi yuce
  7. JavaScript常见输出语句
  8. 【软考-中级】系统集成项目管理工程师-【10 项目质量管理】
  9. 代码随想录算法训练营第一天 | 704.二分查找、27.移除元素题目
  10. 一个虚拟主机实现多域名多网站的方法---实测可行