嵌入式軟件開發(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)注
5082文章
19104瀏覽量
304829 -
編譯器
+關(guān)注
關(guān)注
1文章
1623瀏覽量
49108
原文標(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)先 登錄
相關(guān)推薦
評(píng)論