华大HC32F460单片机内部有一共192KB的SRAM,其中有32KB的快速SRAM区,SRAMH。所谓SRAMH快速SRAM,就是在CPU运行在高速频率下,比如200Mhz,读取内部SRAM无需等待CPU时钟周期,如手册中的下图: 其中只有SRAMH在全频段内是无需CPU等待的,其他SRAM在100Mhz以上都需要等待至少1个CPU周期。所以如果做一定的数据算法,需要大量频繁使用RAM,最好把这些数据放在RAMH内,以增加CPU读取RAM速度。本贴总结一个把4K数据内存数组放在SRAMH的方法。下图是HC32F460的内部SRAM地址layout:
更多信息咨询请联系angel.qi:13827489351(微信与手机号码同步)
在程序中我要把一组4K数据放在0x1FFF8000地址开头的4K size空间内。方法就是使用ARM编译器的属性功能。uint8_t gReserve[4096] __attribute__((section(".ARM.__at_0x1FFF8000")));以上一段代码就是定位4KB大小的gReserve数据到0x1FFF8000内。另外我们在华大默认工程内编译前,还需要把编译器预留的RAM区去掉0x1FFF8000开头 大小为4KB的区域。因为默认编译选项内设置了从0x1FFF8000开头的ZI区,所以默认工程编译会报错。编译选项修改前如图:
修改后编译选项:我们看到IRAM1的起始地址和大小都相应的做了对应调整,这样编译程序才不会报错。 编译后查看.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内。比如如下图: |