摘要 S3C44BOX固定的中断管理模式与VxWorks的异常处理机制存在着冲突。本文分析VxWorks的异常处理机制后,提出一种解决方案,实现VxWorks在S3C44BOX上的BSP定制。该方案保留VxWorks原有的中断处理机制,从而保证VxWorks移植后的稳定性和可靠性。
关键词 VxWorks S3C44BoX BSP 中断处理机制
引 言
VxWorks是现在所有独立于处理器的实时系统中最具特色的操作系统之一。它支持的CPU包括:PowerPC、x86、MIPS、ARM等,其微内核Wind具有任务问切换时间短、中断延迟小、网络流量大等特点,是一个具有较高性能的标准嵌入式实时操作系统。此外,VxWorks操作系统还具有较好的可裁减性和易于移植等特点。
S3C44BOX是韩国Samsung公司出品的一款ARM(Advanced RISC Machines)微控制器,CPU核心为ARM7TDMI。S3C44BOX具有非常丰富的外围资源,集成LCD控制器、12C总线控制器、I2S总线控制器、2个串口控制器、2个通用DMA(Direct Memory Access)控制器、8个10位ADC(Analog to Digital Converter)通道、71个通用I/O引脚等,大大减少了系统成本,是各种学习板和开发板的首选ARM芯片。
1 BSP概念
BSP(Board Support Packet,板级支持包)是介于底层硬件和上层软件之间的底层软件开发包,它的主要功能为屏蔽硬件,提供操作系统的驱动及硬件的驱动,具体功能包括:
◆目标机硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持;
◆为操作系统提供设备驱动程序和系统中断服务程序;
◆定制操作系统的功能,为软件系统提供一个实时多任务的运行环境。
2 VxWorks启动流程
VxWorks的启动涉及到两个映像文件:Bootrom映像和VxWorks映像,其中每一类又可以再细分为压缩、非压缩、驻留ROM和非驻留ROM类型的映像。不同的映像对应的启动流程也有所不同,但它们的基本流程是相同的,如表1所列。
选择BSP模板
主要根据开发板CPU确定BSP模板,要考虑字节序(1ittle_endian)和ARM核心版本(ARM7)。wrSbcArm7针对三星KS32C50100(S3C4510B)开发板而设计,它的ARM核心也是ARM7TDMI,因此选择wrSbcArm7作为S3C44BOX BSP模板。
在“target\config\”下,建立自己的BSP目录,将原all目录文件复制到allS3C44BOX。将原wrSbcArm7目录下的文件复制到bspS3C44BOX。同时为了精简,去掉一些不用的文件,包括flashMem.c、sngks32cEnd.c等。
4.2中断处理的实现
romlnit.s文件是系统上电后执行的第一个程序,它由ARM汇编写成,并放在Flash的起始空间上。基于上面的中断处理讨论,应在这里建一个异常向量表。代码如下:
/*在Flash存储器的开始处添加硬件中断入口*/
rotnTn;t.
B cold /*上电复位后执行的第1条指令,也可看作是复位向量*/
B Undef
B Swi
B Pabort
B Dabort
B .
B Irq
B .
/*Irq函数定义,其他Undef、Swi等几个函数也做类似定义*/
Irq:
SUB sp,sp,#4
STMFD sp!,{r1)
LDR rl·veelrq /*装载中断向量到寄存器R1*/
STR rl,[sp,#4]
/*把寄存器R1的内容压入堆栈*/
LDMFD sp!,{rl,pc)
/*从堆栈弹出寄存器R1和PC(即跳转到中断服务程序)*/
/*Irq指向RAM中的位置*/
vecIrq:
.10ng VEC_BASE_ADRS+0x18
#define VEC_BASE_ADRS 0x0C000000
/*RAM的起始地址*/
接着就需要在RAM中建立自己的异常向量表。在excVecInit()后面加入建立自己的异常向量表函数,其代码如下:
/*在真正RAM空间建立异常向量表,和VxWorks建立的向量表相同,只是位置不同*/
extern void excEnterUndef(void);
/*ARM体系的VxWorks异常人口函数*/
extern void excEnterSwi(void);
extern void excEnterPrefetchAbort(void);
extern void excEnterDataAbort(void):
extern void intEnt(void);
typedef struet {
UINT32 vector;
VOIDFUNCPTR func;
}exc_tbl_t;
#define SYS_EXC_NUM 5
LOCAL exc_tbLt_sysExcTbl[SYS_EXC_NUM]={
/*定义异常向量表*/
{VEC_BASE_ADRS+0x04,excEnterUndef),
{VEC_BASE_ADRS+Ox08, exeEnterSwi),
{VEC_BASE_ADRS+0xoc, excEnterPrefetchAbort),
{VEC_BASE_ADRS+OxlO, excEnterDataAbort),
{VEC_BASE_ADRS+0x18, intEnt}
};
/*初始化RAM中的异常向量表*/
void sysExcTblSet(void){
inti;
for(i=0;i<SYS_EXC_NUM;++1){
/*安装向量表*/
/*使用原始机器码0xe59ffof4.等同于“ldr pc.pc+0xfc”*/
*(uINT32*)(sysExcTbl[i].vector)=(UINT32)
0xe59ffof4;
*(UINT32*)(sysExcTbl[i].vector+Oxfe)=(UINT32)(sysExcTbl[i].func);
}
}
通过上述程序,就把异常向量和VxWorks的对应处理函数关联起来了。
4.3时钟及驱动
系统时钟是操作系统运行的基础,VxWorks需要一个10~100 Hz时钟滴答,默认采用60Hz。时钟中断挂接的中断处理函数为sysClkInt(),它调用VxWorks实际处理时钟中断的函数usrClock()。跟时钟相关的还有连接、使能和禁止函数,它们都与定时器有关,请参考S3C44BOX的使用手册。
串口驱动的实现在sngks32cSio.c中,需要根据寄存器定义变化作相应修改。
主要涉及到初始化函数、接收函数、发送函数和启动发送函数。
笔者采用网卡芯片兼容NE2000,有现成的ne2000End驱动可以使用。
到这里,最基本的S3C44BOX的BSP已经定制完成,可实现串口通信和网络下载。
结语
本文给出一种解决S3CA480X与VxWorks中断处理机制冲突的方案,该方案对于向其他一些不具有地址重映射功能的低端处理器上移植VxWorks有一定的参考价值。VxWorks的源代码不公开,风河公司提供的资料也不会涉及代码的实现,因此要了解实现细节只能通过反汇编跟踪,这对VxWorks的移植工作造成了一定的困难。