摘 要: 本文介绍了实时操作系统 ECOS 的特点及基本结构,并具体研究了 ECOS 在三星公司以 ARM940T 为内核的 S3C2510 嵌入式芯片上的移植方法。文章着重讨论了移植过程中的重点与难点部分: ECOS 的硬件抽象层 (HAL) 移植。该移植方案已经过实际测试,系统稳定可靠,可运行多任务式应用程序。
关键词:实时操作系统; ECOS ;硬件抽象层;移植; ARM
引言
ECOS(Embedded Configurable Operating COS 等操作系统相比, ECOS 更适合于处理实时信号的设备,如移动通信、 WLAN 等通信设备的开发。 m Clinux 和 m System ,嵌入式可配置操作系统 ) 是一种针对 16 位、 32 位和 64 位处理器的可移植嵌入式实时操作系统。由于其源代码是公开的,因而有越来越多的设计人员开始关注 ECOS 操作系统。 ECOS ******的特点是模块化,内核可配置。最小版本的 ECOS 只有几百字节,非常适合小型嵌入式系统的开发。相对于嵌入式 Linux 来说, ECOS 有配置灵活和节省资源的优势。它的另一个优点是使用多任务抢占机制,具有最小的中断延迟,支持嵌入式系统所需的所有同步原语,并拥有灵活的调度策略和中断处理机制,因而具有良好的实时性。与
S3C2510 是一款低功耗、高效能、面向以太网系统的微处理器。它的系统时钟可达 133MHz ,并包含了 16/32 位宽的 ARM940T 核、 4KB 的 I-CACHE 和 4KB 的 D-CACHE 。 S3C2510 带有两个独立的 10/100Mbps 的以太网控制器,这两个接口能够以硬件完成 IEEE802.3 的 MAC 层处理,因此更适合用作 SOHO 路由器、 internet 网关,甚至宽带无线接入设备的开发。 ECOS 操作系统也非常适合这些网络设备的开发,本文将介绍 S3C2510 的移植方案,给各种以 ARM 为内核处理器的 ECOS 底层移植开发提供一个系统的范例。
图 1 ECOS 操作系统结构图
ECOS 底层移植的基础知识
ECOS 系统的主要组成部分如图 1 所示。操作系统的主要功能 及特点是由其内核所决定的,底层移植一般不会涉及到系统内核的内容。由图 1 可见 , 硬件抽象层是嵌入式操作系统和硬件直接接触的基本层,其将系统内核和具体的硬件平台彻底隔离开 , 实现了系统内核与硬件的无关性,这就是操作系统具有良好可移植性的体现。因此,对于开发人员来说,移植操作系统真正的意义和工作在于移植操作系统的硬件抽象层。
硬件抽象层 HAL 对处理器结构和系统硬件平台进行抽象,当要在一个新的目标平台上运行 ECOS 时,只需要对底层的硬件抽象层进行修改,便可迅速地将整个 ECOS 系统移植到新的平台上。硬件抽象层主要包括三大模块 —— 体系结构抽象层 (Architecture HAL) 、变体抽象层 (Variant HAL) 和平台抽象层 (Platform HAL) 。体系结构抽象层主要是指 ECOS 所支持的具有不同体系结构的处理器系列,如 ARM 系列、 PowerPC 系列、 MIPS 系列等等。变体抽象层指的是处理器系列中某款处理器在 Cache 、 MMU 和 FPU 等方面所具有的特殊性。如 S 3C 2510 属于 ARM 系列中的 ARM940T ,在变体抽象层中就会具体地针对 ARM940T 的 Cache 等方面作出定义。平台抽象层则是对当前系统硬件平台的抽象,包括了平台的启动、芯片选择与配置、定时设备、 I/O 寄存器访问以及中断寄存器等等。平台抽象层代码的编写是 ECOS 移植工作的重点。
HAL 移植的主要步骤
建立适当的文件目录
ECOS 本身有一个完整的文件目录,只有把新建的底层文件放在适当的文件目录下面,才能确保配置和编译工作的成功,也有助于利用 ECOS 本身已有的源代码,如结构体系层和变体层中的许多成熟可用的代码。由于本系统中 S 3C 2510 处理器的内核是 ARM940T ,因而可以把 S 3C 2510 的目录建立在 ECOS 库路径 packages/hal/arm/arm9/ 下。
建立 S3C2510 的 cdl 文件
cdl 文件使用 cdl 脚本语言描述该硬件设备 ( 包或平台 ) 的特性和常用指标。 cdl 文件实现系统在源码级的功能和指标配置,犹如一个项目管理高层对其仓库中组件特性的登记,只有登记后的包、组件和选项才能被操作系统配置工具识别和配置。
以下是 S 3C 2510 的 cdl 文件中的几段重要描述。
* cdl_package CYGPKG_ HAL_ARM_ ARM9_S 3C 2510
这是 S 3C 2510 在 ecos.db 中所登记的包的名字,它下面包含了该板的一些基本设置和组件,如母体体系结构 (parent) 、包含的头文件、编译的 C 文件等。
* cdl_component CYG_HAL _STARTUP
系统启动方式,有 3 种选择: ram 启动、 rom 启动、 romram 启动。
* cdl_component CYGNUM_ HAL_CPUCLOCK
平台的系统时钟设置,以便于 ECOS 其他组件以此时钟为标准。该平台系统时钟的默认值设为 133MHz 。
* cdl_option CYGNUM_HAL_ RTC_PERIOD
ECOS 内核的运行时钟单位。 ECOS 内核以一个 tick 为时钟单位,而一个 tick 的长度就等于该选项的设定值。
在 ecos.db 中登记 S3C2510 的硬件包
ecos.db 是关于 ECOS 系统的一个数据库文件 ( 在 packages 目录下 ) ,它包含了硬件包管理工具和一些在组件配置库中的包。与 cdl 文件相比, ecos.db 登记了仓库中的物品,而 cdl 文件则登记每种物品的特性。只有在 ecos.db 中登记了的包,才能被 ECOS 的库编译工具 (configtool) 选中和使用。如果要在配置工具的模板选项中 (template) 增加可供选择的硬件目标板,那么,需要先在 ecos.db 中登记其包描述,再增加其目标板描述。一般的辅助硬件 ( 如网卡、串口等 ) 只需要第一步的登记。因此,在 ecos.db 中登记 S3C2510 平台硬件包的基本步骤就是登记硬件平台的包描述 (package CYGPKG_HAL_ARM_ ARM9_ S 3C 2510) 和目标描述 (target S 3C 2510) 。需要注意的是, target S 3C 2510 中所包含的 3 个硬件描述包 CYGPKG_HAL_ARM 、 CYGPKG_HAL_ARM_ARM9 和 CYGPKG_HAL_ARM_ARM9_ S 3C 2510 是不能缺少的,因为它们是标板的核心 —— 主体系结构包、子体系结构包和主芯片包。另外,还可以可选地添加其他辅助硬件包 ( 如网卡、串口等 ) 。
编写平台抽象层的有关代码
硬件平台层所需编写的代码文件的一般功能如下所示。
* include /plf_cache.h —— 平台专用 cache 处理 ( 可选 ) 。在本系统中不需要编写,可直接调用 ARM9 变体层的 hal_cache.h 。
* include / hal_platform_ints.h —— 平台专用中断处理,定义平台中断向量号。
* include / plf_io.h —— I/O 定义和系统寄存器的宏定义。
* include ?/ hal_platform_setup.h —— 平台启动代码。本文件主要用 ARM 汇编指令编写,实现平台上电后程序的启动和执行。
* src/s 3c 2510_misc.c —— HAL 的底层标准函数,包括时钟平台初始化、时钟延时函数、中断使能、中断屏蔽、中断响应等。
* src/ hal_diag.c —— 硬件抽象层诊断输出函数,包含 ECOS 系统中 printf 打印的硬件设备驱动程序。
* misc/ redboot_primary_ ram.ecm —— 基于 RAM 启动方式的 redboot 最小配置文件。
* misc/redboot_primary_ rom.ecm —— 基于 ROM 启动方式的 redboot 最小配置文件。
硬件启动过程
编写硬件启动的初始化过程是 HAL 移植的一个难点。当硬件重新上电后,系统的程序指针会自动指向地址 0( 通常地址 0 存放着 bootloader 代码段 ) 。在 ECOS 操作系统中,程序首先会运行 vectors.S 文件 ( 该文件存在于 hal/arm/arch/src/ 目录下 ) ,它定义了 reset_vector 、 start 等各种启动标号。接着调用 S 3C 2510 平台层的 hal_platform_ setup.h 文件中的宏 platform_setup1 和 arm9 变体层 arm9_misc.c 文件中的函数 hal_hardware_init 。
hal_platform_setup.h 定义了宏 platform_setup1 以供 vectors.S 调用。该宏定义了目标板上 SDRAM 和 FLASH 的初始化启动,其中包括了它们的取数方式和内存大小。然后根据不同的启动方式执行程序。对于 RAM 启动方式,无需进行程序段与数据段的搬移,系统已认为 SDRAM 的起始地址即为程序的起始地址;对于 ROM 启动方式,需要搬移数据段,而程序段无需搬移;对于 ROMRAM 启动方式,程序段与数据段都需要进行搬移,然后再把程序起始地址映射为 SDRAM 的起始地址。
在程序搬移完成后,系统会进行其他硬件的初始化过程,包括系统时钟、系统 CACHE 、监控串口等基本硬件设备。
内存布局文件编写
平台的内存布局文件在 include/pkgconf 目录下。通常,每个平台包括了 RAM 、 ROM 和 ROMRAM 3 种不同启动方式的内存布局文件集。每种启动方式的内存布局文件集都由 3 个类型的描述文件组成: .h 文件包含内存域的 C 宏定义; .ldi 文件定义内存域和内存段位置的链接脚本文件; .mlt 文件包括由 MLT 工具产生的对内存布局的描述。当需要手动修改内存布局时,只有 .h 和 .ldi 文件可以被修改, .mlt 文件只能由 MLT 工具生成。
下面以 S 3C 2510 的 ram 启动方式内存布局为例,主要说明 mlt_arm_s 3c 2510_ram.h 和 mlt_arm_s 3c 2510_ram.ldi 的程序结构。
由于 S 3C 2510 的开发板有两个 16MB 的 SDRAM ,因而要定义两个内存域 ram1 和 ram2 。系统设置寄存器在初始化时已经把内存段重新映射,因而两个 SDRAM 的基地址就是 0x0 和 0x40000000 ,两个内存域的大小是 16MB ,分配方式都是可读写的内存段。
在 mlt_arm_s 3c 2510_ram.ldi 中分为两大部分。首先是 MEMORY 部分,它定义了在 RAM 启动方式下所需要的内存域,以及该内存域的起始地址和长度。 MEMORY 部分的内容必须与 mlt_arm_s 3c 2510_ ram.h 中定义的宏一致。其次是 SECTIONS 部分,它定义了 RAM 启动方式下所规定的内存段,这些内存段的定义与系统内存管理功能有关。在 SECTION_XXX 后带有相应的参数,这些参数包括了内存段所属的内存域、起始地址 ( 或者是对齐方式 ) 、虚拟内存地址 (VMA) 和加载内存地址 (LMA) 。
以 SECTION_fixed_vectors (ram1, 0x200, LMA_EQ_VMA) 为例,它表示 fixed_vectors 段属于 ram1 内存域,起始地址为 0x200 ,加载内存地址等于虚拟内存地址。 LMA_EQ_VMA 同时也可以解释为该内存段不需要在程序运行后重新分配加载。
调试结果
S3C2510 目标板上带有 1 块 4MB 的 FLASH 和 2 块 16MB 的 SDRAM 。
利用 ECOS 的自带编译工具 configtool 对新建的 S3C2510 目标板进行编译,生成 ECOS 的库文件。然后把库目录下的 install 目录内容复制到应用工程目录下,使 ECOS 库包含到应用工程中。然后把该工程的 .elf 文件利用 EMBEST 公司开发的 IDE 仿真器直接下载到目标板的 SDRAM 中。此时的 ECOS 操作系统应为 RAM 启动方式。
通过 IDE 对程序的调试与测试结果表明,本文提出的 S3C2510 移植方案使 ECOS 操作系统在目标板中运行正常稳定。该操作系统支持多个工作线程的应用程序。 S3C2510 的串口、网口均能与 pc 机正常传输数据。
结语
ECOS 是一款非常年轻的嵌入式操作系统, 1997 年才正式推广使用。现阶段有关 ECOS 开发的参考资料和专门从事人员仍然很少,造成了 ECOS 产品研发周期和开发成本的增加。因此,本文提出的 ECOS 操作系统的驱动底层代码编写方法对于使用 ECOS 开发产品具有相当重要的指导意义。