2013-02-26 46 views
4

在XC888微控制器上编程时,我想为外部存储器xdata中的某些数据保存缓冲区。C51编译器 - 写入xdata

我做它像这样(只是举个例子,当我摆脱了不必要的代码):

Header.h

extern ubyte xdata rec_buffer[32]; 

Function.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中定义缓冲区,它工作得很好。 我在做什么错?有什么特别的方法我必须写入xdata?

+0

你是否试图通过调试器进行设置,并将其读回来?也许调试器不显示真正的值 – jeb 2013-02-27 08:57:30

+0

嗯,我试着把它读回到一个正常的uchar变量,然后看它是否得到所需的值。但它也得到0,所以我想调试器给我看正确的值。 – Toby 2013-02-27 09:52:59

+0

从哪里尝试访问缓冲区?从主程序或中断服务程序,或两者? – Lundin 2013-02-27 10:04:59

回答

5

不应该XRAM在0xF000(不是0x000000)?根据图7的位置:

http://www.keil.com/dd/docs/datashts/infineon/xc88xclm_ds.pdf

是链接的配置错误的地方吗?

+1

是的,检查出来 - 你是完全正确的 - 当我重新配置连接器,xdata位于0xF000它工作得很好。谢谢!! – Toby 2013-02-27 11:11:04

+0

@Toby:不客气:) – 2013-02-27 11:17:42

0

使用volatile关键字作为缓冲区,很可能变量被编译器跳过。如果您向内存或I/O空间写入值但未观察值或任何更改,则很可能您的变量已由编译器优化。

+0

嗯,我只是试了一下,这没有帮助。但我不明白这应该如何帮助。我的意思是即使编译器需要一些优化,它仍然存在。我的意思是我有指针,我有缓冲区,并通过调试,我也可以看到变量的内存和指向那里的指针。此外,编译器不给我任何关于变量不可访问的警告或错误 – Toby 2013-02-26 23:43:58