OS(uCOS-Ⅲ)

五大嵌入式操作系统

μClinux、μC/OS-II、eCos、FreeRTOS 和 RT-thread

TOP1:μClinux

μClinux 是一种优秀的 嵌入式Linux 版本,从字面意思看是指微控制 Linux。同标准的 Linux 相比,μClinux 的内核非常小,但是它仍然继承了 Linux 操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的 API,以及 TCP / IP 网络协议等。

API(Application Programming Interface,应用程序接口

是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。 目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问原码,或理解内部工作机制的细节。

应用程序接口又称为应用编程接口,是一组定义、程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。API 同时也是一种中间件,为各种不同平台提供数据共享。程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的可维护性和可扩展性。

TCP / IP 网络协议

网络协议即网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为网络协议。

TCP / IP 协议是网络的基础,是 Internet 的语言,可以说没有 TCP / IP 协议就没有互联网的今天。

TCP / IP 是 “transmission Control Protocol / Internet Protocol” 的简写,中文译名为传输控制协议 / 互联网络协议, TCP / IP(传输控制协议 / 网间协议)是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式以及传送方式。TCP / IP 是 INTERNET 的基础协议,也是一种电脑数据打包和寻址的标准方法。在数据传送中,可以形象地理解为有两个信封,TCP 和 IP 就像是信封,要传递的信息被划分成若干段,每一段塞入一个 TCP 信封,并在该信封面上记录有分段号的信息,再将 TCP 信封塞入 IP 大信封,发送上网。在接受端,一个 TCP 软件包收集信封,抽出数据,按发送前的顺序还原,并加以校验,若发现差错,TCP 将会要求重发。因此,TCP / IP 在 INTERNET 中几乎可以无差错地传送数据。 对普通用户来说,并不需要了解网络协议的整个结构,仅需了解 IP 的地址格式,即可与世界各地进行网络通信

μClinux 操作系统的中断管理是将中断处理分为两部分

  1. 顶半处理
  2. 底半处理

在顶半处理中,必须关中断运行,且仅进行必要的、非常少、速度快的处理,其他处理交给底半处理;底半处理执行那些复杂、耗时的处理,而且接受中断。因为系统中存在有许多中断的底半处理,所以会引起系统中断处理的延时。

μClinux 对文件系统支持良好,由于 μClinux 继承了 Linux 完善的文件系统性能,它支持 ROMFS、NFS、ext2、MS-DOS、JFFS 等文件系统。

μClinux 最大特点在于针对无 MMU 处理器设计,这对于没有 MMU 功能的STM32F103 来说是合适的,但移植此系统需要至少 512KB 的 RAM 空间,1MB 的ROM / FLASH 空间,而 STM32F103 拥有 256K 的 FLASH,需要外接存储器,这就增加了硬件设计的成本。

μClinux 结构复杂,移植相对困难,内核也较大,其实时性也差一些,若开发的嵌入式产品注重文件系统和与网络应用则 μClinux 是一个不错的选择。

TOP2:μC / OS-II

μC / OS-II 是在 μC / OS 的基础上发展起来的,是用 C语言 编写的一个结构小巧、抢占式的多任务实时内核。μC / OS-II 能管理 64 个任务,并提供任务调度与管理、内存管理、任务间同步与通信、时间管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和扩展性强等特点。

对于实时性的满足上,由于 μC / OS-II 内核是针对实时系统的要求设计实现的,所以只支持基于固定优先级抢占式调度;调度方法简单,可以满足较高的实时性要求。

μC / OS-II 中断处理比较简单。一个中断向量上只能挂一个中断服务子程序 ISR,而且用户代码必须都在 ISR (中断服务程序)中完成。ISR 需要做的事情越多,中断延时也就越长,内核所能支持的最大嵌套深度为 255。

μC / OS-II 是一个结构简单、功能完备和实时性很强的嵌入式操作系统内核,针对于没有 MMU 功能的 CPU,它是非常合适的。它需要很少的内核代码空间和数据存储空间,拥有良好的实时性,良好的可扩展性能,并且是开源的,网上拥有很多的资料和实例,所以很适合向 STM32F103 这款 CPU 上移植。

MMU(Memory Management Unit)

MMU 是 Memory Management Unit 的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。

现代的多用户多进程操作系统,需要 MMU,才能达到每个用户进程都拥有自己独立的地址空间的目标。使用 MMU,操作系统划分出一段地址区域,在这块地址区域中,每个进程看到的内容都不一定一样。例如 MICROSOFT WINDOWS操作系统将地址范围 4M-2G 划分为用户地址空间,进程 A 在地址 0X400000(4M) 映射了可执行文件,进程 B 同样在地址0X400000(4M) 映射了可执行文件,如果 A 进程读地址 0X400000,读到的是 A 的可执行文件映射到 RAM 的内容,而进程 B 读取地址 0X400000 时,则读到的是 B 的可执行文件映射到 RAM 的内容。

这就是 MMU 在当中进行地址转换所起的作用。

TOP3:eCos

eCos,即嵌入式可配置操作系统。它是一个源代码开放的可配置、可移植、面向深度嵌入式应用的实时操作系统。最大特点是配置灵活,采用模块化设计,核心部分由小同的组件构成,包括内核、C语言库 和底层运行包等。每个组件可提供大量的配置选项(实时内核也可作为可选配置),使用 eCos 提供的配置工具可以很方便地配置,并通过不同的配置使得 eCos 能够满足不同的嵌入式应用要求。

eCos 操作系统的可配置性非常强大,用户可以自己加入所需的文件系统。eCos 操作系统同样支持当前流行的大部分嵌入式CPU,eCos 操作系统可以在16位、32位 和 64位等不同体系结构之间移植。eCos 由于本身内核就很小,经过裁剪后的代码最小可以为10 KB,所需的最小数据 RAM 空间为 10 KB。

在系统移植方面 eCos 操作系统的可移植性很好,要比 μC / OS-II 和 μClinux 容易。

eCos 最大特点是配置灵活,并且支持无 MMU 的 CPU 的移植,开源且具有很好的移植性,也比较合适于移植到 STM32 平台的 CPU 上。但 eCOS 的应用还不是太广泛,还没有像 μC / OS-II 那样普遍,并且资料也没有 μC / OS-II 多。eCos 适合用于一些商业级或工业级对成本敏感的嵌入式系统,例如消费电子领域中的一些应用。

TOP4:FreeRTOS

由于 RTOS 需占用一定的系统资源 ( 尤其是 RAM 资源 ),只有 μC / OS-II、embOS、salvo、FreeRTOS 等少数实时操作系统能在小 RAM 单片机上运行。相对于 μC / OS-II、 embOS 等商业操作系统,FreeRTOS 操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为 6.0 版。

作为一个轻量级的操作系统,FreeRTOS 提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。

FreeRTOS 内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU 总是让处于就绪态的、优先级最高的任务先运行。

FreeRT0S 内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。

相对于常见的 μC / OS-II 操作系统,FreeRTOS 操作系统既有优点也存在不足。其不足之处, 一方面体现在系统的服务功能上,如 FreeRTOS 只提供了消息队列和信号量的实现,无法以后进先出的顺序向消息队列发送消息。

另一方面,FreeRTOS 只是一个操作系统内核,需外扩第三方的 GUI(图形用户界面)、TCP / IP 协议栈、FS(文件系统)等才能实现一个较复杂的系统, 不像 μC / OS-II 可以和μC / GUI、μC / FS、μC / TCP-IP 等无缝结合。

TOP5:RT-thread

RT-Thread 是一款主要由中国开源社区主导开发的开源实时操作系统 ( 许可证GPLv2 )。实时线程操作系统不仅仅是一个单一的实时操作系统内核,它也是一个完整的应用系统,包含了实时、嵌入式系统相关的各个组件:TCP / IP 协议栈,文件系统,libc 接口,图形用户界面等。

关于嵌入式操作系统

早期嵌入式开发没有嵌入式操作系统的概念,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念。

轮询系统

轮询系统即在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。

Conclusion:

实时性很差,并不能检测外部的突发情况,但是程序的稳定性良好。

前后台系统

相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成。

通常把程序分为两部分:前台系统后台系统。我本人学习使用开发板的时候,就是在其上搭建自己的程序框架,这些简单的小系统其实就是前后台系统。

这样的程序包括一个死循环若干个中断服务程序:应用程序是一个无限循环,循环中调用 API 函数完成所需的操作,这个大循环就叫做后台系统。中断服务程序用于处理系统的异步事件,也就是前台系统。前台是中断级,后台是任务级。

  • 中断函数:前台系统
  • 死循环:后台系统

多任务系统

相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。在多任务系统中,任务跟中断一样,也具有优先级,优先级高的任务会被优先执行。当一个紧急的事件在中断被标记之后,如果事件对应的任务的优先级足够高,就会立马得到响应。

  • 多个任务之间是相互独立的。由调度器去决定去执行哪个任务。

因此系统中存在一个”时基“,这个就是推动系统调度的关键。

2

多任务系统 Multitask [ˌmʌlti'tɑ:sk] system

就像我们用电脑时可以同时听歌,上网,编辑文档等。

在多任务系统中,可以同时执行多个并行任务,各个任务之间互相独立。通过操作系统执行任务调度而实现宏观上的“并发运行”。从宏观上不同的任务并发运行,好像每个任务都有自己的 CPU 一样。

如何实现多任务:

CPU 只有一个,那么怎么实现多任务呢?

其实在单一 CPU 的情况下,是不存在真正的多任务机制的,存在的只有不同的任务轮流使用 CPU,所以本质上还是单任务的。但由于 CPU 执行速度非常快,加上任务切换十分频繁并且切换的很快,所以我们感觉好像有很多任务同时在运行一样。这就是所谓的多任务机制。

我们要让每个任务都有自己专属的堆栈、程序代码、数据存储区。以及认为有自己专属的 CPU。由于全局变量是系统共用的,各个任务共享,不是任务私有,所以我们需要在短时间内将 CPU 变为私有,不能让其他的任务也在同一时刻调用全局变量的值,保证数据的安全性和正确性。

私有栈的作用是存放局部变量,函数的参数,它是一个线性的空间,所以可以申请一个静态数组,把栈顶指针SP指向栈的数组的首元素(递增栈)或最后一个元素(递减栈)。

即可打造一个人工的栈出来!

临界资源

临界资源是一次仅允许一个任务使用的共享资源。每个任务中访问临界资源的那段程序称为临界区。

在多任务系统中,为保障数据的可靠性和完整性,共享资源要互斥(独占)访问,所以全局变量(只读的除外)不能同时有多个任务访问,即一个任务访问的时候不能被其他任务打断。共享资源是一种临界资源。

实现互斥(独占)访问的方法有关中断,关调度,互斥信号量,计数信号量等。

定义了如下处理临界资源访问的代码,主要用于在进入临界区之前关闭中断,在退出临界区后恢复原来的中断状态。

有一点要特别注意一下,在临界区内,只要任务不主动放弃 CPU 的使用权,别的任务就没有占用 CPU 的机会,相当于独占 CPU 了。

临界区的代码要尽量短,因为它会使系统响应性能降低。

The advantages of a multitasking system

多任务的最大好处是充分利用硬件资源,如在单任务时(大循环结构,如大部分 51 程序)遇到 delay 函数时,CPU 在空转;而在多任务系统,遇到 delay 或需等待资源时系统会自动运行下一个任务,等条件满足再回来运行先前的任务,这样就充分利用了 CPU ,提高了效率。

任务在系统运行的时候有三种状态:

任务并不是随时都可以运行的,而一个已经运行的任务并不能保证一直占有 CPU 直到运行完。一般有运行态就绪态挂起态等。

  1. 运行态。一个运行态的任务是一个正在使用 CPU 的任务。任何时刻有且只有一个运行着的任务。
  2. 就绪态。一个就绪态任务是可运行的,等待占有 CPU 的任务释放CPU。
  3. 挂起态。某些条件不满足而挂起不能运行的状态。
2

多任务系统的特点:

  1. 独立性。任务之间互相独立,不存在互相调用的关系。所有任务在逻辑上都是平等的。由于任务之间互相看不见,所以他们之间的信息传输就无法当面完成。这就需要各种通信机制如信号量,消息邮箱,队列等来实现。
  2. 并发性。由同一个处理器轮换地运行多个程序。或者说是由多个程序轮班地占用处理器这个资源。且在占用这个资源期间,并不一定能够把程序运行完毕。
2

每个任务都有属于自己唯一的优先级,在发生系统调度的时候,总是优先级最高的任务先开始运行。

多任务系统的时间管理:

oSTimeDly 函数就是以时钟节拍为基准来延时的。这个函数完成功能很简单,就是先挂起当起当前任务,设定其延时节拍数,然后进行任务切换,在指定的时钟节拍数到来之后,将当前任务恢复为就绪状态。任务必须通过 OSTimeDly 或 OSTaskSuspend 让出 CPU 的使用权,使更低优先级任务有机会运行。

延时期间即为切换任务的时机!

多任务系统中任务的定义与任务切换的实现

整个系统是由调度器来决定当前任务的运行。

什么是任务

  • 在裸机系统中,系统的主体就是 main()函数里面顺序执行的无限循环,这个无限循环里面 CPU 按照顺序完成各种事情。

  • 在多任务系统中,我们根据功能的不同,把整个系统分割成一个个独立的且无法返回的函数,这个函数我们称为任务,也有人称之为线程

定义任务栈

任务栈相当于一部分 RAM 的区域,这个空间的大小是我们人为规定的!我们每创建一个任务就要为其分配一个独立的栈空间。

在裸机系统中,他们统统放在一个叫栈的地方,栈是单片机 RAM 里面一段连续的内存空间,栈的大小由启动文件里面的代码配置在多任务系统中,每个任务都是独立的,互不干扰的,所以要为每个任务都分配独立的栈空间。

这个栈空间通常是一个预先定义好的全局数组。这些一个个的任务栈也是存在于 RAM 中。

任务控制块 TCB

系统如何识别不同的任务?( 精确定位到对应的任务中 )

任务控制块就相当于任务的身份证,里面存有任务的所有信息,比如任务的栈,任务名称,任务的形参等。

TCB 是一个新的数据类型,在 os.h 定义。

实现任务创建函数

任务的栈,任务的函数实体,任务的 TCB 最终需要联系起来才能由系统进行统一调度。那么这个联系的工作就由任务创建函数 OSTaskCreate 来实现该函数在 os_task.c 中实现。

猜你喜欢

转载自www.cnblogs.com/QiSuo/p/12560229.html