1、 文檔目標(biāo)
在嵌入式系統(tǒng)開(kāi)發(fā)中,通過(guò)MDK(Microcontroller Development Kit)進(jìn)行工程配置,將指定的變量存儲(chǔ)到指定的內(nèi)存地址上是一項(xiàng)非常重要的技術(shù)。這項(xiàng)操作不僅能夠滿足特定硬件架構(gòu)的需求,還能優(yōu)化系統(tǒng)的性能和資源利用率。本文將詳細(xì)探討如何通過(guò)MDK的工程配置實(shí)現(xiàn)這一目標(biāo),并從多個(gè)角度分析其背后的原理、應(yīng)用場(chǎng)景以及注意事項(xiàng)。
2、 問(wèn)題場(chǎng)景
在項(xiàng)目工程的開(kāi)發(fā)過(guò)程中,通常需要對(duì)Flash、SRAM等存儲(chǔ)器進(jìn)行分區(qū)規(guī)劃,以滿足不同的功能需求。例如:
● Bootloader與應(yīng)用程序分離:為了支持固件升級(jí),通常需要將Bootloader代碼與應(yīng)用程序代碼分別存儲(chǔ)在不同的Flash區(qū)域。
● 關(guān)鍵數(shù)據(jù)存儲(chǔ):某些關(guān)鍵變量(如校準(zhǔn)參數(shù)、設(shè)備狀態(tài)等)需要存儲(chǔ)在特定的非易失性存儲(chǔ)區(qū)域,以便在系統(tǒng)斷電后仍能保留。
● 性能優(yōu)化:將頻繁訪問(wèn)的變量放置在高速緩存或特定的RAM區(qū)域,可以顯著提升系統(tǒng)性能。
因此,如何通過(guò)MDK工具鏈將變量精確地映射到指定的內(nèi)存地址,成為嵌入式開(kāi)發(fā)中的一個(gè)常見(jiàn)需求。
3、軟硬件環(huán)境
1)、軟件版本:MDK 5.38a
2)、電腦環(huán)境:Windows 11
3)、外設(shè)硬件:無(wú)
4、解決方法
1)、首先,需要在Options->Target中去規(guī)劃出一個(gè)內(nèi)存地址(如圖4-1),在Read/write Memory Areas中的RAM1中去設(shè)置內(nèi)存的起始地址和內(nèi)存的大小。并且勾選上前面的default。

圖4-1
2)、然后,切換在Linker欄中。取消勾選Use Memory Layout from Target Dialog,讓?duì)蘓ision不根據(jù)Target和Properties對(duì)話框中提供的內(nèi)存信息創(chuàng)建一個(gè)鏈接器分散文件。而由下面的Scatter Flies中去定義分散加載文件的內(nèi)存劃分。點(diǎn)擊Edit...可以去編輯文件。(如圖4-2)

圖4-2
3)、在打開(kāi)的分散加載文件中,去定義剛才在Target中規(guī)劃的內(nèi)存地址。如圖4-3中的紅框處。將這個(gè)內(nèi)存段用sdram_area字段來(lái)標(biāo)識(shí)。

圖4-3
4)、然后,在源文件中,將利用宏定義去用SDRAM_AREA_ATTRIBUTES標(biāo)識(shí)符去標(biāo)識(shí)__attribute__((section("sdram_area")))語(yǔ)句。在使用的時(shí)候,就可以按照下面代碼段中的方式去使用。
#define SDRAM_AREA_ATTRIBUTES __attribute__((section("sdram_area")))
int SDRAM_AREA_ATTRIBUTES test_num = 10;
char buf[20]SDRAM_AREA_ATTRIBUTES;
5)、定義好變量后,在源文件中調(diào)用了該變量后,可以在Map文件中看到定義的變量目前存儲(chǔ)在指定的地址上。(如圖4-5)

圖4-5