燃料电池控制系统.doc_第1页
燃料电池控制系统.doc_第2页
燃料电池控制系统.doc_第3页
燃料电池控制系统.doc_第4页
燃料电池控制系统.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于HCS12的实时嵌入式燃料电池控制系统白日光,萧蕴诗,孙泽昌(1同济大学 控制工程与科学系,上海 200092;2同济大学 汽车学院,上海 200092;3同济大学摩托罗拉汽车电子联合实验室,上海 20092)摘要:燃料电池控制器是燃料电池中非常关键的部分,对于燃料电池稳定而安全的工作有积极的作用。针对燃料电池控制中要求较高的实时性与可靠性,利用摩托罗拉16位单片机MC9S12DP256b把实时嵌入式系统UC/OS-II成功移植到控制中。本文结合HCS12单片机和Codewarrior编译器的特点详细介绍了内核的优化实现,并利用实例说明了嵌入式操作系统带来的优点。关键词:UC/OS-II;燃料电池控制器(FCC);MC9S12DP256b;移植;内核Real Time Kernel Fuel Cell Control System Based on HCS12Bai Riguang, Xiao Yunshi,Sun Zechang(1. Department of Control Engineering & Science, Tongji University, Shanghai, 200092, China;2. Automobile College, Tongji University, Shanghai, 200092,China;3. Tongji University Motorola Automobile Electronic Laboratory, Shanghai, 200092, China)Abstract: The Fuel Cell Controller (FCC) is an important part of Fuel Cell. It affects steady and safe running of Fuel Cell. Considering real time and reliability qualities of FCC, we port real time embedded operation system UC/OS-II to the controller using HCS12. With the characteristic of HCS12 single chip and Codewarrior, the paper introduces the implementation of the kernel in details, and shows the advantage of the embedded operation system by an example. Key words: UC/OS-II; fuel cell controller (FCC); MC9S12DP256b; port; kernel0 引言随着汽车工业的发展,人类对传统能源(如原油)的需求日益扩大,从而带来空气污染和资源枯竭两大问题,燃料电池作为一种新型的绿色能源开始受到人类的关注。结合由同济大学承担的国家863电动汽车重大专项燃料电池轿车项目,需要开发适用于质子交换膜燃料电池稳定而安全工作的燃料电池控制器。考虑到燃料电池控制器硬件资源的需求,研究中利用了摩托罗拉公司的16位单片机MC9S12DP256b。为了进一步满足控制中高可靠性与实时性的要求,把内核公开的UC/OS-II实时嵌入式操作系统移植到此单片机中,从而使开发具有更好的扩展性。本文首次把实时嵌入式操作系统应用到燃料电池控制中,取得了良好的效果。基金项目:国家863电动汽车重大专项(2003AA501)作者简介:白日光(1980 ),男,硕士生,主要从事燃料电池控制器,过程控制与计算机控制方向研究。萧蕴诗(1946 ),男,教授,博士生导师,主要研究方向为智能控制理论与系统。孙泽昌(1953 ),男,教授,博士生导师,主要研究方向为汽车电子。1 系统平台介绍11 硬件MC9S12DP256bMC9S12DP256b是摩托罗拉16位单片机HCS12家族中的一员,它的处理单元采用了16位的STAR12 CPU。此单片机内嵌了很多资源,包括256K FLASH,4K EEPROM,12K RAM,8通道定时器以及多种通信接口。此单片机可通过单线BDM进行程序的编译,下载和在线调试。12 软件平台CodewarriorCodewarrior是Metrowerks公司开发的一个编程环境。这里使用的Codewarrior4.2是专门针对HCS12系列单片机开发的,他可以用来进行程序编辑,编译,连接和在线调试等多项功能,并支持多种语言功能,可在C中嵌入汇编程序。13 嵌入式操作系统UC/OS-II内核UC/OS-II(Micro Control Operation System Two)是一种源代码公开的嵌入式操作系统, 程序绝大部分是用C语言写的, 带有少量的汇编程序, 并且有详细的说明和示例, 可移植、易调试, 稳定性与可靠性高, 功能也比较完善。在改进后的2.51版中包括了任务管理,时间管理,任务间通信(消息,邮箱,信号量和标志)和内存管理等多项功能。UC/OS-II的内核是占先式的,具有最高优先级的任务一旦准备就绪, 就能立刻得到CPU的控制权, 可以剥夺低优先级任务的CPU使用权, 处理系统最紧急的事务。1 4 移植条件一般来说,能移植UC/OS-II的CPU及其编译器必须满足以下条件:用户的编译器能产生可重入性代码;用C语言就可以打开和关闭中断;CPU能产生定时中断,而且给用户留有自定义中断向量;具有一定的数据和代码空间,至少4K的ROM和2K的RAM;CPU有将堆栈指针和其他CPU寄存器读出和存储到堆栈和内存中的指令。对于以上条件,MC9S12DP256b和其编译器Codewarrior都能满足。2 移植过程图1 UC/OS-II 2.51版的软硬件结构体系图1显示了UC/OS-II 2.51版移植到MC9S12DP256b时的软硬件结构体系。应用程序软件使用Codewarrior编译器,硬件利用MC9S12DP256b单片机。嵌入式系统UC/OS-II共由3部分组成,一部分是与处理器无关的代码,在移植中可直接使用,无需更改;一部分是与应用相关的代码,其中INCLUDES.H用来配置头文件,OS_CFG.H用来配置需要的UC/OS-II资源;另一部分就是处理器相关的代码,这部分是移植的重点,其中OS_CPU.H定义了与处理器相关的常量,宏和类型,OS_CPU_C.C中包括了与处理器相关的代码。在OS_CPU_C.C中共有五个重要的函数:OSStartHighRdy(), OSCtxSw(), OSIntCtxSw(), OSTaskStkInit(), OSTickISR()。这几个函数都是与STAR12 CPU的内部寄存器和堆栈处理有关联的,OSTickISR()还和MS9S12DP256b的时间模块有关联。21 STAR12 CPU堆栈介绍在移植中关键就是如何构造任务堆栈及如何在切换任务时调整堆栈指针,因而需要对STAR CPU的堆栈调用有详细的了解。STAR12 CPU的内部寄存器有:16位累加器D(也可分作两个8位累加器A和B),变址寄存器IX,变址寄存器IY,堆栈指针SP,程序计数器PC和8位条件码寄存器CCR。当中断发生时,所有的寄存器都会按一定顺序自动的保存到堆栈中,如图2所示。图2 STAR12 CPU中断发生时的堆栈变化22 文件OS_CPU.H的移植从图2可以看出,STAR12 CPU的堆栈指针是向下增长的,因而在OS_CPU.H中要宏定义对应变量为1。CPU的开关中断采用文献中介绍的方法1,而定时中断采用有输出比较功能的TC7。此CPU还提供了专门的软中断指令swi,这对于移植是非常有利的。下面列出了移植后的关键代码:#define OS_STK_GROWTH 1#define OS_ENTER_CRITICAL() _asm sei#define OS_EXIT_CRITICAL() _asm cli#define OS_TICK_OC 7#define OS_TASK_SW() _asm swi23函数OSTaskStkInit()的移植函数OSTaskStkInit()的功能是初始化任务堆栈,在任务建立时会调用它。当多任务启动和任务切换时,会通过中断返回指令把已准备就绪的优先级最高的任务的堆栈内容返回。因而,必须模仿中断发生时的堆栈内容来初始化堆栈。下面显示了此函数移植后的关键代码:INT16U *wstk;/字堆栈指针INT16U *OffsetAddress;/任务偏址指针INT8U *bstk;/字节堆栈指针INT8U regPage;/任务页地址wstk = (INT16U *)ptos;/堆栈栈顶*-wstk = (INT16U)pdata;/数据参数地址OffsetAddress = (INT16U*)&task;/任务偏地址regPage = (INT8U)task;/任务页地址*-wstk = (INT16U)*OffsetAddress;/偏址入栈*-wstk = (INT16U)*OffsetAddress;/偏址入栈*-wstk = (INT16U)0x1111; /IY寄存器*-wstk = (INT16U)0x2222; /IX寄存器*-wstk = (INT16U)0xBBAA; /D累加器bstk = (INT8U *)wstk; /堆栈指针为8位-bstk = 0x80; /CCR寄存器#if defined( _BANKED_) | defined(_LARGE_)*-bstk = regPage;/页地址入栈(8位)#endif return (void *)bstk);/返回新的栈顶图3 OSTaskStkInit()初始化后的任务堆栈堆栈初始化后如图3所示,比较图2,这里增加了一个最后入栈的任务页地址regPage。由于在此单片机中有256K FLASH,而且外部可扩展768K FLASH,因而当单片机工作时,无法用16位的程序计数器完全寻址,需要利用分页寻址的方式,其中页地址存储在8位PPAGE寄存器中。当程序在不同的页之间切换时,就需要把PPAGE寄存器的值保存起来,Codewarrior编译器可实现此功能。Codewarrior共有三种编译模式可选,SMALL模式,BANKED模式和LARGE模式。SMALL模式适用于用户程序比较小的情况,在这种模式下编译可确保程序都在同一页中,因而编译后中断没有保存PPAGE寄存器。而当设置为另外两种模式时,因涉及到不同页之间的切换问题,就必须保存PPAGE寄存器。此时必须注意一点,当Codewarrior工作在后两种模式下时,为确保移植程序成功,必须把Codewarrior中相应的编译选项设为-CpPPAGE=0x30,否则编译后PPAGE寄存器将无法在中断时自动压入堆栈,从而会使中断返回出错。24 函数OSStartHighRdy()的移植函数OSStartHighRdy()的功能是开始调用已准备就绪的优先级最高的任务,下面显示了其中的关键代码:_asm/C中嵌入汇编代码inc OSRunning/多任务开始运行ldx OSTCBHighRdy / SP指向最高优先级_lds 0,x /就绪任务堆栈栈顶/end asm需要注意的是,为了使本函数返回时是以中断返回方式返回,必须在函数前用#pragma TRAP_PROC声明其为中断调用函数,这样Codewarrior在编译时才会将其以中断程序调用。25 其余函数的移植图4进入函数OSIntCtxSw()后当前任务的堆栈函数OSCtxSw()是实现软中断任务切换的,而函数OSIntCtxSw()是实现时间中断任务切换的,二者代码相似,但OSIntCtxSw()在移植中因涉及到堆栈指针的调整问题而相对复杂,而且其指针调整和编译器有直接关系,因而将以OSIntCtxSw()为例详细介绍任务切换程序的移植。图4显示了程序进入函数OSIntCtxSw()后当前任务堆栈的内容,整个入栈顺序如下:1. 当前任务运行时,如果发生定时中断,则调用OSTickISR()函数,、和进栈;2. 中断服务程序OSTickISR()调用OSInitExit(),和进栈;3. OSInitExit()函数调用OSIntCtxSw(),和进栈,继续执行OSIntCtxSw(),进行任务切换。切换前,要保存当前任务返回时所需的堆栈栈顶指针,因而需要调整指针位置,这里用了两种方法来实现。方法1:如图4中所示,在OSIntCtxSw()中调整指针指向处,然后把当前任务堆栈指针保存到对应的任务控制块中,具体程序如下:_asm/C中嵌入汇编程序leas 6,sp/调整SPSP6ldy OSTCBCur/把当前SP保存到_sts 0,y/当前任务的控制块中/end asm方法2:在函数OSTickISR()中保存当前任务堆栈指针到对应的任务控制块中,因为此时指针正好指向返回时需要指向的地址,因而无需调整指针,具体程序程序如下:asm inc OSIntNesting;/中断嵌套计数if (OSIntNesting = 1)/没有中断嵌套_asm/ C中嵌入汇编程序ldy OSTCBCur/把当前SP保存到_sts 0,y/当前任务的控制块中/end asm/end if比较两种方法,可看出方法2并没有进行堆栈指针调整,更具有可移植性,它避免了因编译器的不同而带来的不便。当当前任务的指针保存好后,OSIntCtxSw()就可以进行任务切换了,具体代码如下:_asm/ C中嵌入汇编程序ldx OSTCBHighRdy/当前任务块指针指向_stx OSTCBCur/优先级最高任务块ldab OSPrioHighRdy/当前运行优先级为_stab OSPrioCur/就绪任务最高优先级lds 0,x/ SP指向优先级最高_/任务堆栈栈顶最后在OSTickISR()中加入TC7定时的相关设置,并在中断向量表中加入软中断和定时中断的程序入口地址。这样就完成了整个UC/OS-II的移植过程。3 实例分析图5是一个简单的燃料电池控制器模型,表1列出了应用UC/OS-II后划分的主要任务,各个任务间通过信号量和消息进行数据传递和流程控制。例如,两路CAN信息的读取通过接收中断发送信号量引发任务7和任务8进行数据处理。程序中还利用系统定时中断建

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论