请选择 进入手机版 | 继续访问电脑版

芯虎论坛

 找回密码
 立即注册
查看: 695|回复: 0

华大HC32F460单片机变量定位到SRAMH快速SRAM内

[复制链接]

18

主题

27

帖子

216

积分

虎背熊腰

Rank: 3Rank: 3

积分
216
发表于 2021-4-13 10:01:32 | 显示全部楼层 |阅读模式
本帖最后由 yowen_2007 于 2021-4-13 10:08 编辑

华大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:

在程序中我要把一组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内。比如如下图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|芯虎论坛 ( 辽ICP备18019618号 )

GMT+8, 2021-6-22 22:51 , Processed in 0.119116 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表