eCos和在ARM上的驱动与应用开发Word文档下载推荐.docx
- 文档编号:20952272
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:24
- 大小:163.61KB
eCos和在ARM上的驱动与应用开发Word文档下载推荐.docx
《eCos和在ARM上的驱动与应用开发Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《eCos和在ARM上的驱动与应用开发Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
RedBoot是一个无内核的系统引导程序,是eCos的一个特殊应用。
RedBoot可以加载eCos应用程序,并提供Debug支持,是开发eCos系统时非常有用的工具。
设备驱动程序负责对硬件设备进行控制和管理,并完成设备数据的读/写操作。
设备驱动程序自身也采用层次结构,上层驱动程序(相当于一个虚设备)可以调用下层驱动程序(物理设备)。
驱动程序为上层软件提供标准的API函数,应用程序可以使用这些API函数对设备进行访问。
eCos包含的网络支持包支持完整的TCP/IP网络协议栈。
eCos还提供了标准库(ANSIC库和数学库)、兼容层(POSIX兼容和uITRON兼容)、文件系统等。
作为一种开放软件,eCos还可以很方便地容纳第三方软件。
1.2
可配置性原理
eCos的一个主要特性就是其可配置特性。
可配置性最终是靠代码中的条件编译来完成的,条件编译是编程语言的特点,并不是eCos的原创。
当一个软件工程中的条件编译项的数目和复杂性达到一定程度时,其中有一些条件编译项就会因为存在逻辑上的依赖关系而使条件编译产生冲突。
而如何发现并有效解决这种冲突才是eCos可配置性的特点,如图2所示,其可配置特性的实现主要由组件定义语言CDL(ComponentDefinitionLanguage)、组件仓库ecos.db、图形配置工具configtool三者共同完成。
图2
可配置机制
(1)组件定义语言CDL
CDL是eCos组件框架中的一个关键部分,eCos所有模块的程序包中都包含一个CDL脚本对该包进行描述并提供配置选项。
以本系统中的串口驱动程序包为例,在该包对应的CDL中定义了一个名为CYGPKG_IO_SERIAL_ARM_AT91的cdl_package。
在这个cdl_package中详细列出了该包的一些属性,如该包必须在工程已经包含了硬件抽象层包CYGPKG_HAL_ARM_AT91和上层串口I/O包CYGPKG_IO_SERIAL的情况下才会被使能。
另外,串口的一些常用特性,如波特率、设备名、缓冲区大小等配置选项也是必不可少的。
在一些复杂的CDL中还会包含对该包中的源程序进行编译时的一些编译选项。
在进行配置的时候,该包还会产生一个包含了各个可配置参数数值的头文件。
当其他包使用由CYGPKG_IO_SERIAL_ARM_AT91包提供的可配置参数时,这个新产生的头文件就会被相关的源文件通过#include语法包含。
(2)组件仓库ecos.db
ecos.db是一个包含了所有可用程序包和配置模版的文本文件。
在该文件中,需要注册所有的CDL包。
在注册时以package关键字提供相应包的名称、CDL脚本文件的文件路径以及对该包的一个简单描述。
在ecos.db中还会以target关键字生成配置模版,从而提供目标平台的一些基本组成结构,使目标平台包括所需要的已经注册了的CDL配置包。
(3)图形配置工具configtool
configtool是利用MFC编写的Windows程序,是eCos可配置性的执行者,也可以理解成是CDL脚本的解释器。
一方面它读取ecos.db文件中的目标平台和已注册的配置包信息,根据配置包的路径找到相应的CDL脚本,然后根据脚本中给出的属性向程序员提供图形化的配置信息;
另一方面,它还可以接受用户的输入,包括单选按钮、复选框、下拉列表、文本输入等。
当用户保存一个配置时,configtool会根据CDL语言的提示生成相应的头文件,也会将指定的头文件从配置包中复制到配置文件所在的工作目录。
无论是生成的头文件还是拷贝的头文件,都会在编译时被源程序所引用。
对于内核源程序,configtool又可以理解成编译器。
当用户的配置选项被保存并且对工程进行编译时,configtool会在后台调用真正的编译器GCC,根据配置包CDL中的编译选项控制GCC对所有需要的内核源文件进行编译并生成库文件和对应的链接脚本。
当然configtool只是对eCos内核进行编译,用户的应用程序只需在编译时和由configtool编译生成的库文件进行链接就可以得到最终的可执行映像文件。
2
eCos内核的移植
2.1内核移植关键
例如系统是一个以ARM7为核心构成的测控系统,通过对传感器的脉冲信号进行处理而得到待测物料的流量,并通过控制给料器的给料速度达到流量控制的目的。
对于一个有实用价值的测控系统,必须具有人机交互、闭环控制、数据通信和存储等功能。
本课题所研制的流量测控系统的硬件框图如图所示。
由于eCos内核采用了可配置的模块化设计思想,因此只要修改硬件抽象层HAL的代码和CDL脚本并且在ecos.db中注册就可以应用于新的目标系统。
HAL又可以细分为3个层次:
①
体系结构抽象层。
eCos是可以应用于多种体系结构平台上的操作系统,如ARM、MIPS、POWERPC等,在eCos发布时已经将这些体系结构层的移植包一同发布了出来。
本系统的体系结构抽象层是ARM7体系结构抽象层。
②
变体抽象层。
对于同一种体系结构的处理器,各生产厂家会有不同的系列和型号(如Atmel的AT91系列、Philips的LPC系列等),虽然它们都采用ARM7体系结构,但是不同的寄存器配置模式和中断处理方法也会影响到eCos的移植。
本系统所使用的处理器AT91M55800使用较为普遍,在eCos开源社区已经有移植好的AT91M55800变体抽象层的代码和CDL脚本,只需作系统启动后对I/O口的赋值情况等少许的改动即可完成对变体抽象层的移植。
③
平台抽象层。
平台抽象层是对目标系统的整个硬件平台进行抽象,包括平台的启动、芯片配置、定时、I/O寄存器及中断寄存等等。
系统需要进行的移植工作主要是平台抽象层的移植,而平台抽象层中最重要的是Flash驱动包和内存布局文件的移植。
主要的步骤为:
①
安装AT91M55800变体抽象层包。
从eCos开源社区下载好的变体抽象层包在一个名为eb55的文件夹中,在这个文件夹中还有cdl、include、src等子文件夹分别包含了CDL脚本、头文件,源文件。
由于eCos的软件包有严格的层次结构,所以在安装软件包时应遵循这一结构以便于维护。
AT91M55800属于ARM7的一个变体,同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的块空间大小以及写操作一般是不一样的。
本系统所用的FlashSST39VF160是2MB的16位NORFlash,共有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_ifCYGPKG_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。
处理器内部集成了8KBSRAM,其起始地址为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文件中的宏,如#defineCYGMEM_REGION_ram
(0x02000000)。
④
在组件仓库ecos.db中为以关键字target添加名为Flow55的新目标平台。
在这个目标平台中还必须用关键字packages包括ARM7体系结构层包和AT91M55800变体抽象层包,同时为了实现调试还必须包括串口驱动包和Flash驱动包及其上层驱动包。
除了这些被包含的软件包外,根据不同的选择configtool还会为目标平台包添加一些默认的包,如内核包、数学库包等。
另外,还应加入一些对该平台的简单描述。
2.2内核的配置
移植完成以后,一个最基本的目标平台就产生了。
在configtool中可以看到Templates菜单的硬件平台列表中新增了Flow55目标平台模版,以default方式打开这个模版。
各个软件包的CDL脚本中都给出了默认的配置值,有些值需要根据具体的应用要求重新配置。
本系统一些重要的配置情况如下:
由于系统线程数量较少(小于10),所以选择效率更高的位图调度器Bitmapscheduler,并将线程数numbersofprioritylevels限定为16,以提高任务切换的速度。
当点击位图调度器的单选按钮时,configtool会检测到一个配置冲突。
由于时间片轮转是默认使能的,而时间片轮转仅仅对应于多级队列调度器,所以出现配置冲突。
Configtool会给出一个推荐的解决冲突的方法,即禁止时间片轮转,按照这个推荐的解决方法可以安全地解决这个冲突。
这个地方可以充分体现出eCos强大的可配置性。
由于配合RedBoot一起使用,所以内核配置为RAM启动方式。
这样,系统上电后程序将由RedBoot复制到RAM中运行,以提高速度。
系统的晶振频率为16MHz,经PLL倍频后为32MHz,所以需将Clockspeed配置为32000000;
RTC是系统的时钟节拍发生器,本系统的时钟节拍时间选为20ms,所以也需要对RTC相关项进行配置。
具体参数为Realtimeclocknumerator配置为2000000000,Realtimeclockdenominator配置为100,Realtimeclockperiod配置为20000。
其余的配置选项使用默认的配置值即可。
完成配置工作后,对内核进行编译可以产生内核库文件和链接脚本以及相关头文件。
这些生成的文件再同应用程序一起编译、链接,生成最终的可执行映像文件。
二、eCos设备驱动程序
1.驱动结构介绍
应用程序在使用设备的时候,它通过驱动程序的用户API访问设备驱动程序,而设备驱动程序通过设备内核API与内核和硬件抽象层HAL进行交互,设备驱动程序和内核再通过HAL对硬件平台进行操作,从而实现对设备的访问。
设备驱动程序一般可分为三个部分,分别为设备表入口DEVTAB_ENTRY、设备I/O函数表DEVIO_TAB和设备I/O函数。
设备驱动程序的主要组成模块全部定义在头文件cyg/io/devtab.h中。
ecos中的所有设备驱动程序都使用设备表入口来进行描述。
设备表入口是一个具有cyg_devtab_ebtry_t类型的数据结构,使用宏DEVTAB_ENTRY()可以生成一个设备表入口,其格式为:
DEVTAB_ENTRY(l,name,dep_name,handlers,init,lookup,priv)
其中:
l:
该设备表入口的"
C"
标识符。
name:
该设备的"
字符串名字。
dep_name:
对于一个层次设备,些参娄是该设备的下层设备的"
handles:
I/O函数句柄指针(见下面的设备I/O函数表DEVIO_TAB的详细说明)。
init:
当ecos处于初始化阶段时被调用的函数,该函数可以进行查找设备、对硬件进行设置等操作。
lookup:
当调用cyg_io_lookup()函数对该设备进行操作时所调用的一个函数。
priv:
该设备驱动程序所需要的专用数据存放位置。
上而所定义的设备表入口只适用于字符设备。
对于块设备,要使用宏BLOCK_DEVTAB_ENTRY进行定义。
其格式为:
BLOCK_DEVTAB_ENTRY(l,name,dep_name,handlers,init,lookup,priv)
设备表入口中的句柄handles提供了一级设备驱动程序接口函数。
handlers是设备I/O函数表DEVIO_TAB的指针,DEVIO_TAB包含了一组函数的指针,这些函数是各种接口函数cyg_io_XXX()的具体实现。
设备I/O函数表通过DEVIO_TAB宏来定义,其格式如下:
DEVIO_TABLE(l,write,read,get_config,set_config)
l:
该表的"
write:
cyg_io_write()函数所调用的函数,实现向设备传送数据。
read:
cyg_io_read()函数所调用的函数,实现从设备读取数据。
get_config:
cyg_io_get_config()函数所调用的函数,实现对设备配置信息的读取操作。
set_config:
cyg_io_set_config()函数所调用的函数,完成对设备的配置操作。
在ecos的初始化引导过程中,对系统中的所有设备都要调用其相应的init()函数。
init()函数有可能返回错误,出现这种情况时,设备将处于"
离线"
状态,所有针对离线设备的I/O请求都将返回错误。
当使用某个设备的名字调用cyg_io_lookup()函数时,该设备的设备表入口中指定的lookup()将被调用。
lookup()函数将使设备处于"
在线"
状态,处于在线状态下的设备对所有针对该项设备的I/O请求进行处理。
关于设备入口表DEVTAB_ENTRY:
在eCos中,是通过给指定的设备定义DEVTAB_ENTRY,来达到对设备的注册过程的。
DEVTAB_ENTRY是一个宏定义,定义在ecos/packages/io/common/current/include/devtab.h中,
如下:
#defineDEVTAB_ENTRY(_l,_name,_dep_name,_handlers,_init,_lookup,_priv)\
CHAR_DEVTAB_ENTRY(_l,_name,_dep_name,_handlers,_init,_lookup,_priv)
默认下使用DEVTAB_ENTRY定义的是字符设备,这里就以一个字符设备为例进行说明了,
CHAR_DEVTAB_ENTRY的定义在同一个文件当中:
#defineCHAR_DEVTAB_ENTRY(_l,_name,_dep_name,_handlers,_init,_lookup,_priv)
cyg_devtab_entry_t_lCYG_HAL_TABLE_ENTRY(devtab)={
_name,
_dep_name,
_handlers,
_init,
_lookup,
_priv,
CYG_DEVTAB_STATUS_CHAR
};
就是定义一个cyg_devtab_entry_t结构的变量,需要注意的是CYG_HAL_TABLE_ENTRY,它其实是将定义的
变量_l放到指定的数据段中,看看它的定义,在
ecos/packages/hal/common/current/include/hal_tables.h文件中:
#defineCYG_HAL_TABLE_ENTRY(_name)
CYGBLD_ATTRIB_SECTION("
.ecos.table."
__xstring(_name)"
.data."
)
CYGBLD_ATTRIB_USED
其中CYGBLD_ATTRIB_SECTION和CYGBLD_ATTRIB_USED的定义,在文件
ecos/packages/infra/current/include/cyg_type.h中:
#defineCYGBLD_ATTRIB_SECTION(__sect__)__attribute__((section(__sect__)))
#defineCYGBLD_ATTRIB_USED__attribute__((unused))
现在将CYG_HAL_TABLE_ENTRY(devtab)展开就是:
__atrribute__((section("
.ecos.table.devtab.data."
)))__attribute__((unused))
也就是将所有的设备表入口放到.ecos.table.devtab.data.数据段中,有关__attribute__的可以参考
GNU手册中的说明。
可以看出这和linux中的_init的使用是相同的,后面的__attribute__((unused))启
动作用就是在编译时防止出现“变量未使用”警告的出现。
系统访问的时候,并不直接使用设备表入口的名称_l,而是通过两个指针来操
作.ecos.table.devtab.data.数据段,分别是__DEVTAB__和__DEVTAB_END__,这两个指针定义在
ecos/packages/io/common/current/src/ioinit.cxx中:
CYG_HAL_TABLE_BEGIN( __DEVTAB__,devtab);
CYG_HAL_TABLE_END(__DEVTAB_END__,devtab);
CYG_HAL_TABLE_BEGIN和CYG_HAL_TABLE_END的定义在
ecos/p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eCos ARM 驱动 应用 开发