嵌入式軟件開發(fā)中一般會預(yù)留一些MCU資源(ROM,RAM,CPU Load等)以方便項目升級,即使是很成熟的產(chǎn)品,ROM資源也不會100%被使用。在嵌入式軟件構(gòu)建(Build)過程中,編譯器(Compiler)和鏈接器(Linker)會放置對應(yīng)的代碼和常量數(shù)據(jù)到ROM中。沒有被使用的ROM,編譯器和鏈接器會填充0或者不做任何處理(保留ROM擦除之后的值):比如為了半字/字(16-bit Halfword/32-bit Word)對齊,編譯器和鏈接器會填充0到相應(yīng)的ROM字節(jié) (8-bit Byte);而連續(xù)沒有使用的ROM,編譯器和鏈接器不做任何處理(保留ROM擦除之后的值0xFF)。正常情況下,MCU的程序指針(PC)會按照既定程序來運行。但是在有些極端情況下,程序指針有可能發(fā)生不可知的變化,從而指向了沒有使用的ROM地址,如果相應(yīng)地址包含的指令執(zhí)行一些非期望的操作,產(chǎn)生的影響是未知的(注意:嵌入式系統(tǒng)中未知的影響有可能是非常嚴重的,特別是一些高安全性的嵌入式系統(tǒng))。為了提高系統(tǒng)的健壯性,通常需要往沒有使用的ROM填充相應(yīng)的值,這個值可以讓系統(tǒng)快速恢復(fù)到可靠的狀態(tài)。
本文主要介紹如何在IAR Embedded Workbench中填充沒有使用的ROM來提高系統(tǒng)的健壯性。
填充沒有使用的ROM
在Linker中填充沒有使用的ROM
在IAR Embedded Workbench工程選項(Options)里面Linker選項里面Checksum:勾選“Fill unused code memory”, Fill pattern里面填充相應(yīng)的值(注意,該值與使用的MCU/CPU相關(guān),具體需要參考對應(yīng)的CPU指令手冊。原則是該值能夠讓MCU/CPU快速恢復(fù)到指定的狀態(tài))。這里以ARM Cortex-M為例,0xFF對應(yīng)的是未定義的指令(Undefined Instruction),運行改指令會觸發(fā)對應(yīng)的錯誤(Fault)。Start address和End address分別輸入ROM的起始地址和結(jié)束地址。
構(gòu)建(Build)成功之后,查看生成的map文件未使用的范圍部分(Unused ranges):
下載到目標板進行調(diào)試。
首先打開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,因為執(zhí)行未定義的指令會觸發(fā)錯誤(Fault)。
(注意:HardFault_Handler里面具體的操作需要根據(jù)系統(tǒng)的需求來定,但是最終一定要復(fù)位讓系統(tǒng)恢復(fù)到可靠的狀態(tài)。)
可以查看對應(yīng)的寄存器確認相關(guān)的Fault: Undefined instruction usage fault
總結(jié)
本文主要分析了沒有使用的ROM的潛在風(fēng)險并介紹了如何在IAR Embedded Workbench中填充沒有使用的ROM來提高系統(tǒng)的健壯性。
審核編輯:郭婷
-
嵌入式
+關(guān)注
關(guān)注
5060文章
18978瀏覽量
302225 -
編譯器
+關(guān)注
關(guān)注
1文章
1617瀏覽量
49019
原文標題:填充沒有使用的ROM來提高系統(tǒng)的健壯性
文章出處:【微信號:IAR愛亞系統(tǒng),微信公眾號:IAR愛亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論