基于TMS320 LF2407A在CAN总线上的应用研究(2)
2012-08-20 22:19
5 软件系统的设计?
本文采用的是由Jean J.Labrosse编写的开放式实时操作系统uC/OS-II,主要是基于以下的考虑:(1)它的内核是完全免费的。用户不需支付任何费用,有利于降低系统开发成本。(2)它的源代码是公开的,并且仍在不断的升级,增加新功能。源代码的开放可以使得用户根据实际要求对源代码进行取舍,去掉不必要的变量和不使用的函数,提高系统性能。另外,由于对系统内核有源代码级的了解,用户可以添加自己的模块,与原有系统内核兼容,使得系统具有可扩展性。(3)系统内核实用性强、可靠性高。从最老版本的uCOS,以及后来的uC/OS,到最新版本的uC/OS-II,该实时内核已经走过了近10年的历程。10年来,世界上已有数千人在各个领域使用了该实时内核,如医疗器械、网络设备、自动提款机、工业机器人等等。这些应用的实践是该内核实用性、无误性的最好证据。(4)操作系统内核对处理器以及ROM, RAM资源的要求不高,有利于在8位处理器上的移植。(5)它可以为嵌入式TCP/IP协议需要提供对多用户的支持。?
5.1 操作系统uC/OS-II在TMS320LF2407A的移植?
虽然uC/OS-II大部分的代码是用C语言写的,但仍需要用汇编语言写一些与处理器相关的代码,这是因为uC/OS-II在读写处理器、寄存器时只能通过汇编语言来实现。 ?
5.2 移植工作介绍?
uC/OS-II的移植工作主要就是修改C语言头文件OS_CPU.H.C语言源文件OS_CPU-C.C和汇编语言文件OS_CPU_A.ASM。?
①移植头文件OS_CPU.H。?
为了确保其可移植性uC/ OS- II不使用C语言中的short;int;long等与编译器相关的数据类型,而是定义了一系列可移植又很直观的数据类型如:INT8U,INT16S,INT328等这部分工作在C语言头文件OS_CPU.H中实现。应该指出的是,虽然在移植过程中将uC/ OS- II数据类型BOOLEAN,INT8U,INT8S分别定义为unsigned char和signed char类型,但是由于TMS320LF2407A内核与数据总线宽度都是16bit,所以这几种类型的数据实际上都要占用一个16bit字的内存。头文件OS_CPL.H另一个主要内容是定义用于临界段代码保护的两个宏OS_INTER_CRITICAL()和OS EXITCRITICAL().?
②移植汇编文件OS_CPU_A.ASM。? OS_CPU_A.ASM文件中包括有四个函数都涉及对寄存器的处理,其跟处理器有关,由于不同的处理器有不同的寄存器,所以操作系统在这个文件里给用户留下四个函数接口,以便用户根据所选处理器编写相应的程序以完成固定的功能.四个函数分别是OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR()。?
③OSStartHighRdy()函数的实现。?
OSStartHighRdy()函数是一个高优先级就绪任务启动函数,主要是将任务栈中的保存值弹回到CPU寄存器中,然后执行返回指令,中断返回指令强制执行该任务代码,实现多任务启动。 ?
④OSCTxSw()和OSIntCtxSw()函数的实现。?
OSCtxSw()和OSIntCtxSw()都是任务切换函数,不同的是后者为中断级任务切换函数,由于后者是在ISR中被调用的,所以需要调整堆栈指针SP去掉在调用OSIntExit(),OSIntCtxSw()过程中压入堆栈的多余内容。它们的主要功能是将要挂起的任务的寄存器值保存起来,将要执行的任务的寄存器的内容恢复。?
OSCtxSw()该函数完成的是任务级的任务切换工作。其目的是为了保证处理器永远运行就绪表中优先级最高的任务,这跟OSStartHighRdy()类似。然而,后者是由OSStart()调用的,只是执行启动多任务的功能,而OSCTxSw()是在任务调度函数OSSched()通过宏定义OS TASKse SW()调用的,执行的是多任务的调度功能:不仅要使得高优先级任务得以恢复运行,还得将待切换出去的任务保存起来,两者的差别也可以从程序的处理过程比较出来。?
⑤OSTickISR()函数的实现。?
OSTickISR()是用定时器1产生一个周期为25毫秒的时钟源提供给uC/OS-II,这是uC/OS-II时间延迟和超时功能的时间基准。OSTickISR()是该定时器周期中断的中断服务程序。它主要有两个功能:一个是调用OSTimeTick()函数,计算自系统上电以来所经历的时钟节拍数,并将每个处延时等待状态的任务的OSTCSDly项减1:另一个是调用。OSIntEXit()函数察看是否有更高优先级的任务因时钟节拍到来而延迟时间并进入就绪态,如果有则进行中断级的任务切换。另外,在该函数的入口处要将OSIntNesting加1;在出口处将OSIntNesting减1。?
基于TMS320 LF2407A在CAN总线上的应用研究(2).doc
将本文的Word文档下载到电脑
下载失败或者文档不完整,请联系客服人员解决!