当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于S3C44BOX的VxWorks BSP设计

摘要  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所列。

    VxWorks映像的启动过程跟Bootrom差不多,重复了某些工作,这是因为VxWorks并不假设VxWorks映像是由Bootrom下载启动的,它有自己的初始化流程。VxWorks启动后,RAM空间的分配情况如图1所示。

3 Vxworks中断管理分析
    VxWoIks中与中断管理密切相关的是两个向量表。异常向量表和中断向量表。

    异常向量表保存着各个异常处理入口地址。通常情况下,它位于LocAL_MEM_LOCAL_ADRS上,也就是SDRAM的起始地址上。异常向量放置在RAM,可以减少异常处理的延迟时间(RAM的读取要比ROM快),还有其他好处,如动态和灵活等。异常向量表的所有异常向量分配如表2所列。

    异常向量表的初始化通过excVecSet()和exc、VecInjt()两个函数完成,excVecSet()设定异常向量表的基地址,然后由excVeCInit()完成向量表的构造工作。当发生异常时,CPU跳转到异常的相应向量地址执行。这里中断也被看作是一种异常,中断经异常向量表才能跳转到中断向量表。

    中断向量表是存放各个中断服务程序入口地址的地方。中断向量表的位置并不是固定的,它是由VxWorks动态分配的,大小与中断源个数有关。中断经异常向量表到达中断向量表后,再根据中断源经中断向量表跳转才能进入中断服务程序。中断向量表的内容是在挂接中断服务程序的时候填充的,这个过程通过调用intConnect()完成。中断发生之后的流程如图2所示。

3.1 S3C4480x的地址空间分配

    S3C44BOX的地址空间分为8个区,分别由8个片选信号控制。地址空间分配如表3所列。

    S3C44BOX上电之后,由0地址取指令开始执行,因此必须接一片Flash在nGCSO上,接一片SDRAM在nGCS6上作为系统内存,这样Flash对应的基地址就是O了。系统上电之后,从Flash中取指令开始执行。S3C44BOX不能进行内存地址重定位操作,也就是每个片选的地址范围是定死的,不能由程序员指定。ARM的异常向量表是放在O地址的,因此必须在Flash中硬编码一个异常向量表,中断经异常向量表后跳转到放在RAM中的中断向量表中。

3.2 S3C4480X与VxWorks的冲突及解决方案

    S3C44BOX的固定地址空间管理方法在VxWorks里会遇到问题。VxWoiks默认ARM的.RAM是从0地址开始的,并把异常向量表放在RAM的起始0地址上,而S3C44BOX的RAM基地址为0x0c000000,0地址上是ROM。VxWorks的RAM基地址是可以在BSP中设定的,即可以通过宏定义LOCAL_MEM_LOCAL_ADRS来设定。但是,这时VxWorks仍会把异常向量表放在0地址上,因为对于ARM体系来说,设定异常向量表基地址的excVecSet()函数是空函数,无法设定异常向量表的位置。这就产生了冲突,解决这个冲突是实现VxWorks在S3C44BOX上移植的关键。从根本上说,这是由于S3C44BOX不具有地址重定位功能造成的。

    硬编码将异常函数人口地址填写在启动Flash开始处,中断经异常向量表后跳转到放在RAM中的中断向量表中。μClinux的这种中断管理方式对冲突的解决工作有启示作用。

    基本思想是在Flash存储器的起始地址硬编码异常入口,在RAM的起始地址仿VxWorks建立异常向量表。中断发生时,经Flash存储器人口,跳转到自定义函数,再跳转到RAM中异常人口,最后进人VxWorks提供的异常处理函数intEnt()。中断处理流程如图3所示。新异常向量表和原VxWorks设计完全一样。


4 VxWorks在S3C4480X上BSP的定制
4.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驱动可以使用。

    到这里,最基本的S3C44BOXBSP已经定制完成,可实现串口通信和网络下载。

结语
    本文给出一种解决S3CA480X与VxWorks中断处理机制冲突的方案,该方案对于向其他一些不具有地址重映射功能的低端处理器上移植VxWorks有一定的参考价值。VxWorks的源代码不公开,风河公司提供的资料也不会涉及代码的实现,因此要了解实现细节只能通过反汇编跟踪,这对VxWorks的移植工作造成了一定的困难。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭