打印

请教:简单的外部存储器读写程序问题

[复制链接]
3039|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
klchang|  楼主 | 2011-11-21 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
sbit int1=P3^3;
void main()
{
volatile char xdata IO _at_ 0x0100;
char  a;
IO=0x01;
a=IO;
if(a==0x01) int1=0;
while(1);
}
使用Keil软件运行程序,报如下图错误,请教各位前辈,此程序到底有什么问题?(_at_ 的使用我是直接把帮助文件拷过来的)

相关帖子

沙发
yewuyi| | 2011-11-21 17:01 | 只看该作者
volatile char xdata IO _at_ 0x0100;


提示这个定义错误。

使用特权

评论回复
板凳
klchang|  楼主 | 2011-11-22 07:54 | 只看该作者
谢谢yewuyi前辈回帖!
问题已解决。
原因是
“volatile char xdata IO _at_ 0x0100;”
此语句无问题,问题在于此语句定义的位置不对,其应该在main函数之外定义,改正之后,程序运行和测试通过。

使用特权

评论回复
地板
ayb_ice| | 2011-11-22 07:58 | 只看该作者
应该是局部变量不允许绝对定位

使用特权

评论回复
5
hotpower| | 2011-11-22 08:08 | 只看该作者
把volatile去掉看看。

使用特权

评论回复
6
klchang|  楼主 | 2011-11-22 10:40 | 只看该作者
回5楼:
根据C51的帮助文档,最好把volatile加上。帮助文档相关具体内容如下:
To access XDATA peripherals using variables declared with the _at_ keyword, use the volatile keyword to ensure that the C compiler does not optimize out necessary memory accesses.

使用特权

评论回复
7
klchang|  楼主 | 2011-11-22 10:44 | 只看该作者
回5楼:
把volatile去掉,运行程序,依旧报相同错误。应该如4楼所说,局部变量不允许绝对定位。

使用特权

评论回复
8
hotpower| | 2011-11-22 13:50 | 只看该作者
可能只允许指针绝对定位。

使用特权

评论回复
9
klchang|  楼主 | 2011-11-22 15:23 | 只看该作者
回8楼:
允许绝对定位应该是全局变量,而非指针,因为从程序中看,可直接向定义的绝对定位的变量赋变量值,而不是赋给地址值。

使用特权

评论回复
10
hotpower| | 2011-11-22 16:03 | 只看该作者
指针就和定位无关了。

使用特权

评论回复
11
JLINGON| | 2011-11-22 16:27 | 只看该作者
volatile char xdata IO _at_ 0x0100;
看不懂  求教

使用特权

评论回复
12
klchang|  楼主 | 2011-11-22 16:31 | 只看该作者
应该是的,既然全局变量已经使用绝对定位(指定的地址),在主程序里,其地址就不能被改变了。

使用特权

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

本版积分规则

个人签名:个人理解,若有错误,敬请指正!

0

主题

606

帖子

3

粉丝