新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于eCos在基于ARM7硬件平台上的应用

基于eCos在基于ARM7硬件平台上的应用

作者:时间:2010-07-27来源:网络收藏

  3 在系统上的移植与软件编写

  3.1 内核的移植

  由于内核采用了可配置的模块化设计思想,因此只要修改抽象层HAL的代码和CDL脚本并且在ecos.db中注册就可以于新的目标系统。HAL又可以细分为3个层次: ① 体系结构抽象层。eCos是可以于多种体系结构上的操作系统,如ARM、MIPS、POWERPC等,在eCos发布时已经将这些体系结构层的移植包一同发布了出来。本系统的体系结构抽象层是体系结构抽象层。② 变体抽象层。对于同一种体系结构的处理器,各生产厂家会有不同的系列和型号(如Atmel的AT91系列、Philips的LPC系列等),虽然它们都采用体系结构,但是不同的寄存器配置模式和中断处理方法也会影响到eCos的移植。本系统所使用的处理器AT91M55800使用较为普遍,在eCos开源社区已经有移植好的AT91M55800变体抽象层的代码和CDL脚本,只需作系统启动后对I/O口的赋值情况等少许的改动即可完成对变体抽象层的移植。③ 抽象层。抽象层是对目标系统的整个平台进行抽象,包括平台的启动、芯片配置、定时、I/O寄存器及中断寄存等等。

移植工作主要是平台抽象层的移植,而平台抽象层中最重要的是Flash驱动包和内存布局文件的移植。主要的步骤为:

  ① 安装AT91M55800变体抽象层包。从eCos开源社区下载好的变体抽象层包在一个名为eb55的文件夹中,在这个文件夹中还有cdl、include、src等子文件夹分别包含了CDL脚本、头文件,源文件。由于eCos的软件包有严格的层次结构,所以在安装软件包时应遵循这一结构以便于维护。AT91M55800属于的一个变体,同AT91系列的其他CPU处于同一层次,所以变体抽象层软件包文件夹eb55的具体路径应为/hal/arm/at91/eb55。接下来还应在ecos.db中注册变体抽象层包,以package关键字注册名为CYGPKG_HAL_ARM_AT91_EB55的包,这个名字必须和包中CDL文件hal_arm_at91_eb55.cdl中的所定义的包名完全一致。在包名后面的花括号中登记hal_arm_at91_eb55.cdl文件的路径及文件名,以及对该包的简单文字说明。

  ② 编写Flash的底层驱动软件包,以便能够操作目标系统的Flash存储器。由于本系统在前期调试和代码固化时利用了RedBoot,而RedBoot通过Flash驱动程序操作目标Flash,所以必须先移植好Flash驱动程序才能进行更进一步的开发工作。

  首先需要编写底层驱动程序源文件。不同的Flash的块空间大小以及写操作一般是不一样的。本系统所用的Flash SST39VF160是2 MB的16位NOR Flash,共有512(0x200)个块空间,其块大小为4K(0x1000),写操作的命令码符合JEDEC标准。这些特点与Atmel公司AT49系列Flash比较类似,因此Flash驱动程序可以从eCos发布时自带的AT49系列Flash的驱动程序修改得到。最重要的地方是修改描述Flash特性的结构体flash_dev_info_t变量中成员block_size和block_count的值,使其分别为0x1000和0x200。

  接下来需要编写与Flash底层驱动对应CDL脚本,使配置工具configtool能够正确配置编译Flash驱动程序。这个CDL文件完全可以参照AT49驱动包中的CDL文件编写。以cdl_package关键字定义名为CYGPKG_DEVS_Flash_SST_39VF160的包,在命令体中给出具体的配置参数。由于底层驱动包必须结合上层驱动才能工作,所以在命令体中用active_if CYGPKG_IO_Flash命令告诉configtool,必须在上层驱动包CYGPKG_IO_Flash已经被包含的情况下底层驱动包才会使能。

  最后,需要在ecos.db中注册底层驱动软件包。具体做法和变体抽象层包的注册方法相同。

  ③ 修改内存布局文件,使configtool能够正确定位程序在系统存储器中的位置。eCos提供3种不同的运行方式,即ROM方式、RAM方式、ROMRAM方式。每种模式都有两个相应的布局文件,如RAM方式的mlt_arm_at91_eb55_ram.ldi和mlt_arm_at91_eb55_ram.h。*.ldi和常见的ARM开发环境ADS中scattered链接方式下的*.scf文件的作用类似,即用来对不同段分别指定不同的链接地址。在*.ldi中需要修改MEMORY和SECTI*两部分。对于代码在RAM中运行的内核及应用程序,需要根据系统RAM的实际情况修改内存布局文件中相关参数的值。本系统具有1 MB的RAM,但有一半用来存放测量数据,根据系统实际的情况,其起始地址为0x02000000,大小为0x80000,所以这个内存块定义为ram: RIGIN=0x02000000, LENGTH=0x80000。处理器内部集成了8 KB SRAM,其起始地址为0,大小为0x2000,所以这个内存块定义为sram: RIGIN=0x00000000,LENGTH=0x2000。这样系统的MEMORY部分就由名为ram和sram的两个内存块构成。系统比较重要的两处SECTI*部分的修改为SECTION_fixed_vectors (sram, 0x20, LMA_EQ_VMA) 和SECTION_rom_vectors (ram, 0x02008000, LMA_EQ_VMA),第一处表示fixed_vectors段分配在从0x20开始的sram中,且LMA_EQ_VMA指定其加载地址等于虚拟地址。由于RedBoot运行时需要占用从0x02000000开始的一定空间的RAM,所以第二处使程序代码从0x02008000开始的ram中运行。*.ldi文件修改完毕后需要相应地修改*.h文件中的宏,如#define CYGMEM_REGION_ram (0x02000000)。



评论


相关推荐

技术专区

关闭