首页 >>> 公司新闻 >

公司新闻

基于μC/OS-Ⅱ操作系统的汽车组合仪表的设计

现代社会对汽车各方面的要求不断提高,在汽车设计中运用电子控制技术是满足这些要求的*好方法。汽车电子控制装置必须迅速、准确地处理各种信息,并通过电子仪表显示出来,使驾驶员及时了解汽车的运行状态。随着电子技术的进步,新型传感器、新型电子显示器件的出现,汽车电子仪表显示装置得以迅速发展。另外在汽车仪表的设计中引入成熟的计算机技术,如操作系统、网络技术等使汽车能应对各种非正常动作,可以保证汽车的**行驶。
2
组合仪表的硬件设计
该仪表是全数字式组合仪表,硬件结构如图1所示,仪表盘系统包括一个低速CAN和一个高速CAN接口,4个指针式表和一个LCD显示仪表以及通讯接口和报警指示。其中仪表采用指针式显示,由步进电机驱动;里程由LCD显示,并保存累计里程。


中央处理单元由FREESCALE16位单片机MC9S12H256及其外围电路组成。其PORTAPORTB口用作驱动LCD接口和剩余的口线用作普通的I/O口,用于发光二极管的口线。其中步进电机直接接到步进电机的驱动口MOM1M2M3M4M5MC9S12H256直接驱动步进电机,该口线的电流驱动能力25mA,完全满足电机的驱动。电机的驱动十分容易,只需要配置部分接口的状态寄存器和写入相应的驱动值,就能**的驱动电机的转动。DBMFREESCALE系列芯片的后台编程接口,利用专门的PE调试环境很容易进行在线编程和调试,可以对单片机进行复位(RESET)和下载(LOAD);SPI接口用于外围的SPI通讯。
3
软件部分
3
1 功能分析与设计
基于μC/OS-Ⅱ的汽车组合仪表采用源代码开放的μC/OS-Ⅱ作为应用程序的开发平台。主要实现以下功能:通过电机指针显示发动机转速、车辆速度、油压、水温4种参数;通过液晶屏显示车辆行车里程及总里程两种参数。
μC/OS-Ⅱ是一个完全免费的开放源码的实时操作系统内核,其代码简捷高效,具备多任务调度,信号量、邮箱、消息队列等任务间通信与同步,时间管理,简单内存管理等RTOS内核基本服务功能。它采用优先级驱动的占先式多任务调度算法。
根据前面对整个系统的功能描述,可以将应用程序划分为6个任务加上6个中断(RTI节拍中断属于系统中断,其他5个为用户中断)。这6个任务分别是:
1)报警显示任务:前后灯光、刹车、电源、油量、油温、水温等LED报警;
2)里程显示、存储任务:LCD显示里程,记录里程;
3)步进电机2任务:车速指针表显示;
4)步进电机3任务:水温指针表显示;
5)步进电机4任务:油压指针表显示;
6)步进电机1任务:转速指针表显示。
每个任务在建立时均分配一个优先级(范围为0630为*高,63为*低)。这6个任务的优先级依次分配为123456;报警任务需要及时响应,具有*高的优先级;而里程显示、存储任务优先级*低。较高优先级的任务必须调用至少一项系统服务而暂时放弃CPU的使用权,否则低优先级任务无法得到运行。
任务的一般结构如下:
Void.UserTask
void*pdata
for(;;)
{ 调用μC/OS-Ⅱ的某种系统服务:
OSMboxPend()/OSMboxPost()

OSQPend()/OSQPost()

OSSemPend()/OSSemPend()

OSTaskDeL
OS_PRIO_SELF); (4
OSTaskSuspend
OS_PRIO_SELP); (5
OSTimeDly()/OSTimeDlyHMSM()
; (6
} }
1)~(6)是一些主要的系统服务函数,这些函数里均进行一次任务调度,会或者可能会使当前任务放弃CPU使用权而运行其他的任务。用户任务必须至少调用一个服务函数。
另外程序还有5个用C语言编写的用户中断服务程序:一个CAN接收中断(用于接收总线信息)、4个定时器输出比较中断(用于产生驱动步进电机的周期性脉冲)。
因此本例程序可以这样规划,首先调用OSInit(),对μC/OS-Ⅱ做初始化,然后创建一个信号量,因为后面的任务都要用到Printp()函数,而Printp()是一个不可重入函数,调用前要防止多个任务同时调用,这个信号量用于保护Printp()函数。接着创建6个任务,并对这6个任务分配优先级,*后调用OSStart()以启动内核,于是任务在操作系统的管理和调度下运行和切换。图2是程序的简要流程图。


3
2 μC/OS-Ⅱ内核移植
软件部分另外一个重点工作是μC/OS-Ⅱ的移植。μC/OS-Ⅱ绝大部分代码是用与处理器无关的C语言写成,只有与处理器相关的很少代码由汇编语言编写,图3是其软硬件层次结构。


要实现μC/OS-Ⅱ向MC9S12H256的移植,需要做两方面的工作:重新定义内核的大小和功能;为内核编写与硬件相关的代码。
3
21 内核属性配置
OS_CFG.H
文件用于配置内核的属性,根据实际需要做相应的修改,这里为了尽量减少内核不必要的模块,去掉了人为将任务挂起唤醒和删除等功能。本例仍然支持任务的创建和管理,也保留了信号量模式,以用于任务间的通信,此文件关注的代码主要有以下几部分:*低优先级、*大事件数目、*大标志数目、*大任务数目、邮箱使能、队列使能等。
3
22 硬件相关代码移植
为内核编写与硬件相关的代码,具体来说,只需针对硬件平台改写与处理器相关的3个文件,核心代码的9个文件完全不需改动,2个配置文件在编写应用程序时按需要改动。与CPU类型有关的代码文件主要有3个:OS_CPU.HOS_CPU_A.ASMOS_CPU_C.COS_CPU_A.ASM是用汇编语言写的与硬件有关的代码,OS_CPU_C.C文件是用C语言写的与硬件有关的代码。由于移植使用的C交叉编译工具在C代码中可以插入汇编语句,在移植时,将这两个文件合成为一个文件OS_CPU_C.C
1OS_CPU.H:此文件定义了与编译器相关的数据类型,使得系统中使用的数据类型与处理器无关。还定义了堆栈数据宽度、堆栈的增长方向、开关中断的方法等。
2OS_CPU_C.C:此文件包含以下几个函数:任务堆栈初始化函数OSTaskStkInit();中断服务子程序OSTickISR();中断级任务切换函数OSIntCtxSw();任务级任务切换函数OSCtxSw();让优先级*高的就绪态任务开始运行函数OSStartHighRdy();其余5个用“钩子”(Hook)函数。
根据实际情况本课题中对任务切换时保存现场信息的任务堆栈结构做如下设计。堆栈由高地址向低地址增长,首先保存PC(程序计数器)的值,初始化为任务函数的首地址task。之后依次保存16位变址寄存器YX8位累加器AB8位条件码寄存器CCR,其初始化值并没有实际意义。MC9S12H256的片内FLash已经超过了64kb的寻址空间达到了256kb,被分为16页每页16kb,需要采用存储页面寄存器PPAGE来管理分页FLASH。因此,在任务堆栈的设计中添加了保存页面寄存器PPAGE以保证任务的正常切换,并且需要在编译器的编译选项中做相应处理。
3)μC/OS-Ⅱ时钟节拍设定
μC/OS-Ⅱ需要硬件提供一个简单的时钟,用于延时等功能。本系统采用MC9S12H256时钟产生器内的实时时钟系统(RTI)模块直接分频得到。实时中断控制寄存器RTICTL的低7位为有效分频因子,分为低4m和高3n,分频系数为(m+1)×2n+9。所用外部晶振为16MRTICTL=0x69,分频系数为10×215,所以节拍频率=16×106/10×215)≈49Hz
4
总结
本课题中的基于μC/OS-Ⅱ操作系统的组合仪表盘样品已经完成,并已经在重庆邮电大学的车身网络演示上对发动机转速、车辆速度、发动机冷却液温度、机油压力4种参数进行测试。测试时,各参数均由串口输出,同时发动机转速、车辆速度、水温、油压4种参数也通过步进电机指针仪表显示;车辆里程则由LCD液晶屏显示。测试结果表明运行状态正常,当改变客车速度时,组合仪表的转速和车速仪表能实时更新。