带你读《C/OS-III内核实现与应用开发实战指南:基于STM32》之二:裸机系统与多任务系统

简介: 本书分为两部分,第一部分先教你如何从0到1把uC/OS-III内核写出来,从底层的汇编开始讲解任务如何定义、如何切换,还讲解了阻塞延时如何实现、如何支持多优先级、如何实现任务延时列表以及时间片等uC/OS的核心知识点;第二部分讲解uC/OS-III内核组件的应用以及使用uC/OS-III进行多任务编程。

点击查看第一章
点击查看第三章

第2章

裸机系统与多任务系统
在真正开始动手写RTOS之前,先来讲解一下单片机编程中的裸机系统和多任务系统的区别。

2.1 裸机系统

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

2.1.1 轮询系统

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

image.pngimage.png

2.1.2 前后台系统

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

image.pngimage.png

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

2.2 多任务系统

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

image.pngimage.png
image.png

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

image.png

相关文章
|
10天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
26 0
|
12天前
|
算法 程序员
深入理解操作系统内存管理:分页系统的优势与挑战
【4月更文挑战第7天】 在现代操作系统中,内存管理是一项至关重要的任务,它确保了计算机能够高效、安全地运行各种程序。分页系统作为内存管理的一种技术,通过将物理内存分割成固定大小的单元——页面,为每个运行的程序提供了一种独立且连续的内存地址空间。该技术不仅简化了内存分配,还允许更高效的内存使用和保护。本文探讨了分页系统的核心原理,优势以及面临的挑战,旨在为读者揭示其在操作系统设计中的重要性。
|
2月前
STM32F103标准外设库——SysTick系统定时器(八)
STM32F103标准外设库——SysTick系统定时器(八)
68 0
STM32F103标准外设库——SysTick系统定时器(八)
|
4月前
|
iOS开发 MacOS
MAC OS更新系统后IDEA中的SVN报错无法使用
MAC OS更新系统后IDEA中的SVN报错无法使用
|
4月前
|
传感器 数据采集 物联网
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计2
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计
191 0
|
28天前
|
存储 Shell Linux
【Shell 命令集合 网络通讯 】⭐Linux 显示当前系统的主机名和操作系统类型 uuname命令 使用教程
【Shell 命令集合 网络通讯 】⭐Linux 显示当前系统的主机名和操作系统类型 uuname命令 使用教程
28 0
|
29天前
|
缓存 算法 安全
深入理解操作系统内存管理:分页系统的优势与挑战
【2月更文挑战第30天】 在现代操作系统中,内存管理是核心功能之一,它负责将有限的物理内存资源分配给多个并发运行的进程。分页系统作为内存管理的一种流行技术,其通过虚拟到物理地址的映射提供了程序的逻辑地址空间,并允许更高效的内存分配和保护。本文旨在探讨分页系统的关键优势,包括其如何提升内存利用率、实现内存保护以及支持多任务处理。同时,我们也将分析分页机制带来的挑战,诸如页面置换算法的效率问题、页表管理和TLB(Translation Lookaside Buffer)的维护等。
|
30天前
|
存储 算法
深入理解操作系统内存管理:分页系统的优势与挑战
【2月更文挑战第29天】 在现代操作系统中,内存管理是核心功能之一,它负责有效地分配、跟踪和回收内存资源。分页系统作为一种内存管理技术,已经成为大多数操作系统的标准配置。本文将探讨分页系统的原理、优势以及面临的挑战。通过对分页机制的深入分析,我们旨在提供一个全面的视角,以帮助读者更好地理解这一关键技术如何影响操作系统的性能和稳定性。
|
1月前
|
存储 C语言 芯片
C/C++ stm32基础知识超详细讲解(系统性学习day14)
C/C++ stm32基础知识超详细讲解(系统性学习day14)
|
2月前
|
Rust 安全 开发者
Rust在操作系统组件开发中的应用:设备驱动与系统服务
本文探讨了Rust在系统级开发中的潜力,特别是针对操作系统组件如设备驱动和系统服务的开发。我们将分析Rust为何适合这些任务,展示其在实际项目中的应用,并讨论其面临的挑战和未来的可能性。