中国·芯片交易在线
首页 | 供应信息 | 求购信息 | 库存查询 | 新闻中心 | 展会资讯 | IC厂商 | 技术资料 | 自由区域
   新闻首页 |  行业动态 | 新品发布 | 政策法规 | 科技成果 | 模拟技术 | 嵌入系统 | 传感控制 | 存储设计  
当前位置:IC72首页>> IC新闻中心>> 嵌入系统 >>电子行业新闻正文

嵌入式系统µC/OS-II在LPC2119上的移植方法和技巧

时间:2006/10/11 9:03:00  作者:  来源:ic72  浏览人数:1472
 
 

      摘要:本文在分析实时嵌入式系统mC/OS-II和LPC2119芯片的基础上,对mC/OS-II向处理器上移植前需要了解的知识和需要做的前期准备工作进行了分析和讨论,最后给出了移植的具体工作。论文着重分析了mC/OS-II的移植。

      µC/OS-II是一个完整的,可移植、可固化、可裁减的占先式实时多任务内核,它功能强大,支持56个用户任务,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。公开源代码,程序可读性强、移植性好,同时可免费获得。

      LPC2119是由PHILIPS生产的一款32位ARM7TDMI-S微处理器,其核心为高性能的32位RISC体系结构,并具有高密度的16位指令集和极低的功耗。具有零等待128K字节的片内FLASH,16K的SRAM,无需扩展存储器,使系统更为简单、可靠。

ic72 嵌入系统
表1

      本文主要讨论µC/OS-II在LPC2119上的移植,同时对移植前需要掌握的基本知识进行了分析,特别是对与移植密切相关的三个文件进行了详细分析,还对用到的芯片的重映射概念进行了详细说明。

      LPC2119简介

      LPC2119片上资源除了上面介绍的存储器外,还有2个UART、高速I2C接口、2个SPI接口、6路输出的PWM单元、4路10位AD转换器、2个32位定时器、2个CAN通道、实时时钟及看门狗等,通过片内PLL可实现最大为60MHz的CPU操作频率。
                        
      由于下文启动代码的编写要用到重映射(remap)的概念,LPC2119以及其它系列的芯片如AT91等也都有重映射的功能,所以在此加以说明对其它ARM芯片的学习具有借鉴作用。

      在ARM芯片的存储器中,异常向量表如表1所示。

      当系统上电后,程序将自动从0地址处开始执行,因此在系统的初始状态,要求0地址处的存储器是非易性的ROM或Flash等。但是ROM或Flash的访问速度相对较慢,每次中断发生后,都要从读取ROM或Flash上的向量表开始,影响了中断响应速度。因此,LPC2119提供一种灵活的地址重映射方法,该方法可以将内部RAM的地址重新映射到0x0的位置。在系统执行重映射命令之前,需要将Flash中的中断向量代码拷贝到内部RAM中。这样在重映射命令执行之后相当于从内部RAM中0x0的位置找到中断向量,而实际上是将RAM的起始地址0x40000000映射为0x0了。这样,中断执行时相当于在RAM中找到对应中断向量,实现异常处理调试。

      µC/OS-II的介绍

      µC/OS-II实际上是一个嵌入式操作系统内核,内核提供的基本服务就是任务切换。在µC/OS-II中,为每个任务分配专门的堆栈空间。µC/OS-II进行任务切换的时候,会把当前任务的CPU寄存器放到此任务的堆栈中,然后再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是µC/OS-II多任务调度的基础。

ic72 嵌入系统

图1  µC/OS-II硬件和软件体系结构

      µC/OS-II的结构如图1所示。

      如图1所示,与处理器相关的代码只有三个文件,一般移植的时候只要修改这三个文件就可以了。

      编写启动代码

      启动代码是芯片复位后进入C语言的main()函数前执行的一段代码,主要是为运行C语言程序提供基本运行环境,如初始化外围部件、存储器系统等。因此启动代码的功能有些类似PC机中的BIOS和VxWorks中的Bootloader。由于飞利浦未提供该芯片的启动代码,所以需要自己编写启动代码。

      启动代码可以划分为五个文件:Startup.s、IRQ.s、stack.s、heap.s和target.c。Startup.s包含了前面提到的异常向量表和系统初始化代码,一般无需改动;IRQ.s包含中断服务程序与C程序的接口代码,可根据实际使用的中断情况进行少量修改;stack.s和heap.s保存C语言使用的堆和栈的开始位置;target.c包含目标板特殊的代码,包括异常处理程序和目标板初始化程序,可根据程序的需要修改。

ic72 嵌入系统
图2  系统基本初始化Tar get Peset1 ni t()流程图

      由于启动代码的编写很长,而本文只是想指出编写启动代码是移植前必须做的准备工作并对其进行简要说明,因此在这里就不具体列出所有代码(具体的启动代码见参考文献[1]),而给出一个很重要的目标板初始化程序中的函数TargetResetInit()的流程图,从中可以看出在进入main()函数前对系统进行的基本初始化工作的具体步骤。

      移植

      有了上面的知识和编写启动代码这项准备工作完成后,就可以进入具体移植阶段了。主要完成以下工作:
      ① 为了增强代码的可移植性,所有C文件添加头文件includes.h。
      ② 用户程序添加config.h。
      ③ 在文件OS_CPU.H中需要添加或修改的主要代码有:
      定义不依赖于编译器的数据类型:
typedef unsigned char   INT8U;
typedef unsigned short  INT16U;
typedef unsigned int    INT32U;
typedef INT32U       OS_STK;
���
      使用软中断SWI作底层接口:
__swi(0x00) void OS_TASK_SW(void);          /*  任务级任务切换函数  */
__swi(0x01) void _OSStartHighRdy(void);        /*  运行优先级最高的任务 */
__swi(0x02) void OS_ENTER_CRITICAL(void);   /*关中断 */
__swi(0x03) void OS_EXIT_CRITICAL(void);     /*  开中断 */
���
__swi(0x80) void ChangeToSYSMode(void);      /*  任务切换到系统模式 */
__swi(0x81) void ChangeToUSRMode(void);     /* 任务切换到用户模式 */
   #define OS_STK_GROWTH    1          /* 堆栈是从上往下长的*/
  定义工作模式:
#define     USR32Mode       0x10             /* 用户模式 */
#define     SYS32Mode       0x1f              /*  系统模式*/
#define     NoInt            0x80
#ifndef     USER_USING_MODE
#define   USER_USING_MODE  USR32Mode   /*  任务缺省模式*/
#endif
  定义开关信号量:    extern  OS_STK  OsEnterSum
④ 在文件OS_CPU_C.C中需要添加或修改的代码:
  OS_ENTER_CRITICAL()代码
__asm
 {    MRS     R0, SPSR
      ORR     R0, R0, #NoInt
      MSR     SPSR_c, R0
 }
 OsEnterSum++;
   OS_EXIT_CRITICAL()代码
if (--OsEnterSum == 0)
 {  __asm
     {    MRS     R0, SPSR
          BIC     R0, R0, #NoInt
          MSR     SPSR_c, R0
       }
  }
   编写任务堆栈的初始化代码:
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{  OS_STK  *stk;
opt  = opt;              /* 'opt'  没有使用。作用是避免编译器警告 */
    stk  = ptos;      /* 获取堆栈指针*/
                         /* 建立任务环境,使用满递减堆栈 */
    *stk = (OS_STK) task;     /* pc */
    *--stk = (OS_STK) task;    /* lr */
    *--stk = 0;                       /* r12 */
     ��                              /*r11�r2*/
    *--stk = 0;                /* r1 */
    *--stk = (unsigned int) pdata;            /* r0,第一个参数使用R0传递 */
    *--stk = (USER_USING_MODE|0x00);   /* spsr,允许 IRQ, FIQ 中断 */
    *--stk = 0;                           /* 关中断计数器OsEnterSum; */
    return (stk);
}
   编写如void OSInitHookBegin ( )、void OSInitHookEnd ( )、void OSTaskCreateHook ( )、void OSTaskDelHook ( )等钩子函数,用户可根据需要自行添加代码。
⑤ 在文件OS_CPU_A.S中需要添加或修改的代码:
   编写运行优先级最高的就绪任务函数OSStartHighRdy()调用的__OSStartHighRdy代码
__OSStartHighRdy
        MSR     CPSR_c, #(NoInt | SYS32Mode)
        LDR     R4, =OSRunning
        MOV     R5, #1
        STRB    R5, [R4]
 BL      OSTaskSwHook                   
 LDR     R6, =OSTCBHighRdy
        LDR     R6, [R6]
        B       OSIntCtxSw_1
   编写OSIntCtxSw代码
由于篇幅所限,这里给出OSIntCtxSw函数原型,可由此编写代码。源代码详见参考文献[1]。
void OSIntCtxSw(void)

 调用用户定义的OSTaskSwHook();
OSTCBCur=OSTCBHighRdy;
OSPrioCur=OSPrioHighRdy;
得到需要恢复的任务的堆栈指针;
堆栈指针=OSTCBHighRdy->OSTCBStkPtr;
将所有处理器寄存器从新任务的堆栈中恢复出来;
执行中断返回指令;
}
      由于篇幅所限,以上给出了移植时需要修改的与处理器相关的三个文件中的主要代码,当然更详细的移植说明可见参考文献[1].为了验证移植成功与否,你可以编写一个简单用户程序(例如通过串口通讯在PC界面显示字符)与mC/OS-II一起编译烧写进芯片来检验,笔者已经试验成功。

      需要避免的错误

      用户程序中的includes.h要修改为config.h,这是因为后者包含了前者和特定的头文件以及配置项。

      数据类型的定义不能直接使用C中的short、int、long等,因为它们与处理器类型有关,隐含着不可移植性,所以在OS_CPU.H中定义移植性强的不依赖于编译器的数据类型。

      必须定义堆栈的生长方向,1表示堆栈从上往下长,0表示堆栈从下往上长,ARM处理器两种方式都支持,但使用的ADS编译器仅支持从上往下长的方式,因此必须定义为1,否则⑸拇嫫髦等胝淮砦蟆?/P>

      注意任务堆栈初始化函数中的stk指针定义成INT32U,这是因为我们的处理器是32位的,对堆栈操作也是4字节对齐的。如果处理器是16位的,且对堆栈访问也是2字节对齐的,就要将stk定义成INT16U,否则将会发生严重错误。

      结语

      µC/OS-II具有很好的可靠性、实时性和可裁减性,很适合于工业控制、通信等对实时性、可靠性要求高的领域。笔者采用广州周立功公司的EASYARN2100试验开发板,已经成功把µC/OS-II移植到该开发板上。如果用户对ARM处理器及相关底层硬件和µC/OS-II有一定了解,参照本文,对将µC/OS-II移植到LPC21xx系列ARM处理器上大有帮助。

 
【相关文章】
·基于S3C44B0与uClinux构建web服务器
·嵌入式系统µC/OS-II在LPC2119上的移植方法和技巧
·基于DSP+FPGA嵌入式结构的便携数字存储示波表设计
·基于uITRON操作系统的嵌入式GUI设计
 
 
IC新闻搜索
 
热点新闻
基于红外超声光电编码器的室内移动小车定位系
基于闪烁存储器的TMS320VC5409DSP并行引导装载方法
非移动市场需求飙升,ARM预计2010年出货量超50亿片
一种快速响应的电容式湿度传感器感湿薄膜设计
利用特殊应用模拟开关改进便携式设计
无线传感器网络跨层通信协议的设计
基于ARM9内核Processor对外部NAND FLASH的控制实现
基于GSM技术的汽车防盗系统的设计
热电阻在烟叶初烤炕房温度控制中的应用
高速数据转换系统对时钟和数据传输的性能要求
友情连接
 关于我们  IC论坛  意见反馈  设置首页  广告服务  用户帮助  联系我们
copyright:(1998-2005) IC72 中国·芯片交易在线
(北京)联系电话:(010)82614113、82614123 传真:(010)82614123 客户服务:service@IC72.com 库存上载:IC72@IC72.com
在线MSN咨询:ic72sale8@hotmail.com 通信地址:北京市西城区西直门内大街2号大厦15层 邮政编码:100013
(深圳)联系方式: 在线MSN咨询:ic72sale6@hotmail.com 在线QQ咨询:191232636 通信地址:深圳市福田区振华路
注 册 号: 1101081318959(1-1)

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9