如何在IAR Embedded Workbench中填充提高系统的健壮性

嵌入式软件开发中一般会预留一些mcu资源(rom,ram,cpu load等)以方便项目升级,即使是很成熟的产品,rom资源也不会100%被使用。在嵌入式软件构建(build)过程中,编译器(compiler)和链接器(linker)会放置对应的代码和常量数据到rom中。没有被使用的rom,编译器和链接器会填充0或者不做任何处理(保留rom擦除之后的值):比如为了半字/字(16-bit halfword/32-bit word)对齐,编译器和链接器会填充0到相应的rom字节 (8-bit byte);而连续没有使用的rom,编译器和链接器不做任何处理(保留rom擦除之后的值0xff)。正常情况下,mcu的程序指针(pc)会按照既定程序来运行。但是在有些极端情况下,程序指针有可能发生不可知的变化,从而指向了没有使用的rom地址,如果相应地址包含的指令执行一些非期望的操作,产生的影响是未知的(注意:嵌入式系统中未知的影响有可能是非常严重的,特别是一些高安全性的嵌入式系统)。为了提高系统的健壮性,通常需要往没有使用的rom填充相应的值,这个值可以让系统快速恢复到可靠的状态。
本文主要介绍如何在iar embedded workbench中填充没有使用的rom来提高系统的健壮性。
填充没有使用的rom
在linker中填充没有使用的rom
在iar embedded workbench工程选项(options)里面linker选项里面checksum:勾选“fill unused code memory”, fill pattern里面填充相应的值(注意,该值与使用的mcu/cpu相关,具体需要参考对应的cpu指令手册。原则是该值能够让mcu/cpu快速恢复到指定的状态)。这里以arm cortex-m为例,0xff对应的是未定义的指令(undefined instruction),运行改指令会触发对应的错误(fault)。start address和end address分别输入rom的起始地址和结束地址。
构建(build)成功之后,查看生成的map文件未使用的范围部分(unused ranges):
下载到目标板进行调试。
首先打开memory窗口查看未使用的rom范围部分是不是之前指定填充的值:这里看到都是0xff。
运行程序一段时间并暂停。打开register窗口,查看pc值。正常情况下,pc值不会跑到未使用的范围部分:这里pc值是0x0800_89ca,不在未使用的范围部分(0x0800_221c ~ 0x0800_2fff,0x0800_9274 ~ 0x080f_ffff)。
强制将pc值改变到未使用的范围部分(0x0800_221c ~ 0x0800_2fff,0x0800_9274 ~ 0x080f_ffff),比如0x080f_fffc:
运行程序。程序会跑到hardfault_handler,因为执行未定义的指令会触发错误(fault)。
(注意:hardfault_handler里面具体的操作需要根据系统的需求来定,但是最终一定要复位让系统恢复到可靠的状态。)
可以查看对应的寄存器确认相关的fault: undefined instruction usage fault
总结
本文主要分析了没有使用的rom的潜在风险并介绍了如何在iar embedded workbench中填充没有使用的rom来提高系统的健壮性。


基于分子设计和烷基链工程展示无活细胞侵染性的抗菌诊疗材料
工业互联网前景无可限量 那么智能IP网络又如何为工业互联网奠基?
百度网盘三星版闪亮登场:为用户云存储实现新便利
CAN网络通讯无法正常进行时该如何应对
18650锂电池和聚合物锂电池哪个更好
如何在IAR Embedded Workbench中填充提高系统的健壮性
PCB驳图技巧,pcb layout
AI时代将助力智慧医疗改变行业现状
未来5年智能手表年复合增长率达到11%
华为新一代“万元神机”——Mate 20 RS保时捷设计设计正式首发开售
中国人工智能企业数全球第二 业界盼AI早日飞入寻常百姓家
Estimator如何使您能够轻松地在TensorFlow中构建线性模型
采用CTC6048与88E1340芯片实现三层全千兆路由交换机的设计
双路电流模式DC/DC转换器LT3501的性能特点及适用范围
京东携手新时达解决城市配送“最后一公里”的难题
小米新机打造一亿像素,高像素是否已成手机新门槛?
VCC、VDD、VEE、VSS、VBAT具有什么样的关系
运算放大器供电过压保护电路图
五大焊接机器人品牌介绍
面试常问的16个C语言问题