APP下载

μC/OS-II 在混合动力整车控制器中的应用

2010-08-27汪葵孔治国王斌

单片机与嵌入式系统应用 2010年4期
关键词:堆栈指针调用

汪葵,孔治国,王斌

(中国汽车技术研究中心,天津300162)

引 言

混联式混合动力系统的子系统众多,其中整车控制器作为实现驾驶员驾驶需求和能量安全的管理系统,需要协调发动机、扭矩、电机和电池的功率在不同工况下的合理分配,实现制动能量回馈,并控制外围设备(如空调、灯光),以达到最佳的节能排放效果。系统任务的复杂性和强电磁干扰环境都对整车控制器的实时性和可靠性提出了重大挑战,传统的单任务循环式的程序控制模式难以满足需求,因此作者采用了开放源码的嵌入式操作系统μC/OS-II 设计整车控制器系统软件。

1 整车系统结构

所开发的全混合动力轿车是天津市重大专项课题,以长城哈佛SUV 轿车为平台。该车动力系统主要由发动机、交流电动机、交流发电机和高性能的镍氢电池、行星架动力分配机构以及DC—AC 逆变器组成。整车控制器采用总线与发动机管理系统、电机控制器和动力电池组管理系统交换信息,并且预留了1 路CAN 以便后期与车身系统通信。

整车控制器根据驾驶员输入信号,结合电池组状态和车辆当前运行状态,根据一定的策略控制各个子系统的工作,实现节能减排的目标。系统网络拓扑如图1所示。

图1 系统网络拓扑结构

2 整车控制器硬件设计

ECU 的硬件设计按照模块化原则,可分为如下几个功能模块:微控制器模块、数据采集模块、功率驱动及保护模块、D/A 转换模块、电源模块、通信模块、显示及报警接口和标定诊断接口等。采用Infineon 公司的XC164CS 微控制器,它基于增强的C166SVZ 内核,并在性能上优于其他16 位微控制器:内部集成DSP 功能、扩展的中断处理能力、强大的片上外设以及高性能片上Flash,如图2所示。

图2 整车控制器硬件框架

3 μC/OS-II 的移植

μC/OS-II 嵌入式实时操作系统采用ANSI C 语言编写,具备很好的可读性和可移植性;对硬件资源要求不高,在大多数8 位、16 位微控制器上都可以实现移植。

3.1 μC/OS-II 的启动

首先要调用硬件驱动程序对硬件进行初始化设置,然后调用系统初始化函数OSInit()初始化μC/OS-II 所有的变量和数据结构。

启动μC/OS-II 之前建立1 个应用任务。OSInit()建立空闲任务idletask,这个任务总是处于就绪态。空闲任务OSTaskIdle()的优先级设成最低,即OS_LOWEST_PRIO。多任务的启动需要用户通过调用OSStart()实现。当然还有其他设置,这里不再一一介绍。

3.2 μC/OS-II 的移植

μC/OS-II 操作系统在XC164CS 微处理器上的移植主要实现对3 个文件OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM 的处理。

3.2.1 头文件INCLUDES.H

INCLUDES.H 头文件应被包含到所有C 文件的第1行。尽管包含不相关文件可能会增加文件的编译时间,但增强了代码的可移植性。用户可以编辑增加自己的头文件,但必须添加在头文件列表的最后。

3.2.2 OS_CPU.H 文件

OS_CPU.H 文件中包含与处理器相关的常量、宏和结构体的定义。针对XC164CS 处理器,定义堆栈数据类型为16 位,栈向下递减;将μC/OS-II 控制中断的2 个宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()定义为微控制器关闭(SETC)和打开(CLRC)中断的指令;声明OS_TASK_SW()函数,中断服务程序ISR 的入口指向函数OSCtxSw()。

3.2.3 OS_CPU_A.ASM

μC/OS-II 移植时要求用户编写4 个汇编语言函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()。

(1)OSStartHighRdy()

调用该函数使处于就绪状态的优先级最高的任务开始运行。由于实时操作系统是不返回的函数,所以调用后需移去堆栈栈顶的返回地址,然后执行用户调用函数OSTaskSwHook(),最后开始运行多任务,获得优先级最高的任务的指针,根据这个指针从任务堆栈中恢复所有寄存器,恢复完后执行中断返回,运行就绪态任务。

(2)OSCtxSw()

当从低优先级的任务切换到较高优先级的任务时,调用任务切换函数OSCtxSw()保存处理器的内容和任务指针到当前任务的任务堆栈,然后执行用户调用函数OSTaskSwHook(),最后从要执行任务的任务堆栈里恢复寄存器和堆栈中的内容,执行中断返回指令开始运行新的任务。

(3)OSIntCtxSw()

当需要在中断发生后切换到更高优先级的任务时,调用中断级任务切换函数OSIntCtxSw(),然后执行用户调用函数OSTaskSwH ook()。因为该函数是在中断程序中被调用,所以不需要保存中断任务的寄存器;中断子程序在调用函数OSInExit()时,将返回地址压入堆栈,在这里不需要再返回,所以必须从堆栈中清理掉返回地址。

(4)OSTickISR()

OSTickISR()是μC/OS-II 中的时钟节拍中断服务程序。在每个时钟节拍调用该函数,给每个处于延时的任务延时减1,并检查所有处于延时状态的任务是否延时结束成为就绪任务。然后调用OSIntExit(),如果有优先级更高的任务就绪,OSIntExit ()就会进行任务调度。OSIntExit()并不返回调用者,而是用新的任务堆栈中的内容来恢复CPU 现场,由中断返回执行新的任务。

3.2.4 OS_CPU_C.C

用户需要编写6 个C 语言函数OSTaskStkInit()、OSTaskCreateH ook()、OSTaskDelHook()、OSTaskSw Hook()、OSTaskSatHook()、OSTimeTickH ook()。其中,唯一必要的是OSTaskStkInit(),其他5 个必须声明,但可以不包含代码。

OSTaskStkInit()由任务创建函数OSTaskCreate()或OSTaskCreateExt()调用,在建立每个任务的时候初始化任务堆栈。开始运行这个任务就是模拟中断返回,把初始化后堆栈中保存的值恢复到各个寄存器。初始化任务堆栈时,要传递任务代码起始指针(Ptask)、参数指针(Pdata)、任务堆栈栈顶指针。任务堆栈初始化完成后,返回一个新的堆栈栈顶指针,OSTaskCreate()或OSTaskCreate-Ext()将它保存到OSTCB 中。

在OS_CPU_C.C 文件中可以创建5 个钩子函数,使用的前提是配置文件中常量OS_CPU_HOOKS_EN 使能。

至此,μC/OS-II 操作系统的移植基本完成。

4 整车控制器软件多任务设计

整车控制器软件设计以实时操作系统作为开发平台,将应用程序分解成多任务,简化了系统软件的设计,保证了整车控制系统的实时性,提高了系统的稳定性与可靠性。整个系统的主程序流程如图3所示。

图3 整车控制器软件流程

4.1 定时器模块

定时器的主要功能是为软件程序提供基准时钟。本应用选择T5 作为时钟基准,在初始化函数void GPT_vInit()中完成模块寄存器配置;中断服务程序设置为OSTickISR(),中断向量为0x25。通过建立时钟任务函数Timer_Int(),调用时钟节拍函数OSTimeTick(),实现定时器与系统时钟的连接。系统时钟节拍编程为1 ms,可以减少中断服务时间,提高实时性。

4.2 CAN通信模块

CAN 通信模块功能是实现整车控制器与其他节点间的信息传输。周期性传输,传输周期为20 ms,通信速率为250 kbps,中断调用CAN 通信服务程序。

创建CAN 通信模块任务CAN_Trans,任务优先级3:

4.3 A/D 模块

A/D 模块功能是完成读取蓄电池电压、加速踏板传感器和节气门位置传感器信号,并进行模数转换,被其他函数调用。

创建A/D 转换模块任务ADC_Conv,任务优先级4:

4.4 整车控制主程序模块

在混合动力汽车系统各模块自检成功后,整车控制器要求启动电池,进入正常EV 工作模式。然后通过判断档位,钥匙开关和油门踏板等信息,进入不同的处理模块。控制策略包括整车控制策略和能量流管理策略,实现基于扭矩算法的控制输出。

创建整车控制主程序任务Drive_Ctr,优先级9:

这里限于篇幅不再介绍其他模块,大体过程相似。

结 语

随着汽车整车技术的不断发展和法规日益严格的要求,汽车电子系统会变得越来越复杂,采用操作系统来实现对复杂任务的管理和协调,将成为不可避免的趋势。

本文通过混合动力整车控制器的软硬件设计,详细说明了μC/OS-II 系统移植过程,优化了系统软件设计,充分满足了系统的需求。经实车试验测试取得了很好的效果。

[1]Labrosse Jean J.嵌入式实时操作系统μC/OS-II[M].邵贝贝,等译.2 版.北京:北京航天航空大学出版社,2003.

[2]吴志红,朱元,王光宇.英飞凌16 位单片机XC164CS 的原理与基础应用[M].上海:同济大学出版社,2006.

[3]Infineon XC164-16 16-bit Single-chip Microcontroller with C166SVZ Core:System Unit,2003.

[4]田光宇,等,混合动力电动汽车关键技术[J].汽车技术,2002(1):8-11.

[5]邬宽明.CAN 总线原理和应用系统设计[M].北京:北京航天航空大学出版社,1996:102-108.

猜你喜欢

堆栈指针调用
基于行为监测的嵌入式操作系统堆栈溢出测试*
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
为什么表的指针都按照顺时针方向转动
基于堆栈自编码降维的武器装备体系效能预测
基于系统调用的恶意软件检测技术研究
基于改进Hough变换和BP网络的指针仪表识别
ARM Cortex—MO/MO+单片机的指针变量替换方法
利用RFC技术实现SAP系统接口通信
一种用于分析MCS-51目标码堆栈深度的方法