无关风月 发表于 2019-11-22 15:31:50

MDK中将变量定义的固定RAM地址 使用特殊宏定义问题

本帖最后由 无关风月 于 2019-11-22 16:11 编辑

在IAR中,将变量定义到固定RAM地址 使用如下宏定义即可#define __AT_ADDR(__ADDR)    @ __ADDR


在MDK VC5版本编译器下
#define __AT_ADDR(__ADDR)   __attribute__((at(__ADDR)))

在MDK VC6版本编译器下 将temp定义的0x100位置 如下
uint32_ttemp__attribute__((section(".ARM.__at_0x100"))) ;

可不可以通过宏定义方式 实现VC6的#define __AT_ADDR(__ADDR)

应该是可以通过##实现的,但是试了发现不行?

有没有好的建议

eric2013 发表于 2019-11-22 18:20:53

#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

无关风月 发表于 2019-11-22 20:57:39

eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

原来这么简单呀,多谢硬汉哥:lol

无关风月 发表于 2019-11-22 21:33:21

eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

我想问一下,这个是不是只能定义在段首呀, 我的RMA是
#definem_data_start                  0x20000000
#definem_data_size                   0x00040000
我定义在段首0x20000000 - 0x20000200之间可以,定义在其他地方,就会提示和某些变量内存冲突,但是我后面的内存并没有使用,是不是MDK的规则这样设计的,防止瞎定义,让内存片段太多

eric2013 发表于 2019-11-23 09:49:34

无关风月 发表于 2019-11-22 21:33
我想问一下,这个是不是只能定义在段首呀, 我的RMA是
#definem_data_start                  0x20000 ...

你是不是用分散加载设置了,如果是的话,会出现冲突。

无关风月 发表于 2019-11-25 11:09:38

eric2013 发表于 2019-11-23 09:49
你是不是用分散加载设置了,如果是的话,会出现冲突。

分散加载会和这个冲突呀,知道了,多谢硬汉哥

wdliming 发表于 2019-12-20 12:55:20

eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

硬汉哥, 我有了你的方法,为啥,不能成功~~

eric2013 发表于 2020-1-9 11:41:53

wdliming 发表于 2019-12-20 12:55
硬汉哥, 我有了你的方法,为啥,不能成功~~

多试试。

wdliming 发表于 2020-1-9 11:56:50

eric2013 发表于 2020-1-9 11:41
多试试。

试了很多的,只有ac5是正确的

木偶 发表于 2024-4-16 16:24:23

eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

输入宏定义不能用,参数没法二次展开

eric2013 发表于 2024-4-17 08:17:13

木偶 发表于 2024-4-16 16:24
输入宏定义不能用,参数没法二次展开

试试这个正常不

#ifndef      __MEMORY_AT
#if   (defined (__CC_ARM))
    #define__MEMORY_AT(x)   __attribute__((at(x)))
#elif   (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
    #define__MEMORY_AT__(x)   __attribute__((section(".bss.ARM.__at_"#x)))
    #define__MEMORY_AT(x)   __MEMORY_AT__(x)
#else
    #define__MEMORY_AT(x)
    #warning Position memory containing __MEMORY_AT macro at absolute address!
#endif
#endif

/* Ethernet Rx DMA 描述符 */
ETH_DMADescTypeDefDMARxDscrTab __MEMORY_AT(0x30040000);

/* Ethernet Tx DMA 描述符 */
ETH_DMADescTypeDefDMATxDscrTab __MEMORY_AT(0x30040060);

/* Ethernet 接收缓冲 */
uint8_t Rx_Buff __MEMORY_AT(0x30040200);

页: [1]
查看完整版本: MDK中将变量定义的固定RAM地址 使用特殊宏定义问题