華大HC32F460單片機(jī)內(nèi)部有一共192KB的SRAM,其中有32KB的快速SRAM區(qū),SRAMH。所謂SRAMH快速SRAM,就是在CPU運(yùn)行在高速頻率下,比如200Mhz,讀取內(nèi)部SRAM無需等待CPU時鐘周期,如手冊中的下圖:
其中只有SRAMH在全頻段內(nèi)是無需CPU等待的,其他SRAM在100Mhz以上都需要等待至少1個CPU周期。所以如果做一定的數(shù)據(jù)算法,需要大量頻繁使用RAM,最好把這些數(shù)據(jù)放在RAMH內(nèi),以增加CPU讀取RAM速度。本貼總結(jié)一個把4K數(shù)據(jù)內(nèi)存數(shù)組放在SRAMH的方法。下圖是HC32F460的內(nèi)部SRAM地址layout:
在程序中我要把一組4K數(shù)據(jù)放在0x1FFF8000地址開頭的4K size空間內(nèi)。方法就是使用ARM編譯器的屬性功能。uint8_t gReserve[4096] __attribute__((section(".ARM.__at_0x1FFF8000")));以上一段代碼就是定位4KB大小的gReserve數(shù)據(jù)到0x1FFF8000內(nèi)。另外我們在華大默認(rèn)工程內(nèi)編譯前,還需要把編譯器預(yù)留的RAM區(qū)去掉0x1FFF8000開頭 大小為4KB的區(qū)域。因?yàn)槟J(rèn)編譯選項(xiàng)內(nèi)設(shè)置了從0x1FFF8000開頭的ZI區(qū),所以默認(rèn)工程編譯會報錯。編譯選項(xiàng)修改前如圖:
編譯后查看.map 看看0x1FFF8000地址是怎么分配的:
看來我們分配成功了,我們用程序來驗(yàn)證一下:在程序開頭我們添加以下代碼打印出我們gReserve的地址。DPRINTF("[%s:%d]:gReserve addr:0x%x\n", __FUNCTION__, __LINE__, gReserve);看一下串口輸出:看來我們已經(jīng)驗(yàn)證沒有問題了,gReserve被分配在了內(nèi)部SRAMH快速 RAM內(nèi)(0x1FFF8000)。
最后,當(dāng)然不一定非得變量才能通過__attribute__方式放在內(nèi)部RAM內(nèi),其實(shí)函數(shù)或某段代碼也是可以通過__attribute__來放置在RAM內(nèi)。另外整個一個.c文件編譯出來的.o也可以通過keil file option的方式放在RAM內(nèi)。比如如下圖: