FPGA开发之eCos系统

eCos是一个嵌入式可配置实时操作系统,eCos 良好的可配置性、可扩展性、移植性和兼容性主要得力于 eCos 的特殊的体系结构。

eCos 层次结构:将不同功能的软件分成不同的组件,这些组件具有可重用性,分别位于系统的不同层次,这种层次结构实现了eCos的可配置性、可移植性、兼容性和可扩展性。

下图是eCos系统的层次结构图:

这种层次结构的最底层是硬件抽象 HAL,它负责对目标系统硬件平台进行操作和控制,包括对中断和例外的处理,为上层软件提供硬件操作接口。只需提供新硬件的抽象层,就可以将整个 eCos 系统包括基于 eCos 的应用移植到新的硬件平台上。其上是系统引导程序 RedBoot,GDB 工具及设备驱动程序。内核是eCos的核心组件,也是系统的一个可选组件,一些较为复杂的应用需要使用内核。内核提供了多个可供选择的调度器,它还具有一个多线程机制,支持多任务处理,同时还支持对称多处理器SMP系统,eCos内核提供了丰富的同步原语,完全满足嵌入式应用的需求,内核还负责对中断和异常进行处理,它的中断之后处理机制保证了系统的实时性。此外,内核还具有内存分配机制和定时机制,并提供多线程GDB调试支持。内核为主层软件和应用程序提供了丰富的API接口函数。

eCos包含的网络支持包支持完整的TCP/IP网络协议栈协议,它提供了基于OpenBSD和FreeBSD两种实现方式。在内核之上的软件组标准库、文件系统和兼容层等,可使eCos很方便地容纳第三方软件。包是组件的发布单位,在包内包含了组件的所有源代码、头文件、说明文档和其他相关文件。每个组件的包都可以被安装、卸载或更新。同样地,在进行 eCos 配置时,包可以被使能、禁止或选择包的版本。

包的结构如下:
(1)用于建库的源文件。应用程序将与该库进行链接生成可执行文件;
(2)用于对包的接口进行定义的头文件;
(3)在线说明;
(4)用于测试的源码程序;
(5) 描述该包的一个或多个 CDL(Component Definition Language 组件定义语言)脚本。

并非所有的包都包含以上内容,但每个包必须有自己的 CDL 脚本。

eCos 的源码体系结构:源码的内容包括系统所有软件组件、测试程序代码、配置工具及源码、应用程序例子和说明文档等。其主要目录包括:
(1)packages:包含 eCos 系统的所有软件包。
(2)tools:包含 eCos 配置工具(图形配置工具和命令行配置工具),包括可执行文件和源码。
(3)examples:包含一些从简单到复杂的应用程序例子。
(4)doc:联机说明文档。

eCos 使用组件仓库(component repository)的形式对所有软件包和组件进行管理,packages 子目录就是包含所有软件包及组件的组件仓库。组件框架的包管理工具(Package Administration Tool)对 eCos 源码进行管理,在组件仓库中增加新的软件包、更新当前使用的包以及删除旧的不需要的软件包。packages 目录下有一个数据库文件 ecos.db,包含了组件仓库所有软件包的信息,它由包管理工具进行维护。如果新开发了 eCos 软件包就需要把新增加的软件包的信息添加到 ecos.db 中。应用层的开发人员可以将组件仓库当作可以重复应用的只读资源。如果将 eCos 移植到新的平台,就需要对它进行编辑,以便配置工具可以识别新的平台并定制新的硬件抽象层 HAL。由于 eCos 还处于不断发展之中,任何时候都有可能增加新的平台支持及新的组件,eCos 的组件仓库也因此得到不断更新。

eCos 的内核分析:eCos的核心部分是功能强大、灵活且可配置的内核。内核的模块化结构和可配置性保证某些模块进行配置和更换时不会对内核的其余部分造成影响。

eCos 内核主要功能包括:
(1)调度算法及其选择配置;
(2)内存分配算法及其配置、cache 控制;
(3)一组丰富的同步原语;
(4)支持对称多处理 (SMP);
(5)中断处理和例外处理;
(6)定时器、计数器和警告机制;
(7)多线程及 GDB 调试。

内核是eCos系统的核心部分,它本身是一个可选的包。当开发一个单线程的应用程序时,有的情况下不需要内核的支持,RedBoot就是一个例子。这种无内核的单线程采用一种循环查询方式,连续不停地对所有的设备进行检查,当有I/O事件发生时在进行相应地处理。不过这种查询方式每一次循环可能需要进行少量的计算,从I/O事件的发生到查询循环体检测到该事件的发生之间的延时会增加。但当应用较为复杂时就需要使用多线程机制,必须使用内核。其实,eCos的许多高级软件包(如TCP/IP)都使用了多线程机制。如果应用程序使用了含多线程的软件包,则内核就变成一种必需的包,而不是可选的。大多数操作系统通常在内核中就包含了内存分配机制和设备驱动程序,而eCos则不同,它为了支持系统的可配置性,采用一个单独的包来支持对内存的分配,对每一个设备驱动程序都由一个单独的包来支持。这种方式的采用使得用户可以根据具体应用的需要,通过配置工具对各种包进行组合,为系统提供最大限度上的可配置能力。

eCos 内核采用两种方式来实现其所提供的功能:
(1)序和其他软件包直接调用内核提供的 API 接口函数,内核提供了完整的 C 函 数作为其 API , 如 cyg_thread_create , cyg_scheduler_lock, cyg_mempool_fix_treat 等。

(2)eCos 兼容层提供的标准函数,如 POSIX 和 uITRON。应用程序可以调用一些可以实现 eCos 基本功能的函数,如 POSIX 的 pthread_create,pthread_mutex_lock,pthread_cond_wait 等。在 eCos 应用程序中使用标准函数更容易实现在其他环境下开发的软件的可用性。

内核的可选择性和可配置性也存在一些缺点,它增加了设备驱动程序的复杂性,不管内核是否存在,设备驱动程序都应能正常工作。有内核的多线程环境和无内核的单线程环境下的中断处理方法不同。为了实现在这两种环境下都能正确处理中断,硬件抽象层的公共HAL包提供了一些驱动程序API函数,如cyg_drv_interruptes_attach,当系统有内核时,这些API函数映射到等同的内核函数,如cyg_interruptwe_attach。当系统没有内核时,公共HAL包将直接实现这些驱动程序API函数。内核提供了许多配置选项来控制应用所需要的功能,而各兼容包需要对这些选项进行特殊的设置。不同的兼容包在同一配置中可能引起各样的内核选项冲突,因此同一个配置不能同时使用两个不同的兼容包。