新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > CAN总线分布式嵌入式系统的升级设计

CAN总线分布式嵌入式系统的升级设计

作者:时间:2012-05-15来源:网络收藏

2.3 软件
为实现在线功能,首先需要编写引导程序,然后将它烧入Flash引导区中。为防止应用程序失败,在引导程序中需判断Flash指定位置是否有程序完好标志,该标志由完整的应用程序在每次上电后写入。应用程序可采用烧写方式和方式写入相应程序区。为实现引导程序和应用程序之间的相互跳转,采取指向函数指针的方式来实现。可以将Flash中的引导程序和应用程序作为两个普通函数,这两个函数的进入位置分别为0x08000000和0x08004000,然后在引导程序中设置一个指向函数的指针,其指针值为0x08004000;同理,在应用程序中设置一个函数指针,其值为0x08000000。这样在相应的程序中调用函数指针时就可以实现程序跳转。
采用多主竞争工作方式和非破坏性仲裁技术,上任意节点可在任意时刻主动地向网络上其他节点发送信息而不分主次,各节点之间实现自由通信。当多个节点同时向总线发信息时,优先级较低的节点会主动退出发送,而优先级较高的节点不受影响,从而大大节省了总线冲突仲裁时间,即使在网络负载很重的情况下,也不会出现网络瘫痪的情况。因此,适用于监控的数据通信。由于总线协议规范只定义了物理层和数据链路层,所以在实际应用中必须根据实际制定合适的应用层协议。本系统中根据数据传输要求自定义了几个应用层命令,分别是升级相关命令和数据收发校验相关命令,限于篇幅在此就不一一详述。

3 软件升级过程
软件升级包括升级控制模块部分和待升级模块部分。
升级控制模块部分的工作过程为:向待升级模块发送升级命令,待接收到模块返回的确认标志后,再通过应用层协议向待升级模块发送升级数据,升级完成后向待升级模块发送完成命令。

本文引用地址:http://www.eepw.com.cn/article/149067.htm

d.JPG


待升级模块工作流程如图4所示。分为引导程序部分和应用程序部分,这两部分内容在开发的时候是作为两个独立的工程项目来完成的。
为确保在线升级的安全性,在Flash指定位置设置了一个程序完好标志。由于Flash的擦写是按照Page进行的,所以这个标志即使只有一位也需占用一个Page的大小。本系统中将标志设置在Flash最后一个Page。如果应用程序区没有空余的Page来写入该标志,就要考虑换用更大Flash容量的产品或者外扩存储器。程序完好标志在应用程序进入的时候写入,在接收到升级命令时擦除。若在引导程序中检测该标志不合法,就一直处于升级状态,直到最后收到升级成功命令为止。
程序跳转示例性跳转代码如下:
typedef void(*pFunc)(vold); //自定义函数指针数据类型
pFunc Jump_To_App; //定义一个指向应用程序的指针
Jump_To_App=(pFunc)0x08004000;
Jump_To_App();
需要注意的是,在程序执行跳转代码前,需要关闭中断响应,以避免发生不可预测的异常。同时,当程序跳转前,需要将堆栈指针设置到相应的程序区域。

结语
通过CAN总线对系统进行在线升级非常具有代表性,随着越来越多的芯片集成了丰富多样的片上通信外设(如以太端口、I2C总线等),使得系统的升级也具有更多样式,甚至可以通过公用网络(如因特网、GPRS等)进行远程升级。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭