打印
[STM32H7]

将变量和数组定位到指定地址空间的办法

[复制链接]
889|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
碧云天书|  楼主 | 2020-2-9 13:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 碧云天书 于 2020-2-9 14:18 编辑

一个项目用到STM32H7采集ADC信号。为了加快运行速度,将大部分变量都放到了DTCM(0x20000000)中。但是,由于ADC要通过DMA采集数据,而DTCM不通DMA,因此欲将ADC存储空间放到AXI SRAM(0x24000000)中。

ARM Compiler V5和V6编译器对于设置地址的方式是不一样的,编写了如下宏定义,可以实现将变量定位到指定的地址空间中。

// 宏定义:将变量放到指定的内存地址
#if defined(__clang__)                //使用V6编译器(clang)
#define ALIGN_ADDRESS(buf, address) buf __attribute__((section(".ARM.__at_"#address)))
#elif defined (__CC_ARM)           //使用V5编译器(ARMCC)
#define ALIGN_ADDRESS(buf, address) buf __attribute__((at(address)))
#endif

下面的例子是将g_Spectrograph数组的首地址定位到AXI内存空间0x24000000上:
        ALIGN_ADDRESS(uint16_t g_Spectrograph[SPEC_PIXELS], 0x24000000);


ARM Compiler V5展开后等价于--> uint16_t g_Spectrograph[SPEC_PIXELS] __attribute__((at(0x24000000)));
ARM Compiler V6展开后等价于--> uint16_t g_Spectrograph[SPEC_PIXELS] __attribute__((section(".ARM.__at_0x24000000")));


编译后,查看.map文件,发现g_Spectrograph数组成功定位到了0x24000000。
    g_Spectrograph                           0x24000000   Data         512  bsp_spectro.o(.ARM.__AT_0x24000000)


搞这个花了点时间,共享给大家,有需要的就拿去用。

使用特权

评论回复
沙发
mmuuss586| | 2020-2-12 16:59 | 只看该作者
感谢分享

使用特权

评论回复
板凳
jiekou001| | 2020-2-12 20:05 | 只看该作者
没看明白。

使用特权

评论回复
地板
jiekou001| | 2020-2-12 20:11 | 只看该作者
这么做比较专业。

使用特权

评论回复
5
磨砂| | 2020-3-3 10:22 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
6
晓伍| | 2020-3-3 10:23 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
7
八层楼| | 2020-3-3 10:50 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
观海| | 2020-3-3 11:13 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
guanjiaer| | 2020-3-3 11:19 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
heimaojingzhang| | 2020-3-3 11:28 | 只看该作者
非常感谢楼主分享经验

使用特权

评论回复
11
keaibukelian| | 2020-3-3 11:38 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:红尘俗世偏逍遥 看风乍起 笑雨正飘

24

主题

330

帖子

23

粉丝