嵌入式軟件開發中一般會預留一些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來提高系統的健壯性。
審核編輯:郭婷
-
嵌入式
+關注
關注
5105文章
19288瀏覽量
310197 -
編譯器
+關注
關注
1文章
1645瀏覽量
49472
原文標題:填充沒有使用的ROM來提高系統的健壯性
文章出處:【微信號:IAR愛亞系統,微信公眾號:IAR愛亞系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
IAR與紫光同芯合作,全面支持THA6系列汽車芯片
IAR Systems最新版開發環境全面賦能芯海科技32位MCU芯片

IAR支持旗芯微車規級MCU,助力汽車行業智能化發展
?IAR全面支持芯科集成CX3288系列車規RISC-V MCU

IAR全面支持芯馳科技E3系列車規MCU產品E3119/E3118

IAR與芯馳科技深化合作,共推汽車嵌入式開發新高度
IAR全面支持矽力杰SA32系列車規MCU
IAR通過多架構認證的靜態分析工具加速代碼質量自動化
芯海通用 MCU應用筆記 :在 IAR 及 MDK 開發環境下使用 printf 函數重定向移植差異指南
芯海應用筆記:通用 MCU 基于 IAR 芯片包 IAR9 開發指南
在IAR版本為Embedded Workbench 6.5 Kickstart 1.4 編繹報錯怎么解決?
“新一代”漏洞掃描管理系統:脆弱性管理平臺提高自身健壯性
IAR FOR ARM和IAR FOR STM8無法共存怎么解決?
如何在IAR IDE中調試基于Cortex-R52的RZ/T&N MPU的變量實時監控?

評論