论文部分内容阅读
摘 要:介绍了以DSP(TMS320F2407A)和收发器SN65HVD230D为主体所构成的控制模块在CAN总线上的应用。详细分析了实时操作系统uC/OS-II在DSP中的移植,从而提高系统的实时性和软件的运行效率。
关键词:CAN总线;TMS320F2407A;接口技术;uC/OS-II,嵌入式操作系统
中图分类号:TP202文献标识码:A文章编号:1672-3198(2008)04-0224-03
1 引言
CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。CAN是一种多种方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出任何错误。 由于CAN总线具有很高的实时性能,因此,CAN已经在汽车工业、航空工业、工业控制、安全防护等领域中得到了广泛应用。
TMS320LF2407A是美国TI公司生产的一种定点DSP芯片,它采用增强的C2xx CPU内核结构,代码与24x系列的芯片兼容。与24X系列的DSP芯片相比,TMS320LF2407A采用3.3 V电源供电,功耗更低;CPU时钟频率可达40MHz,速度更快,EVM板可对LF2407代码进行全速检查,其中有544个字长的片上数据存储器、128K字长的板上存储器、片上只读闪烁存储器,片上UART和一个MP7680/A转换器, 可分别寻址程序存储器、数据存储器以及I/O各 64位空间和两个事件管理模块 EVA和EVB,各有两个16位的通用定时器。板上安装的器件可使评估板解决各类问题,4个扩展接口,可提供任何评估电路。TMS320LF2407A中含有一个支持CAN 2.0B协议的CAN控制器,支持标准和扩展标识衬;支持两种信息帧格式,即数据帧和远程帧,可以自动应答远程帧的请求,当出现错误或仲裁失败时,具有自动重发数据功能。本文主要介绍使用TMS320LF2407A进行CAN通信时硬件和软件方面的设计。
2 DSP功能介绍
本系统采用的TMS320LF2407A微处理器主要包括以下一些功能模块:
(1)一个32位的中央算术逻辑单元(CALU)。
(2)一个32位的累加器(ACC)。
(3) CALU的输入和输出定标移位器。
(4)一个乘积定标移位器(PSCALE )。
(5)8个辅助寄存器(ARO-AR7 )。
(6)一个辅助寄存器算术单元(ARAU),该模块提供了灵活而强大的间接寻址能力。
(7)还有两个状态寄存器ST0和ST1,它们包含有决定处理器工作方式、页地址指针值以及指示处理器不同条件和算术逻辑运算结果的位。
(8)TMS320LF2407A的16X16位乘法器是由寄存器TREG, PREG和一个硬件乘法器构成。其中TREG是临时寄存器,在作乘法运算时用来存储一个乘数,而PREG则是结果寄存器,存储乘法运算所产生的结果。
(9)TMS320LF2407A具有8级硬件堆栈。当子程序调用或中断发生时,程序地址产生逻辑把堆栈用于存储返回地址或其它的一些参数。当子程序调用或中断服务子程序完成时,返回指令将从堆栈顶返回地址或参数送到CPU寄存器中去。
3 CAN的接口
DSP芯片TMS320LF2407A中集成了一个CAN控制器,CAN接口线提供额外的高速窜行借口,其中有1个4针mini-DIN母接口,它可以用来连接CAN接口,接口管脚输出如图1; 管脚的定义如表1:
4 收发器的选择
CAN总线以其较高的通讯速率、良好的抗电磁干扰能力可实现高可靠性串行通信,因而在实际应用中具有极高的应用价值。但是,随着集成技术的不断发展,为了节省功耗,缩小电路体积,一些新型CAN总线控制器的逻辑电路平均采用LVTTL,这就需要与之相适应的总线收发器。文献中介绍最多的CAN总线收发器是Philip公司生产的820250,它与CAN总线控制器SGA1000配合使用时非常方便,但由于它使用5V电源供电,而DSP芯片TMS320LF2407A采用3.3V电源供电,将两者配合使用时,中问要加电平转换电路,为电路的设计带来了不便。TI公司生产的SN65HVD230X型电路很好地解决了这个问题。它是采用3.3 V电源,有很高的输入阻抗,总线上最多可连120个节点,ESD保护超过16KV, 温度升高到一定值时,总线自动关闭,节点上电或移去对总线上的其它节点没有影明,技术标准兼容1S011898。我选取的即是SN65HVD230D,它的引脚排位及逻辑功能如图2所示。
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。
5.3 语言源文件OS_CPU_C.C文件的修改
UC/OS-II的移植需要修改该文件中的10个C函数OS-TaskStkInit; OSTaskCreateHook; OSTaskDeHIook;OS-TaskSwHook;OSTaskIdleHook;OSTaskStatHook;OS-TimeTickHook; OSInitHookhenin;OSInitHookEnd;OSTCBInitHook。其中只有函数OSTaskStkInit()修改是必要的,其它函数是为了方便用户扩展而设的,可以定义为空。OSTaskStklnit()用于系统创建用户任务时,建立并初始化任务堆栈。该函数和处理器的硬件体系密切相关,它将所需的寄存器入栈,返回新堆栈的栈顶的地址,并将它们保存在该任务的任务控制块OS_TCB中,最终使初始化后的堆栈跟刚发生过一次中断一样。这样,系统无需对调度程序作特殊的处理即可直接对新任务进行调度。
6 结论
CAN总线因具有通信方式灵活、实时性好、可靠性高,通信距离远、传输速度快等优点被广泛地应用于航空、航海、汽车以及各种工业自动化控制系统.而DSP芯片内嵌了16通道的A/D转换模块,因此凡是适用于CAN总线通信的研究, TMS320LF2407A基本上也都应用.而且它的功能,比使用单片机的效率要高得多。在软件设计上,采用了嵌入式操作系统作为软件开发平台,从而为用户提供良好的人机交互方式和较强的应用程序接口,进一步提高系统的实时性和软件的运行效率,以嵌入式操作系统和DSP相结合的开发平台可以满足实时测控系统的需求。以上系统已经在长春工业大学智能检测实验室实际调试通过,并可跟据不同的需求作扩展。
参考文献
[1]阳宪惠.现场总线技术及其应用[J].清华大学出版社,1999.
[2]刘和平.TMS320LF240X DSP结构、原理及应用[M].北京:北京航空航人大学出版社,2002.
[3]迟瑞娟,曹正清.基于CAN总线的整车管理系统硬件设计[N].中国农业大学学报,2002, 7 (4):91-94.[4]邻宽明.CAN总线原理和应用系统设计[M].北京:北京航空航天大学出版社,1996.
[5]Jean J.Labross-e著,邵贝贝等译.嵌入式实时操作系统uC/OS-II(第2版)[M].北京:北京航空航人人学出版社,2003.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:CAN总线;TMS320F2407A;接口技术;uC/OS-II,嵌入式操作系统
中图分类号:TP202文献标识码:A文章编号:1672-3198(2008)04-0224-03
1 引言
CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。CAN是一种多种方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出任何错误。 由于CAN总线具有很高的实时性能,因此,CAN已经在汽车工业、航空工业、工业控制、安全防护等领域中得到了广泛应用。
TMS320LF2407A是美国TI公司生产的一种定点DSP芯片,它采用增强的C2xx CPU内核结构,代码与24x系列的芯片兼容。与24X系列的DSP芯片相比,TMS320LF2407A采用3.3 V电源供电,功耗更低;CPU时钟频率可达40MHz,速度更快,EVM板可对LF2407代码进行全速检查,其中有544个字长的片上数据存储器、128K字长的板上存储器、片上只读闪烁存储器,片上UART和一个MP7680/A转换器, 可分别寻址程序存储器、数据存储器以及I/O各 64位空间和两个事件管理模块 EVA和EVB,各有两个16位的通用定时器。板上安装的器件可使评估板解决各类问题,4个扩展接口,可提供任何评估电路。TMS320LF2407A中含有一个支持CAN 2.0B协议的CAN控制器,支持标准和扩展标识衬;支持两种信息帧格式,即数据帧和远程帧,可以自动应答远程帧的请求,当出现错误或仲裁失败时,具有自动重发数据功能。本文主要介绍使用TMS320LF2407A进行CAN通信时硬件和软件方面的设计。
2 DSP功能介绍
本系统采用的TMS320LF2407A微处理器主要包括以下一些功能模块:
(1)一个32位的中央算术逻辑单元(CALU)。
(2)一个32位的累加器(ACC)。
(3) CALU的输入和输出定标移位器。
(4)一个乘积定标移位器(PSCALE )。
(5)8个辅助寄存器(ARO-AR7 )。
(6)一个辅助寄存器算术单元(ARAU),该模块提供了灵活而强大的间接寻址能力。
(7)还有两个状态寄存器ST0和ST1,它们包含有决定处理器工作方式、页地址指针值以及指示处理器不同条件和算术逻辑运算结果的位。
(8)TMS320LF2407A的16X16位乘法器是由寄存器TREG, PREG和一个硬件乘法器构成。其中TREG是临时寄存器,在作乘法运算时用来存储一个乘数,而PREG则是结果寄存器,存储乘法运算所产生的结果。
(9)TMS320LF2407A具有8级硬件堆栈。当子程序调用或中断发生时,程序地址产生逻辑把堆栈用于存储返回地址或其它的一些参数。当子程序调用或中断服务子程序完成时,返回指令将从堆栈顶返回地址或参数送到CPU寄存器中去。
3 CAN的接口
DSP芯片TMS320LF2407A中集成了一个CAN控制器,CAN接口线提供额外的高速窜行借口,其中有1个4针mini-DIN母接口,它可以用来连接CAN接口,接口管脚输出如图1; 管脚的定义如表1:
4 收发器的选择
CAN总线以其较高的通讯速率、良好的抗电磁干扰能力可实现高可靠性串行通信,因而在实际应用中具有极高的应用价值。但是,随着集成技术的不断发展,为了节省功耗,缩小电路体积,一些新型CAN总线控制器的逻辑电路平均采用LVTTL,这就需要与之相适应的总线收发器。文献中介绍最多的CAN总线收发器是Philip公司生产的820250,它与CAN总线控制器SGA1000配合使用时非常方便,但由于它使用5V电源供电,而DSP芯片TMS320LF2407A采用3.3V电源供电,将两者配合使用时,中问要加电平转换电路,为电路的设计带来了不便。TI公司生产的SN65HVD230X型电路很好地解决了这个问题。它是采用3.3 V电源,有很高的输入阻抗,总线上最多可连120个节点,ESD保护超过16KV, 温度升高到一定值时,总线自动关闭,节点上电或移去对总线上的其它节点没有影明,技术标准兼容1S011898。我选取的即是SN65HVD230D,它的引脚排位及逻辑功能如图2所示。
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。
5.3 语言源文件OS_CPU_C.C文件的修改
UC/OS-II的移植需要修改该文件中的10个C函数OS-TaskStkInit; OSTaskCreateHook; OSTaskDeHIook;OS-TaskSwHook;OSTaskIdleHook;OSTaskStatHook;OS-TimeTickHook; OSInitHookhenin;OSInitHookEnd;OSTCBInitHook。其中只有函数OSTaskStkInit()修改是必要的,其它函数是为了方便用户扩展而设的,可以定义为空。OSTaskStklnit()用于系统创建用户任务时,建立并初始化任务堆栈。该函数和处理器的硬件体系密切相关,它将所需的寄存器入栈,返回新堆栈的栈顶的地址,并将它们保存在该任务的任务控制块OS_TCB中,最终使初始化后的堆栈跟刚发生过一次中断一样。这样,系统无需对调度程序作特殊的处理即可直接对新任务进行调度。
6 结论
CAN总线因具有通信方式灵活、实时性好、可靠性高,通信距离远、传输速度快等优点被广泛地应用于航空、航海、汽车以及各种工业自动化控制系统.而DSP芯片内嵌了16通道的A/D转换模块,因此凡是适用于CAN总线通信的研究, TMS320LF2407A基本上也都应用.而且它的功能,比使用单片机的效率要高得多。在软件设计上,采用了嵌入式操作系统作为软件开发平台,从而为用户提供良好的人机交互方式和较强的应用程序接口,进一步提高系统的实时性和软件的运行效率,以嵌入式操作系统和DSP相结合的开发平台可以满足实时测控系统的需求。以上系统已经在长春工业大学智能检测实验室实际调试通过,并可跟据不同的需求作扩展。
参考文献
[1]阳宪惠.现场总线技术及其应用[J].清华大学出版社,1999.
[2]刘和平.TMS320LF240X DSP结构、原理及应用[M].北京:北京航空航人大学出版社,2002.
[3]迟瑞娟,曹正清.基于CAN总线的整车管理系统硬件设计[N].中国农业大学学报,2002, 7 (4):91-94.[4]邻宽明.CAN总线原理和应用系统设计[M].北京:北京航空航天大学出版社,1996.
[5]Jean J.Labross-e著,邵贝贝等译.嵌入式实时操作系统uC/OS-II(第2版)[M].北京:北京航空航人人学出版社,2003.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。