使用GCC在EEPROM中创建自定义部分时写入操作的意外行为

时间:2009-12-04 14:20:39

标签: gcc rtems

这是我的问题,

我在一个我们为太空项目制造的电路板中嵌入了一个应用程序。 该板使用LEON2处理器,它是SPARC v8的衍生物,我们也使用RTEMS作为操作系统。

在这个应用程序中,我们必须为EEPROM中的FS保存各种表的默认值,这样用户就可以根据需要修改它们而不必每次都这样做。

为实现这一点,我只创建了一个新的部分(.eeprom_data),并将其放在EEPROM中的地址0x6007cc40。它是通过使用specs文件和自定义链接器脚本完成的,该脚本将该部分放在正确的地址,并告诉编译器将某些变量放在同一部分中。

在这方面似乎工作得很好。 以下是该部分的objdump摘录和一个特定的var:

6 .eeprom_data  000033c0  6007cc40  6007cc40  00038a80  2**3
              CONTENTS, ALLOC, LOAD, DATA

6007fbda g     O .eeprom_data 00000002 Downlink_Priority_Vc1_default_value

唯一的问题是它似乎没有完全发挥作用。我的应用程序正常运行没有问题,但像这样的简单测试只能部分工作:

    Eeprom_ChipEnable(TRUE);
    managed_faulty_sectors_default_crc = 0x789A;
    tmp = managed_faulty_sectors_default_crc; 
    Eeprom_ChipEnable(FALSE);

应该在EEPROM中写入0x789A的写操作绝对没有 然而,读取操作完美无缺,并且可以正确地返回存储在存储器中的数据。

我真的不知道如何解决这个问题所以我希望有人可以帮我。

谢谢,Léo。

3 个答案:

答案 0 :(得分:1)

感谢您的回答。

出于某种原因,当硬件工程师设计我们的电路板时,他们不允许寻址单个16位地址只有32位地址。

答案 1 :(得分:0)

您是否确定在禁用EEPROM之前刷新了数据缓存(如果有)? 并且,EEPROM变量是否正确声明为volatile?

答案 2 :(得分:0)

您是否使用优化标志进行编译? 我猜想编译器会优化写入,除非managed_faulty_sectors_default_crc被声明为volatile。

另外,managed_faulty_sectors_default_crc如何映射到.eeprom_data部分 - objdump是否提供了关于它们是否正确映射的任何线索?