新闻中心

EEPW首页>嵌入式系统>牛人业话> 海可枯石可烂,程序存储的空间也会变

海可枯石可烂,程序存储的空间也会变

作者:马步 时间:2019-11-08 来源:电子产品世界 收藏

在这个薄情的世界上,没有什么东西是不会变的。

本文引用地址://m.amcfsurvey.com/article/201911/406878.htm

曾经的情比金坚,爱意绵绵,到如今一刀两断,爱情的小船翻了船,高调秀过的恩爱被无情地打脸。曾经的义结金兰,并肩向前,也架不住权力游戏对美好心灵的摧残,昨日推杯换盏,今日一拍两散,说翻脸就翻脸,阴谋刺激堪称政变。

1573198018308442.jpg

海也没有枯,石也没有烂,但是倔强的时间一往无前,将说好的永远打得凌乱。

谜一样的人类就是这么靠不住,所以有人说:“人类靠得住,母猪会上树”!

相比之下,外在的物质世界就稳当多了。

古巴比伦王颁布了汉谟拉比法典,刻在黑色的玄武岩,距今已经三千七百多年。杰伦说,“几十个世纪后出土发现,泥板上的字迹依然清晰可见。”

万里长城跨越一座座高山,迎来送往过一次次的刀锋雪剑,至今仍在接待全球各地笑意冉冉的旅行团。金字塔历经五千年的岁月轮转,走过王朝更替的狼烟,依然在如血的残阳中傲然矗立,默默无言。

但是,时代毕竟发展了。以前的时间很慢很慢,一封家书都要走上小半年,现在的时间变得很快很快,眯一会儿就从塞北来到了江南。

所以,现如今,基本上所有的东西都打上了一个叫做“保质期”的标签。在电子产品那里,有一个更为专业一点的术语,叫做“产品生命周期”。

1

电子产品的“生命周期”或者说寿命可长可短,作为一个物件,它当然有被自然规律支配的客观一面,同时,作为人类的一种工具,它还取决于人类主人随性随机的主观意愿。

就拿手机来说吧,小青年们基本上一年一换,像我这种老朽也撑不过三年,从主观层面上来说,平均寿命不过两年。但是,从客观上来说,电池不行了换电池,屏幕不好了换个屏,或者主观思想停留在上个世纪,不怕卡顿,不嫌难看,手机的寿命兴许可以到十年。

手机用上十年当然很恐怖,但是对于一般的嵌入式产品而言,十年却是小菜一碟。试问你那开了十年、跑了二十万公里的爱车里,有多少电子控制部件没有更换过?

说起来,嵌入式产品是个耐用品,只要硬件不坏,软件支持升级,用个十年八年实属稀松平常。但是,天毕竟有不测风云,有的时候,它就坏上那么一点点,就这么一点点,你就得跟它说再见。

比如,存储空间的二进制数据暴走,发生突变。

2

各位看官可能纳了闷了,二进制数据在存储空间里呆得好好的,一直做着安静的美男子,竟也会发生突变的么?

一般情况下自然是不会的。但是,二般情况下呢?

1573198063384851.jpg

就像向身体倍棒、看着能活到两百岁的你推销保险的那些人,他们经常带着对人生偶然性的深刻关切向你抛出直击灵魂深处的一问:你能保证永远不生病吗?

为了说明二进制的暴走,照例,先给大家简单地科下普。说句题外话,对于很多看官来说,洒家的科普都是“秃子头上的虱子明摆着的事”,但是为了扩大受众,洒家还是要多言几句。

“在很多嵌入式电子产品中,都是由微控制器里的Nor Flash存储并运行系统程序,Nor Flash的特点是Excute In Place,即不必把程序代码读到系统中,程序可以直接在Flash内运行。当然,如果有需要,你也可以把它读到中运行。微控制器及其片内的Nor Flash是基于CMOS工艺的集成电路芯片,随着工作频率越来越快、集成度越来越高、工艺尺寸越来越小,微控制器及其内部Flash越来越容易受到辐射效应的影响。辐射效应可能造成Nor Flash数据的破坏,从而使得基于程序指令运行的嵌入式系统的应用逻辑发生混乱,带来不可意料的问题。”

毋庸多言,程序数据的一致性对产品整个生命周期内的功能稳定性和数据安全性尤为重要,而电子产品的寿命一般都在10年以上,那是夜也长梦也多,做为产品设计人员,不能没心没肺地对程序数据可能的破坏视而不见。

所以,得设计一种方法,检验电子产品程序Flash数据的一致性。

3

可是,程序数据那么多,不同产品的程序规模又不一致,怎么设计一个尽量通用的方法,验证程序空间数据的一致性呢?

要回答这个问题,先要搞明白程序数据长什么样子。

大家都知道,现在的IDE把应用程序编译、链接后会生成几种格式的程序数据文件,有elf格式、bin格式、s19格式。每种格式都有自己的历史渊源和用武之地,洒家分享的方法里用到的是S19文件格式。

说到S19,那是孩子没娘说来话长,但是咱们长话短说。

“S19的全称为Motorola format for EEPROM programming,是摩托罗拉公司为程序和数据文件定义的一种可打印的ASCII形式编码的s格式文件,以实现在不同的计算机平台之间传输程序代码和数据。

S19文件中的每一行数据为一条SRecord,以S0型SRecord开始,以S9型SRecord结束,以S2型SRecord存放Flash写入地址、程序数据、程序数据长度信息。”

聪明的小伙伴是不是发现了什么?

1573198096216660.jpg

对滴,程序数据就在S19文件里的S2型SRecord里面,我们可以用一个PC端的软件很容易地把程序数据的地址、内容、长度解析出来。篇幅有限,解析方法就不再赘述,小伙伴们可以自行脑补。

解析出来以后呢?当然是做某种运算,用这个运算结果来“标识”程序数据了。

这个套路是不是很熟悉?想想编程的本质是什么?就是数据+运算呀!

运算是一种模式pattern,你尽可以自由选择,可以对数据累加求和,或者求异或同或,也可以进行加密运算,当然,也可以选择用得非常之广的CRC32运算。

4

妥了,程序数据解析出来了,标识这个程序完整性的CRC32结果也出来了,这些信息提取工作都是在PC端进行的,电子产品的MCU端怎么办?

这就要借助一个叫做bootloader的东西了。

Bootloader在linux中用得非常普遍,它做好板级初始化后把数据导到里,然后加载操作系统。但是在这里的bootloader不是这种概念。

这里的bootloader是独立于应用程序的一段代码,它用来接收应用程序数据,把程序数据写入到相应地址的地址处,然后把程序完整性标识-CRC32结果存储下来,标记应用程序的有效性。

有了bootloader之后,你就可以从PC端下载应用程序了,这里指的是第一台产品。换句话说,第一台产品是不能用烧写器来下载的,要通过专属的协议来下载,后面的产品可以完全复制第一台产品里的程序数据用烧写器下载。

什么样的专属协议呢?这就要看你的产品上有什么接口了。RS232-RS485-CAN都行,总之,在下载应用程序Flash数据的过程中,上位机解析S19文件,把一条条SRecord发给下位机,bootloader解析出来地址和数据,调用driver把程序数据存到程序地址空间中,说句题外话,S19文件实际包括好几段,每个段都有多条SRecord,bootloader要把分段信息提取出来并存储。

解析并存储的过程中,bootloader同时对程序数据做着CRC32运算,下载完程序后,上位机把CRC32结果发下来,两相对照,两者一致则表明应用程序烧录正确,然后在MCU内部数据Flash中存储校验信息,并将应用程序有效标志置为0x55,存入数据Flash中。

程序存好了,完整性标识-CRC32运算结果也存好了,应用程序标志为有效了,接下来,就万事俱备只欠东风了-MCU上电后要做程序一致性验证了!

在产品运行阶段,上电后,MCU首先跳入Bootloader的地址空间运行,检查应用程序有效标志,如果读取到的有效标志为0x55,MCU跳入应用程序的地址空间运行。

在应用程序的初始化阶段,读取存储在数据Flash中的校验信息,根据校验信息中的分段尺寸,读取各个分段中的Flash数据,进行CRC32校验,并将计算结果和校验信息中的CRC32校验值进行比对,如果数据一致,表明程序Flash数据没有损坏,系统正常运行,如果不一致,表明程序Flash数据被损坏,进入跛行模式。

5

掰扯了半天,里面的知识点不少,不知道各位看官有没有完全理解。怎奈篇幅有限,不能铺展太过。洒家的本意当然是:“紧紧地握住您的手,热情的话儿说不完。”

当然,说一千道一万,洒家只是想提醒诸位:海可枯石可烂,程序存储的空间也会变!



关键词:RAMflash程序

评论


相关推荐

技术专区

关闭