在一個實際的項目中,Flash的使用會進行專門的安排,分成不同的區域供不同的目的使用。最常見的是分成bootloader區和主程序區。對于有些需要在掉電后保存數據的,還會分配一段區域保存這些重要的數據,這一塊兒我們就叫它eeprom吧。
通常bootloader會放在flash最開始的地方,eeprom放在flash最后,具體大小需要根據實際的項目需要分配。
這種情況下需要對鏈接文件進行修改,主要是改一下main app的起始地址,否則默認情況下都是存放在flash最開始的地方,main app就會把bootloader覆蓋掉。
在linux下,后綴為ld的就是鏈接文件,它里邊有這么一段內容:
MEMORY就是用來給系統分配存儲空間的,包括RAM、FLASH、外部存儲等等。上圖中是main app的分配情況。這個示例中,flash的起始地址是0x08000000,給bootloader留了4k(0x1000)的空間,所以main app的起始地址ORIGIN就是0x08001000,長度的話32k減去4k剩下27k。這樣在鏈接的時候就以0x08001000為基準往后安排。
另外還有一種情況需要在鏈接文件中修改。我們在開發的時候有時候想要某些特定的數據或代碼保存在特定的flash地址處,這個時候就可以通過在鏈接文件中添加這個特定的段空間來搞定。比如下面的例子
它在main app的最開始存放向量表,之后存放軟件版本信息,接下來才是代碼段。
分配好空間后,需要給自定義的段起一個名字,以便在程序中調用。
關鍵字SECTIONS下就是各個數據段的具體分配情況,段名.isr_vector指定的內容放在FLASH_VECTAB下,.firmware_info指定的內容放在FLASH_VERSION下。在KEEP后括號內的名稱就是代碼中用來指定的段名。具體使用方法如下:
匯編:
這個很少用到,除非你用匯編寫代碼。
C:
通過上面的操作,就可以把指定的數據放到flash特定的地方。
!!!:不同的編譯器實現的細節和用到的關鍵字不一樣,需要查看其具體的幫助手冊。
-
處理器
+關注
關注
68文章
19404瀏覽量
230797 -
FlaSh
+關注
關注
10文章
1642瀏覽量
148445 -
Linux
+關注
關注
87文章
11342瀏覽量
210150 -
編譯器
+關注
關注
1文章
1642瀏覽量
49240 -
bootloader
+關注
關注
2文章
235瀏覽量
45690
發布評論請先 登錄
相關推薦
評論