新闻中心

EEPW首页 > 汽车电子 > 设计应用 > 汽车ECU 标定系统CCP 软件的实现

汽车ECU 标定系统CCP 软件的实现

作者:时间:2010-07-17来源:网络收藏

  (1)中断处理程序

  中断级程序的程序流程图如图 2 所示。首先根据不同的中断类别进入不同的中断级程序。若为接收完成中断,则清除中断源,将接收到的消息放入接收缓冲区;将该消息存入接收缓冲区存入指针所指向的地址,将该指针向下移动,接收缓冲区计数器加1,并发出信号量通知应用程序有新的消息已经接收到,若有任务正在等待 上的新消息,则该任务进入就绪状态等待OS 的调度。

图2 中断级程序的程序流程图

  若为发送完成中断,则将发送缓冲区的待发送消息读出;将有待发送消息且优先级最高的一个中读取最旧的消息,发送缓冲区计数器减1,发出信号量通知应用程序有一个消息被发出,并汇报当前发送缓冲区的状态;还应判断是否为最后一个待发送的消息,若不是,则清除中断源并将消息发送到上,若是最后一个,则禁止发送完成中断后发送该消息,将这个发送完成中断保留到应用程序下一次发送消息的时候允许并产生。

  (2)底层驱动模块

  底层驱动模块主要是为应用程序提供了接收和发送消息的接口函数。当接收消息时[4],如图3 实线所示,应用程序在信号量处等待;收到一个消息后,ISR从串行端口读入消息,将其存入环状缓冲区。然后ISR 发出信号量,通知在等待串口数据的任务已收到一个消息。等待任务收到信号量后,进入就绪状态,准备被OS 调度器激活。当内核调度该任务运行时,该任务从环状缓冲区中取出消息,完成接收消息的过程。

图3 缓冲区接收发送消息

  发送消息的方法如图3 虚线所示。当发送环状缓冲区已满时,信号量作为指示,暂停发送任务。为发送消息,任务等待信号量。如果环状缓冲区未满,则任务继续向环状缓冲区存储欲发送的消息。如果存储的消息是缓冲区的第一个字节,则发送中断允许,中断程序准备启动。 发送ISR 从环行缓冲区中取出最旧的消息,同时发送信号量,通知发送任务,表明环状缓冲区有空间接收另外的消息。接着ISR 将消息从 端口发送到上。

  4.2 Driver

  基于实时操作系统的 Driver,在这里是通过Command 处理机和DAQ 处理机两部分来实现的。

  Command 处理机由一个系统任务来完成[5]。该任务在OS 初始化后就启动运行,识别CAN 网络上的 主设备发送给该从设备的会话命令。根据命令做相应动作,并回送命令应答,完成会话。DAQ 处理机由1~n 个系统任务来完成。本项目支持对不同时间要求的监视参数设定不同的DAQ 周期,不同时间要求的监视参数填入不同的DAQ_List,每个DAQ_List 由一个任务完成周期发送。

  Command 处理机在收到主设备要求启动某DAQ_List 命令时, 调用OS 函数OSTaskCreate()启动相应的任务,该任务每完成一次发送就调用OS 函数OSTimeDlyHMSM( )挂起一定的时间,这个时间就是主设备对这个DAQ_List 要求的发送周期。在收到主设备要求停止某DAQ_List 命令时,调用OS 函数OSTaskDel( )函数删除该任务。

  (1)Command 处理机

  Command 处理机主要是获取并解读主设备的CCP 命令,并执行该命令;命令执行完成后,向主设备发送应答;若执行时出错,应答中向主设备报错;若主设备命令要求对DAQ进行操作,则将该操作传达给DAQ 处理机,由DAQ 处理机完成DAQ 操作。

  Command 处理机由一个RTOS 任务来完成,其示意性代码如下,GetMsg 函数为CAN 驱动程序的接收消息函数,调用此函数则等待获取CAN 端口接收到的消息帧。一旦接收到新的消息帧则函数返回,用户可通过msg_command 获取该消息帧的内容。

  void task (void * data) {
  for( ; ; ) {
  GetMsg(msg_command); //等待并获取一个CCP 命令
  CCP_Command (msg_command); //将命令送给CCP 命令处理函数
  }
  }

  



评论


相关推荐

技术专区

关闭