OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15235|回复: 9

关于绝对地址定义变量的方式和区别 与 我在移植uCosii的时候遇到的一个问题

[复制链接]

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-1-9 16:22:45 | 显示全部楼层 |阅读模式
5金钱
为了学习uCosii,我做了一个原来写的普通裸机程序向uCosii移植的实验,系统能跑起来了,但是遇到一个语法问题:
程序中我定义了3个绝对地址变量:
原来的定义方式:
#define CBYTE(ADDR) __attribute__((at(ADDR)))
volatile unsigned int DataAddr0 CBYTE(0x08008000);
volatile unsigned int DataAddr1 CBYTE(0x08008004);
volatile unsigned int DataAddr2 CBYTE(0x08008008);

采用上述方式定义变量,编译后出现以下编译错误:
..\Output\TEST.axf: Error: L6985E: Unable to automatically place AT section test.o(.ARM.__AT_0x08008000) with required base address 0x08008000. Please manually place in the scatter file using the --no_autoat option. 
..\Output\TEST.axf: Error: L6985E: Unable to automatically place AT section test.o(.ARM.__AT_0x08008004) with required base address 0x08008004. Please manually place in the scatter file using the --no_autoat option. 
..\Output\TEST.axf: Error: L6985E: Unable to automatically place AT section test.o(.ARM.__AT_0x08008008) with required base address 0x08008008. Please manually place in the scatter file using the --no_autoat option. 
Not enough information to list image symbols.

于是我采用了另一种方式来实现:
#define  DataAddr0 (*(volatile unsigned int *)0x08008000)
#define  DataAddr1 (*(volatile unsigned int *)0x08008004)
#define  DataAddr2 (*(volatile unsigned int *)0x08008008)
编译可以通过,于是我产生了疑问:
1. 这两种定义绝对变量的方式有什么区别。
2. 如果不改变原有定义变量的方式,编译错误如何解决。
3. 为什么原来裸机程序采用第一种定义方式可以通过而加入了uCosii以后就不可以了。

以上问题请各位大神帮忙解决一下, 不胜感激。

最佳答案

查看完整内容[请看2#楼]

volatile unsigned int DataAddr0 CBYTE(0x08008000);  第一种方法,编译器帮助分配管理,可以确保这个空间是专用的,不会被其它变量占用; define  DataAddr0 (*(volatile unsigned int *)0x08008000)  第二种方法,是程序员的个人行为,就是定义个指针指向这个址,不能确保这个空间没有被其它变量,或者堆栈之类的占用。  这种方法读没问题,去写如果已经被 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-1-3
在线时间
1 小时
发表于 2015-1-9 16:22:46 | 显示全部楼层
volatile unsigned int DataAddr0 CBYTE(0x08008000);
 第一种方法,编译器帮助分配管理,可以确保这个空间是专用的,不会被其它变量占用;

define  DataAddr0 (*(volatile unsigned int *)0x08008000)
 第二种方法,是程序员的个人行为,就是定义个指针指向这个址,不能确保这个空间没有被其它变量,或者堆栈之类的占用。
 这种方法读没问题,去写如果已经被其它变量占用的情况,有可能会引起程序功能出错。

总结:
   第二种方法只适合于定义操作SFR区.
   第一种方法适合操作内存。

声明:个人浅见,供参考,欢迎补充!
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11536
金钱
11536
注册时间
2014-4-1
在线时间
1313 小时
发表于 2015-1-9 16:55:58 | 显示全部楼层
定义方法与开发平台有关,不同平台则方法不同,其他不懂了。
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
 楼主| 发表于 2015-1-9 17:21:44 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
前后的开发工具都是keil5,第一种方式也是在网上查到的,所以不怎么了解这种定义方式……
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
 楼主| 发表于 2015-1-9 20:48:44 | 显示全部楼层
帖子不要沉哇,求助大神啊!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-1-9 23:01:12 | 显示全部楼层
这个还真没遇到过,帮顶下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
 楼主| 发表于 2015-1-11 10:28:01 | 显示全部楼层
回复【6楼】lemax:
---------------------------------
谢谢!受教了!
回复

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-9-1
在线时间
0 小时
发表于 2015-1-21 21:24:04 | 显示全部楼层
回复【3楼】shimengdacs:
---------------------------------
你好,请问怎么用 __attribute__进行函数地址的绑定,谢谢!
回复

使用道具 举报

28

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2013-10-18
在线时间
72 小时
发表于 2021-4-16 14:25:43 | 显示全部楼层
  1. // place the RO variable in a section called .ARM.__at_0x0000
  2. const int foo __attribute__((section(".ARM.__at_0x0000"))) = 10;
  3.         
  4. // place the RW variable in a section called .ARM.__at_0x4000
  5. int bar __attribute__((section(".ARM.__at_0x4000"))) = 100;
  6.         
  7. // place "variable" in a section called .ARM.__at_0x00008000
  8. int variable __attribute__((section(".ARM.__at_0x00008000")));
复制代码

..................
1.png
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-3-2
在线时间
15 小时
发表于 2021-6-17 19:34:04 | 显示全部楼层

你贴的这个写法,如果是有初始值的全局变量,在ARM编译器6下,就会报楼主贴出来的错误,只能自己修改scatter文件来实现。如果是没有初始值的全局变量,语法要改成__attribute__((section(".bss.ARM.__at_0x00008000")))
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 21:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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