新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于μC/OS-Ⅱ的Flexray线控转向系统的实现

基于μC/OS-Ⅱ的Flexray线控转向系统的实现

作者:时间:2013-12-27来源:网络收藏

  MC9S12XF512芯片不仅设有FLASH页面管理寄存器PPage,也有RAM页面管理寄存器RPage、E2PROM页面管理寄存器EPage以及全程寄存器GPage。当时钟节拍中断发生时,芯片会自动把CPU寄存器推入堆栈,但是并不包括上述各寄存器,因此在OS_CPU_A.ASM文件三个函数中,均需要加入将寄存器入栈和出栈的语句。由于篇幅有限,仅以PPage代码为例:
基于μC/OS-Ⅱ的Flexray线控转向系统的实现

  寄存器的入栈必须按照GPage,EPage,RPage,PPage的顺序,出栈则相反。

  2.3 修改OS_CPUC.C文件

  OS_CPUC.C文件是使用C语言编写与任务调度部分有关的代码,包括任务堆栈初始化函数OSTaskStklnit()和时钟节拍中断服务子程序OSTicklSR()。

  2.3.1 修改任务堆栈初始化函数0STaskStkInit()

  由于μC/OS-Ⅱ是利用中断方式来实现任务调度的,因此需要使用函数OSTaskStklnit()来模拟发生一次中断后的堆栈结构,按照中断后的进栈次序预留各个寄存器存储空间,而中断返回地址指向任务代码的起始地址。编写时需要根据芯片的中断后,X,Y,A,B,SP等寄存器入栈顺序来进行代码编写。首先在例程OSTaskStkInit()函数处设置断点,然后单步执行程序,观察X,Y,A,B,SP等寄存器状态是否与程序编写的存储值对应。发现对应于堆栈指针SP值的存储区地址是模拟中断时进栈的存储地址,而其中保存任务程序指针地址的内容是错误的,即不是任务的指针地址,因此每次在需要调用任务执行时都进入了错误的地址进行执行,并没有找到任务的代码。通过单步执行OSTaskStkI-nit()函数,可以发现原程序在存储任务代码指针PC值时,只存储了PC指针的高8位,但后8位未存,导致指针指向错误。因此修改程序为:

  *--wstk=(INTl6U)((INT32U)task);

  2.3.2 修改时钟节拍中断服务子程序OSTickISR()

  时钟节拍中断服务子程序OSTickISR()负责处理所有与定时相关的工作,如任务的延时、等待操作等。在时钟中断中将查询处于等待状态的任务,判断是否延时结束,否则将重新进行任务调度。可以通过调用OSIntEnter()。OS_SAVE_SP(),OSTimeTick()和OSIntExit()四个函数进行实现。OSintEnter()函数通知μC/OS-Ⅱ进入中断服务子程序,OS_SAVE_SP()函数用来保存堆栈指针,OSTimeTick()函数给要求延时若干时钟节拍的任务延迟计数器减1,当反复运行该程序后,计数器为0时,则表明该任务进入了就绪状态,OSintExit()函数标志时钟节拍中断服务子程序结束。

  之后最重要的一点,就是要将中断服务子程序OSTickISR()与任务级任务切换函数OSCtxSw()添加到系统中断向量表的相应位置中。这里使用的是实时时钟中断模块(RTI)来实现时钟中断的产生,因此要将OSTickISR()连接到向量表RTI位置。OSCtxSw()函数是利用软中断来实现任务的切换功能的,因此软中断服务子程序的向量地址必须指向OSCtxSw()。

  在进行上述程序编写后,下载代码到硬件中,μC/OS-Ⅱ就可以在本系统上实现运行了。

  3 通信程序设计

  利用任务形式来解决POC状态的检测问题,不仅可以提高程序效率以及避免死循环现象,同时,还可以建立通信故障检测报警任务,在不同的通信状态下,对驾驶员提供故障信息,方便处理。

  程序结构包括系统初始化、通信控制、数据采集和控制算法四大部分。这里只对其中的系统初始化及通信控制部分进行了设计。

  3.1 系统初始化

  在主程序main()中,首先对MC9S12XF512芯片进行初始化,包括:时钟初始化、I/O口初始化、A/D模块初始化、PWM模块初始化以及FlexRay协议配置初始化。之后,调用OSInit()函数对μC/OS-Ⅱ操作系统进行初始化。接着创建三个任务,按照优先级顺序9、1l、13,分别为FlexRay通信启动任务、数据接收发送任务和故障检测报警任务,由这三个任务实现系统的通信部分功能,其他部分功能可通过创建其他任务进行扩展。最后调用OSStart()启动内核运行,让任务在操作系统的管理与调度下运行。

  3.2通信任务设计

  以Freescale公司开发的针对该芯片的FlexRay通讯传输层和表示层的驱动程序为基础,进行应用层的程序设计,即编写通信任务程序,完成协议的运行过程。

  3.2.1 FlexRay通信启动任务

  按照上文介绍的FlexRay协议中定义的协议运行过程,当对FlexRay通信进行初始配置后,协议将进入就绪状态,之后发送启动节点命令等待协议状态由启动状态变为正常主动状态;在正常主动状态中,首先发送关键帧启动网络中的其他节点,发送完成后进入到节点唤醒状态,然后开启FlexRay通信的各种中断,包括:传输中断、接收中断、存储区中断以及定时器中断等,最后挂起任务等待检测到通信故障时进行唤醒;协议正常被动状态是在通信出现故障时,重新配置协议,进行协议的重启。需要注意的是用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用Osatart()之后,由任务优先级最高的那个任务开启RTI中断,否则系统容易死锁。程序流程图如图2所示。
基于μC/OS-Ⅱ的Flexray线控转向系统的实现

  3.2.2 数据接收发送任务

  FlexRay数据的接收发送是通过中断服务程序进行的,因此在该任务中,只需判断POC状态是否进入正常主动状态,如果是则使用全局变量对接收函数Fr_receive_da()和发送函数Fr_transmit_data()的消息缓冲区进行数据的读取和更新。

  3.2.3 故障检测任务

  在通信过程中,当其他节点因故障重启或是通信线路中断时,可以利用故障检测任务检查POC状态,当协议运行在正常被动状态时,则判断为通信线路出现故障,将故障LED指示灯设定为闪烁状态;当协议运行在暂停状态时,则判断为节点控制器故障,故障LED指示灯设定为常亮状态,并对FlexRay通信启动任务进行解挂,重新对协议进行配置,待故障解决,系统可以自动启动节点运行。程序流程图如图3所示。



评论


相关推荐

技术专区

关闭