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)
应该是可以通过##实现的,但是试了发现不行?
有没有好的建议
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x))) eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))
原来这么简单呀,多谢硬汉哥:lol 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的规则这样设计的,防止瞎定义,让内存片段太多
无关风月 发表于 2019-11-22 21:33
我想问一下,这个是不是只能定义在段首呀, 我的RMA是
#definem_data_start 0x20000 ...
你是不是用分散加载设置了,如果是的话,会出现冲突。 eric2013 发表于 2019-11-23 09:49
你是不是用分散加载设置了,如果是的话,会出现冲突。
分散加载会和这个冲突呀,知道了,多谢硬汉哥 eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))
硬汉哥, 我有了你的方法,为啥,不能成功~~ wdliming 发表于 2019-12-20 12:55
硬汉哥, 我有了你的方法,为啥,不能成功~~
多试试。 eric2013 发表于 2020-1-9 11:41
多试试。
试了很多的,只有ac5是正确的 eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))
输入宏定义不能用,参数没法二次展开 木偶 发表于 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]