2.3 application中刷新准备的设计
刷新前的准备工作主要用于刷新的各种数据读取和验证, 安全检查工作和各种条件使能工作。 刷新准备工作流程如图2所示, 主要过程为, 用读取诊断信息服务0x22读取当前软件版本和主要信息; 用开始诊断会话服务0x10切换当前诊断模式到扩展模式; 用故障码设置服务0x85禁止设置DTC以便于刷新; 用通信控制服务0x28禁止当前网络管理及通信信息, 以便于刷新可以获得最大的流量, 以及阻止其他网络信号的干扰, 保证刷新的顺利进行。 之后用软件控制服务进行刷新前的条件检查, 如电源电压、 数据和软件稳定等检查。
2.4 启动加载设计
bootloader软件有两大功能: 启动加载跳转功能和刷新功能。
一般启动加载安排在bootloader软件的死循环前面, 用于上电自启, 并检查应用软件是否正确与完备。 如果应用软件效验成功, 则跳入应用软件区域; 否则留在bootloader中, 等待软件刷新。 boot-loader启动加载流程如图3所示。
bootloader跳入application软件中主要跳转语句如下, 主要用了函数指针功能: if (temp_checksum== CHECK_CRC_16) ((void (code *) (void)) APP_START_ADD) ()。
上述C语句中, CHECK_CRC_16值即为magicword效验值 (magic word效验区的映射见图1), 当计算得到的temp_checksum和magic word保持一致,即 可 跳 入 application 软 件 。 APP_START_ADD 为application入口地址, 在应用软件的内存映射入口处。
2.5 bootloader中刷新部分设计
bootloader 中含有刷新主体部分诊断服务的设计。 而application软件含有刷新准备部分的诊断软件设计。
bootloader是一个完整的软件, 它用CAN进行刷新, 底层驱动包括CAN驱动的接收和发送部分, 并含有传输层数据处理部分。 如何处理传输层一直是
诊断设计的重点。 本设计中主要采用switch case的分支处理方法来进行传输层的处理, 处理完毕后即可进入诊断服务的通信。 如图4所示, 当收到CAN信息时首先判断信息ID是否为需要ID, 然后对数据进 行 接 收 , 接 收 的 同 时 根 据 ISO 14229 及 ISO15765-2标准对传输层进行处理, 尤其是多帧的处理和管理。
对于网络接收的诊断数据, 本文采用了结构体, 用于后续各个诊断服务的正确回复、 否定回复的处理及数据的保存。 所用结构体及解释如下:
typedef struct prg_com_tag {
byte service ; //诊断服务
byte msg_len ; //CAN接收信息的长度
byte msg_index ; //多帧信息时, 信息的序号
byte sub_srv ; //诊断服务的下级参数
} prg_com_type。
刷新过程中众多刷新数据需要足够的缓冲来进行, 本设计主要把写入flash的字线放置与XC878的XRAM中的固定位置处, 而后调用flash编程语句进行编程写入, 数据缓冲定义如下述语句: unsignedchar xdata WLBuf [BYTES_PER_WORDLINE] _at_XRAM_BUFFER_ADDR。