在一個(gè)實(shí)際的項(xiàng)目中,F(xiàn)lash的使用會(huì)進(jìn)行專(zhuān)門(mén)的安排,分成不同的區(qū)域供不同的目的使用。最常見(jiàn)的是分成bootloader區(qū)和主程序區(qū)。對(duì)于有些需要在掉電后保存數(shù)據(jù)的,還會(huì)分配一段區(qū)域保存這些重要的數(shù)據(jù),這一塊兒我們就叫它eeprom吧。
通常bootloader會(huì)放在flash最開(kāi)始的地方,eeprom放在flash最后,具體大小需要根據(jù)實(shí)際的項(xiàng)目需要分配。
這種情況下需要對(duì)鏈接文件進(jìn)行修改,主要是改一下main app的起始地址,否則默認(rèn)情況下都是存放在flash最開(kāi)始的地方,main app就會(huì)把bootloader覆蓋掉。
在linux下,后綴為ld的就是鏈接文件,它里邊有這么一段內(nèi)容:
MEMORY就是用來(lái)給系統(tǒng)分配存儲(chǔ)空間的,包括RAM、FLASH、外部存儲(chǔ)等等。上圖中是main app的分配情況。這個(gè)示例中,flash的起始地址是0x08000000,給bootloader留了4k(0x1000)的空間,所以main app的起始地址ORIGIN就是0x08001000,長(zhǎng)度的話(huà)32k減去4k剩下27k。這樣在鏈接的時(shí)候就以0x08001000為基準(zhǔn)往后安排。
另外還有一種情況需要在鏈接文件中修改。我們?cè)陂_(kāi)發(fā)的時(shí)候有時(shí)候想要某些特定的數(shù)據(jù)或代碼保存在特定的flash地址處,這個(gè)時(shí)候就可以通過(guò)在鏈接文件中添加這個(gè)特定的段空間來(lái)搞定。比如下面的例子
它在main app的最開(kāi)始存放向量表,之后存放軟件版本信息,接下來(lái)才是代碼段。
分配好空間后,需要給自定義的段起一個(gè)名字,以便在程序中調(diào)用。
關(guān)鍵字SECTIONS下就是各個(gè)數(shù)據(jù)段的具體分配情況,段名.isr_vector指定的內(nèi)容放在FLASH_VECTAB下,.firmware_info指定的內(nèi)容放在FLASH_VERSION下。在KEEP后括號(hào)內(nèi)的名稱(chēng)就是代碼中用來(lái)指定的段名。具體使用方法如下:
匯編:
這個(gè)很少用到,除非你用匯編寫(xiě)代碼。
C:
通過(guò)上面的操作,就可以把指定的數(shù)據(jù)放到flash特定的地方。
!!!:不同的編譯器實(shí)現(xiàn)的細(xì)節(jié)和用到的關(guān)鍵字不一樣,需要查看其具體的幫助手冊(cè)。
-
處理器
+關(guān)注
關(guān)注
68文章
19329瀏覽量
230141 -
FlaSh
+關(guān)注
關(guān)注
10文章
1638瀏覽量
148158 -
Linux
+關(guān)注
關(guān)注
87文章
11314瀏覽量
209783 -
編譯器
+關(guān)注
關(guān)注
1文章
1635瀏覽量
49169 -
bootloader
+關(guān)注
關(guān)注
2文章
235瀏覽量
45642
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論