关于RAM空间变量的绝对定位及分配

[复制链接]
4117|6
手机看帖
扫描二维码
随时随地手机跟帖
XIEYUANBIN|  楼主 | 2011-12-20 20:39 | 显示全部楼层 |阅读模式
在目前的HI-TECH PICC中,BANK0.....BANK3这样的声明在默认情况下已经不起作用,编译器会根据RAM的使用情况尽量把变量全部安排在BANK0,我看了半天的用户手册测试也没有找到绝对定位的方法,相反,使用全局变量  unsigned long int A @ 0x70 这样的绝对定位却是非常有效的。以前的C教材中警告说这样的绝对定位编译器有可能不保留空间,转而会将其空间分配给其他变量,但目前还没发现编译器这样做,相反,如果0X70以前被别的变量占用,将0X70绝对定位后,原来占用该地址的变量被分配到其他空间。
这种绝对定位适用于多字节变量、数组、结构等多种形式,所定义的地址为数组或结构的第一字节地址
例如在下列声明中:
union CHUFA
{
struct
{
  unsigned char BEICHU_1;
  unsigned char BEICHU_2;
  unsigned char BEICHU_3;
  unsigned char BEICHU_4;
}BEI_CHU;
unsigned long int BEICHU2;

}BEICHU @ 0X70;
0x70为结构体成员 unsigned char BEICHU_1的地址,结构体下面的其他成员的地址依次递增,0X70也为联合体中的成员 unsigned long int BEICHU2 的首地址,同时也是整个联合体 BEICHU的首地址,整个联合体占用0X70--0X73 共4个字节RAM空间,
XIEYUANBIN|  楼主 | 2011-12-20 20:47 | 显示全部楼层
欢迎拍砖

使用特权

评论回复
yewuyi| | 2011-12-20 21:28 | 显示全部楼层
好像在PICC9.70以后的版本中就已经是这样了,BANK0.....BANK3不写也已经无所谓了,编译器会自动根据变量数量分配地址。
但绝对定位可能还有一些问题,所以如果一定要绝对定位变量的话,最好还是从最后一个地址向前倒推。

使用特权

评论回复
XIEYUANBIN|  楼主 | 2011-12-21 08:25 | 显示全部楼层
这个在相应芯片的头文件里面都是这样绝对定位的。可参考一下

使用特权

评论回复
Ryanhsiung| | 2011-12-21 08:50 | 显示全部楼层
学习了

使用特权

评论回复
asspeed| | 2011-12-21 10:42 | 显示全部楼层
中档型的还是可以使用bankx限定符,但是要在编译设置中-compiler->address qualifiers->选择request.
对于增强型中档型家族,你也可以使用Bankx限定符,但是只能最多到bank3,其他就识别不了了,所以你需要分配到bank4以后,你只能用@绝对定址的方式。但是一般来说已经不需要这类限定符了。

使用特权

评论回复
mcumail| | 2015-10-21 08:28 | 显示全部楼层
mark,留作以后试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

2078

帖子

16

粉丝