本帖最后由 碧云天书 于 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)
搞这个花了点时间,共享给大家,有需要的就拿去用。
|