一、DTCM和AXI連接的RAM
STM32H7系列處理器內部有多個RAM空間,每個RAM空間的大小和響應速度都不一樣。這里面我們重點關注DTCM總線矩陣連接的128KB RAM和AXI總線矩陣連接的512KB RAM。
DTCM RAM 128KB:MDK配置是IRAM1:起始地址是0x20000000,大小是0x20000,128KB
AXI RAM 512KB: MDK配置是IRAM2:起始地址是0x240000000,大小是0x80000,152KB
二、lds鏈接腳本的內存分配
通過上述的分析,我們知道AXI RAM空間要比DTCM RAM空間是要大很多的,那么我們lds鏈接腳本該如何設置,才能使上電后start_xx.s匯編文件啟動能將RW段、ZI段、HEAP、STACK能分配到AXI RAM 512KB 區域吶?取決于lds鏈接腳本的內存分配。首先我們分析一下RW段、ZI段、HEAP、STACK在內部RAM中是如何分配的(HEAP和STACK實際上也屬于ZI段),這里面有幾個概念需要清楚。通過下圖的描述,我們能看到各個段的含義。
RAM中上述的段分配情況通過以下圖表進行說明。從RAM起始地址開始依次存放RW-DATA,BSS、HEAP、STACK和剩余空間。這里舉例是以0x20000000開始的128KB AXI RAM進行舉例說明。
既然有兩個RAM存儲區,那么我們的RW-DATA、BSS、HEAP、STACK應該鏈接在哪一個RAM區,這個時候就需要用到.lds鏈接腳本,鏈接腳本的作用就是對RAM和FLASH的分配做指定。
在MDK里有兩種類型的鏈接腳本,一種鏈接腳本是MDK編譯器自動指定,用戶不需要關注,另外一種腳本是用戶自定義,通過自定義腳本設定多片RAM的指定,和每一片RAM的具體用法。
用戶自定義的用法是通過點擊魔術棒->linker->按照下圖的設置,然后點擊Edit按鈕就會打開鏈接腳本。
鏈接腳本的定義如下:通過注釋我們知道有倆片RAM區,一片是RW_IRAM1(DTCM RAM:128KB,地址是0x20000000),一片是RW_IRAM2(AXI RAM:512K,地址是0x24000000),這里配置為RW_IRAM1注釋掉不使用,使用RW_IRAM2。
.ANY (+RW +ZI),意思是將RW-DATA、ZI(BSS、HEAP、STACK)分配到RW_IRAM2內存區域。在程序上電啟動時就會將此RAM使用起來,程序運行的臨時變量、全局變量等都在RW_IRAM2中運行。
此時我們發現AXI RAM 128KB空間沒用到。如何將這個空間利用起來?rs485_sample_master.o (+RW +ZI)這句話的意思是將rs485_sample_master.c的這個文件中所有定義在RW_DATA段、ZI段的變量全部分布在RW_IRAM1這個RAM空間,也就是AXI RAM 128KB空間。
.ANY (axi_ram_128kb)這句話的意思是用戶可以將任意的變量等按照一定的規則定義到RW_IRAM1這個RAM空間,也就是AXI RAM 128KB空間, (axi_ram_128kb) 的含義是這個將RW_RAM1這個內存區聲明為axi_ram_128kb section。
在具體的C語言代碼中的定義方式如下:
我們查看.map文件可以看到具體的定義是否有效,或者通過串口查看變量分配地址。通過.map文件的查看,我們可以確定程序中定義的變量確實分配到0x20000000為起始地址的AXI RAM 128KB空間了。
rs485_sample_master.o文件的RW、ZI段也分配在了0x20000000為起始地址的AXI RAM 128KB空間了。
-
處理器
+關注
關注
68文章
19170瀏覽量
229182 -
RAM
+關注
關注
8文章
1367瀏覽量
114536 -
總線
+關注
關注
10文章
2869瀏覽量
87995
發布評論請先 登錄
相關推薦
評論