硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2397|回复: 9
收起左侧

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

[复制链接]

5

主题

132

回帖

147

积分

初级会员

积分
147
发表于 2019-11-22 15:31:50 | 显示全部楼层 |阅读模式
本帖最后由 无关风月 于 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_t  temp  __attribute__((section(".ARM.__at_0x100"))) ;

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

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

有没有好的建议

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-11-22 18:20:53 | 显示全部楼层
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))
回复

使用道具 举报

5

主题

132

回帖

147

积分

初级会员

积分
147
 楼主| 发表于 2019-11-22 20:57:39 | 显示全部楼层
eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

原来这么简单呀,多谢硬汉哥  
回复

使用道具 举报

5

主题

132

回帖

147

积分

初级会员

积分
147
 楼主| 发表于 2019-11-22 21:33:21 | 显示全部楼层
eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-11-23 09:49:34 | 显示全部楼层
无关风月 发表于 2019-11-22 21:33
我想问一下,这个是不是只能定义在段首呀, 我的RMA是
#define  m_data_start                  0x20000 ...

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

使用道具 举报

5

主题

132

回帖

147

积分

初级会员

积分
147
 楼主| 发表于 2019-11-25 11:09:38 | 显示全部楼层
eric2013 发表于 2019-11-23 09:49
你是不是用分散加载设置了,如果是的话,会出现冲突。

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

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2019-12-20 12:55:20 | 显示全部楼层
eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-1-9 11:41:53 | 显示全部楼层
wdliming 发表于 2019-12-20 12:55
硬汉哥, 我有了你的方法,为啥,不能成功~~

多试试。
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2020-1-9 11:56:50

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

2

主题

33

回帖

39

积分

新手上路

积分
39
发表于 2024-4-16 16:24:23 | 显示全部楼层
eric2013 发表于 2019-11-22 18:20
#define __AT_ADDR(x) __attribute__((section(".ARM.__AT_"#x)))

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-4-17 08:17:13 | 显示全部楼层
木偶 发表于 2024-4-16 16:24
输入宏定义不能用,参数没法二次展开


试试这个正常不

  1. #ifndef      __MEMORY_AT
  2.   #if     (defined (__CC_ARM))
  3.     #define  __MEMORY_AT(x)     __attribute__((at(x)))
  4.   #elif   (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
  5.     #define  __MEMORY_AT__(x)   __attribute__((section(".bss.ARM.__at_"#x)))
  6.     #define  __MEMORY_AT(x)     __MEMORY_AT__(x)
  7.   #else
  8.     #define  __MEMORY_AT(x)
  9.     #warning Position memory containing __MEMORY_AT macro at absolute address!
  10.   #endif
  11. #endif
复制代码

  1. /* Ethernet Rx DMA 描述符 */
  2. ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT] __MEMORY_AT(0x30040000);

  3. /* Ethernet Tx DMA 描述符 */
  4. ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT] __MEMORY_AT(0x30040060);  

  5. /* Ethernet 接收缓冲 */
  6. uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_MAX_PACKET_SIZE] __MEMORY_AT(0x30040200);  
复制代码


回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 06:00 , Processed in 0.180671 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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