C51编译器-写入扩展数据
在XC888微控制器上编程时,我想为外部存储器中的一些数据保存一个缓冲区C51编译器-写入扩展数据,c,embedded,microcontroller,8051,C,Embedded,Microcontroller,8051,在XC888微控制器上编程时,我想为外部存储器中的一些数据保存一个缓冲区xdata 我是这样做的(只是一个例子,我去掉了不必要的代码): 标题.h extern ubyte xdata rec_buffer[32]; 功能c ubyte xdata rec_buffer[32] = {0}; void foo() { //Option 1 rec_buffer[0] = 0xFF; // Doesn't work //Option 2 ubyte xd
xdata
我是这样做的(只是一个例子,我去掉了不必要的代码):
标题.h
extern ubyte xdata rec_buffer[32];
功能c
ubyte xdata rec_buffer[32] = {0};
void foo()
{
//Option 1
rec_buffer[0] = 0xFF; // Doesn't work
//Option 2
ubyte xdata *ptr_buf = rec_buffer;
ptr_buf[0] = 0xFF // Doesn't work
}
所以我不知道我在这里错过了什么。在这两种情况下,都没有数据写入缓冲区。(用调试器检查了它)。我还检查了指针指向它的地址-->它实际上指向外部内存(地址0x000000
,但这应该没有什么问题)
当我在xdata
中不定义缓冲区的情况下执行此操作时,它完全可以正常工作。
我做错了什么?是否有一些特殊的方式写入扩展数据 对缓冲区使用volatile关键字,编译器很可能跳过了变量。如果您向内存或I/O空间写入一个值,但没有观察到该值或任何更改,则很可能您的变量是由编译器优化的。XRAM不应该位于
0xF000
(而不是0x000000
)吗?如图7所示:
链接器的配置是否有问题?我刚试过,但没有用。但我也不认为这会有什么帮助。我的意思是,即使编译器进行了一些优化,它仍然存在。我的意思是,我有指针和缓冲区,通过调试,我还可以看到变量的内存和指向那里的指针。此外,编译器也没有给我任何关于变量不可访问的警告或错误。您是否尝试通过调试器对其进行设置,并将其读回?也许调试器没有显示真正的值。我试着将它读回一个普通的uchar变量,然后查看它是否得到了所需的值。但是它也得到了0,所以我想调试器向我显示了正确的值。您试图从哪里访问缓冲区?从主程序或中断服务例程,或两者?是的,检查出来-你完全正确-当我重新配置链接器时,扩展数据位于0xF000,它工作完全正常。非常感谢。