Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C51编译器-写入扩展数据_C_Embedded_Microcontroller_8051 - Fatal编程技术网

C51编译器-写入扩展数据

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

在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 xdata *ptr_buf = rec_buffer;
    ptr_buf[0] = 0xFF        // Doesn't work
}
所以我不知道我在这里错过了什么。在这两种情况下,都没有数据写入缓冲区。(用调试器检查了它)。我还检查了指针指向它的地址-->它实际上指向外部内存(地址
0x000000
,但这应该没有什么问题)

当我在
xdata
中不定义缓冲区的情况下执行此操作时,它完全可以正常工作。
我做错了什么?是否有一些特殊的方式写入扩展数据

对缓冲区使用volatile关键字,编译器很可能跳过了变量。如果您向内存或I/O空间写入一个值,但没有观察到该值或任何更改,则很可能您的变量是由编译器优化的。

XRAM不应该位于
0xF000
(而不是
0x000000
)吗?如图7所示:


链接器的配置是否有问题?

我刚试过,但没有用。但我也不认为这会有什么帮助。我的意思是,即使编译器进行了一些优化,它仍然存在。我的意思是,我有指针和缓冲区,通过调试,我还可以看到变量的内存和指向那里的指针。此外,编译器也没有给我任何关于变量不可访问的警告或错误。您是否尝试通过调试器对其进行设置,并将其读回?也许调试器没有显示真正的值。我试着将它读回一个普通的uchar变量,然后查看它是否得到了所需的值。但是它也得到了0,所以我想调试器向我显示了正确的值。您试图从哪里访问缓冲区?从主程序或中断服务例程,或两者?是的,检查出来-你完全正确-当我重新配置链接器时,扩展数据位于0xF000,它工作完全正常。非常感谢。