嵌入式軟件開(kāi)發(fā)中一般會(huì)預(yù)留一些MCU資源(ROM,RAM,CPU Load等)以方便項(xiàng)目升級(jí),即使是很成熟的產(chǎn)品,ROM資源也不會(huì)100%被使用。在嵌入式軟件構(gòu)建(Build)過(guò)程中,編譯器(Compiler)和鏈接器(Linker)會(huì)放置對(duì)應(yīng)的代碼和常量數(shù)據(jù)到ROM中。沒(méi)有被使用的ROM,編譯器和鏈接器會(huì)填充0或者不做任何處理(保留ROM擦除之后的值):比如為了半字/字(16-bit Halfword/32-bit Word)對(duì)齊,編譯器和鏈接器會(huì)填充0到相應(yīng)的ROM字節(jié) (8-bit Byte);而連續(xù)沒(méi)有使用的ROM,編譯器和鏈接器不做任何處理(保留ROM擦除之后的值0xFF)。正常情況下,MCU的程序指針(PC)會(huì)按照既定程序來(lái)運(yùn)行。但是在有些極端情況下,程序指針有可能發(fā)生不可知的變化,從而指向了沒(méi)有使用的ROM地址,如果相應(yīng)地址包含的指令執(zhí)行一些非期望的操作,產(chǎn)生的影響是未知的(注意:嵌入式系統(tǒng)中未知的影響有可能是非常嚴(yán)重的,特別是一些高安全性的嵌入式系統(tǒng))。為了提高系統(tǒng)的健壯性,通常需要往沒(méi)有使用的ROM填充相應(yīng)的值,這個(gè)值可以讓系統(tǒng)快速恢復(fù)到可靠的狀態(tài)。
本文主要介紹如何在IAR Embedded Workbench中填充沒(méi)有使用的ROM來(lái)提高系統(tǒng)的健壯性。
填充沒(méi)有使用的ROM
在Linker中填充沒(méi)有使用的ROM
在IAR Embedded Workbench工程選項(xiàng)(Options)里面Linker選項(xiàng)里面Checksum:勾選“Fill unused code memory”, Fill pattern里面填充相應(yīng)的值(注意,該值與使用的MCU/CPU相關(guān),具體需要參考對(duì)應(yīng)的CPU指令手冊(cè)。原則是該值能夠讓MCU/CPU快速恢復(fù)到指定的狀態(tài))。這里以ARM Cortex-M為例,0xFF對(duì)應(yīng)的是未定義的指令(Undefined Instruction),運(yùn)行改指令會(huì)觸發(fā)對(duì)應(yīng)的錯(cuò)誤(Fault)。Start address和End address分別輸入ROM的起始地址和結(jié)束地址。

構(gòu)建(Build)成功之后,查看生成的map文件未使用的范圍部分(Unused ranges):

下載到目標(biāo)板進(jìn)行調(diào)試。
首先打開(kāi)Memory窗口查看未使用的ROM范圍部分是不是之前指定填充的值:這里看到都是0xFF。

運(yùn)行程序一段時(shí)間并暫停。打開(kāi)Register窗口,查看PC值。正常情況下,PC值不會(huì)跑到未使用的范圍部分:這里PC值是0x0800_89CA,不在未使用的范圍部分(0x0800_221C ~ 0x0800_2FFF,0x0800_9274 ~ 0x080F_FFFF)。

強(qiáng)制將PC值改變到未使用的范圍部分(0x0800_221C ~ 0x0800_2FFF,0x0800_9274 ~ 0x080F_FFFF),比如0x080F_FFFC:

運(yùn)行程序。程序會(huì)跑到HardFault_Handler,因?yàn)閳?zhí)行未定義的指令會(huì)觸發(fā)錯(cuò)誤(Fault)。
(注意:HardFault_Handler里面具體的操作需要根據(jù)系統(tǒng)的需求來(lái)定,但是最終一定要復(fù)位讓系統(tǒng)恢復(fù)到可靠的狀態(tài)。)

可以查看對(duì)應(yīng)的寄存器確認(rèn)相關(guān)的Fault: Undefined instruction usage fault

總結(jié)
本文主要分析了沒(méi)有使用的ROM的潛在風(fēng)險(xiǎn)并介紹了如何在IAR Embedded Workbench中填充沒(méi)有使用的ROM來(lái)提高系統(tǒng)的健壯性。
審核編輯:郭婷
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20445瀏覽量
334008 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51600
原文標(biāo)題:填充沒(méi)有使用的ROM來(lái)提高系統(tǒng)的健壯性
文章出處:【微信號(hào):IAR愛(ài)亞系統(tǒng),微信公眾號(hào):IAR愛(ài)亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
在IAR Embedded Workbench for Renesas RH850中實(shí)現(xiàn)ROPI
瑞薩RL78F2x系列MCU在三種開(kāi)發(fā)環(huán)境下的選項(xiàng)字節(jié)與安全I(xiàn)D設(shè)置方法
漢思新材料:芯片底部填充膠可靠性有哪些檢測(cè)要求
CW32 MCU用什么IDE開(kāi)發(fā)?
如何在IAR Embedded Workbench for Arm中開(kāi)發(fā)和調(diào)試Infineon MOTIX MCU
使用J-Link Attach NXP S32K3導(dǎo)致對(duì)應(yīng)RAM區(qū)域被初始化成0xDEADBEEF
如何在 IAR Embedded Workbench for ARM 開(kāi)發(fā)環(huán)境中啟用可配置數(shù)據(jù)閃存并設(shè)置大?。?/a>
請(qǐng)問(wèn)如何在 Keil μVision 或 IAR EWARM 中使用觀察點(diǎn)進(jìn)行調(diào)試?
請(qǐng)問(wèn)如何在 IAR Embedded Workbench for ARM 開(kāi)發(fā)環(huán)境中啟用可配置數(shù)據(jù)閃存并設(shè)置大?。?/a>
「芯生態(tài)」杰發(fā)科技AC7870攜手IAR開(kāi)發(fā)工具鏈,助推汽車電子全棧全域智能化落地
溝槽填充技術(shù)介紹
基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數(shù)與變量?jī)?nèi)存布局優(yōu)化精控方法
IAR全面支持芯馳科技車規(guī)MCU芯片E3650
極海半導(dǎo)體與IAR開(kāi)展全面合作
芯片底部填充膠填充不飽滿或滲透困難原因分析及解決方案
如何在IAR Embedded Workbench中填充提高系統(tǒng)的健壯性
評(píng)論