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