嵌入式軟件開發(fā)中一般會(huì)預(yù)留一些MCU資源(ROM,RAM,CPU Load等)以方便項(xiàng)目升級(jí),即使是很成熟的產(chǎn)品,ROM資源也不會(huì)100%被使用。在嵌入式軟件構(gòu)建(Build)過程中,編譯器(Compiler)和鏈接器(Linker)會(huì)放置對(duì)應(yīng)的代碼和常量數(shù)據(jù)到ROM中。沒有被使用的ROM,編譯器和鏈接器會(huì)填充0或者不做任何處理(保留ROM擦除之后的值):比如為了半字/字(16-bit Halfword/32-bit Word)對(duì)齊,編譯器和鏈接器會(huì)填充0到相應(yīng)的ROM字節(jié) (8-bit Byte);而連續(xù)沒有使用的ROM,編譯器和鏈接器不做任何處理(保留ROM擦除之后的值0xFF)。正常情況下,MCU的程序指針(PC)會(huì)按照既定程序來運(yùn)行。但是在有些極端情況下,程序指針有可能發(fā)生不可知的變化,從而指向了沒有使用的ROM地址,如果相應(yīng)地址包含的指令執(zhí)行一些非期望的操作,產(chǎn)生的影響是未知的(注意:嵌入式系統(tǒng)中未知的影響有可能是非常嚴(yán)重的,特別是一些高安全性的嵌入式系統(tǒng))。為了提高系統(tǒng)的健壯性,通常需要往沒有使用的ROM填充相應(yīng)的值,這個(gè)值可以讓系統(tǒng)快速恢復(fù)到可靠的狀態(tài)。
本文主要介紹如何在IAR Embedded Workbench中填充沒有使用的ROM來提高系統(tǒng)的健壯性。
填充沒有使用的ROM
在Linker中填充沒有使用的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)試。
首先打開Memory窗口查看未使用的ROM范圍部分是不是之前指定填充的值:這里看到都是0xFF。
運(yùn)行程序一段時(shí)間并暫停。打開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)的需求來定,但是最終一定要復(fù)位讓系統(tǒng)恢復(fù)到可靠的狀態(tài)。)
可以查看對(duì)應(yīng)的寄存器確認(rèn)相關(guān)的Fault: Undefined instruction usage fault
總結(jié)
本文主要分析了沒有使用的ROM的潛在風(fēng)險(xiǎn)并介紹了如何在IAR Embedded Workbench中填充沒有使用的ROM來提高系統(tǒng)的健壯性。
審核編輯:郭婷
-
嵌入式
+關(guān)注
關(guān)注
5152文章
19672瀏覽量
317534 -
編譯器
+關(guān)注
關(guān)注
1文章
1662瀏覽量
50218
原文標(biāo)題:填充沒有使用的ROM來提高系統(tǒng)的健壯性
文章出處:【微信號(hào):IAR愛亞系統(tǒng),微信公眾號(hào):IAR愛亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
溝槽填充技術(shù)介紹

基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數(shù)與變量?jī)?nèi)存布局優(yōu)化精控方法

IAR全面支持芯馳科技車規(guī)MCU芯片E3650
極海半導(dǎo)體與IAR開展全面合作
芯片底部填充膠填充不飽滿或滲透困難原因分析及解決方案

如何將項(xiàng)目從IAR遷移到Embedded Studio

如何提高嵌入式代碼質(zhì)量?
IAR與紫光同芯合作,全面支持THA6系列汽車芯片
PCB設(shè)計(jì)中填充銅和網(wǎng)格銅有什么區(qū)別?

PCB設(shè)計(jì)中填充銅和網(wǎng)格銅有什么區(qū)別?

IAR Systems最新版開發(fā)環(huán)境全面賦能芯??萍?2位MCU芯片

IAR支持旗芯微車規(guī)級(jí)MCU,助力汽車行業(yè)智能化發(fā)展
如何在激光雷達(dá)和接近檢測(cè)中利用高速比較器提高精度

防御性編程:讓系統(tǒng)堅(jiān)不可摧
底部填充工藝在倒裝芯片上的應(yīng)用

評(píng)論