2012-12-14 46 views
0

我正在研究16位微控制器的一些C代码。当我在目标上调试应用程序时,最终会碰到AddressError ISR。我阅读了数据手册,它说如果您尝试读取或写入对齐到奇数内存地址的16位值,就会发生这种情况。我想我理解这意味着什么,但这看起来不对。并不意味着如果我要做出这样的结构:什么导致16位体系结构上的地址错误?

struct foo{ 
    uint8_t thing1; 
    uint16_t thing2; 
}; 

我永远不会读或写入thing2没有错误?如果不是,那么这是否意味着编译器会自动在事物1和事物2之间填充8位,以使事物2在偶地址上正确对齐?如果是这种情况,那么地址错误将如何发生?

+4

您可能需要在问题中添加更多详细信息。但请检查编译器中的对齐以确保它对齐到16位。通过对齐上面的结构可以工作。 – PeterJ

+0

检查处理器手册,查看哪些地址是合法的。然后检查你的链接器命令文件。 – anishsane

回答

0

大多数小尺寸处理器只允许有限的一组内存操作,因为未对齐的内存读取将不得不在两个或更多个周期内完成并增加了处理器的总体复杂度。

这通常不会在c代码中显示,因为堆栈变量和结构成员都与类型的本地宽度(或4或8个字节,以最小者为准)对齐。这可以用属性打包覆盖,以及将指向结构的指针重新分配给未对齐的地址。因此,人们可以很容易地熟悉地址错位异常。

虽然例如。英特尔8086在非对齐地址处支持16位读取,但在尝试访问字跨越段边界(偏移量为0xffff)时,仍然可以选择地址生成异常。

0

可能你需要改变默认的结构对齐。您可以在代码或编译器选项中使用编译指示。在GCC的情况下,它是-fpack-结构[= N]

0

您可以根据自己实例化这个:

struct foo{ 
    uint8_t thing1; 
    uint16_t thing2; 
}; 

可以对齐在偶数地址,但如果编译器是不是足够聪明就不会有添加填充因此事物2之间的事物2在奇数地点之间因此错误。要么更改成员顺序,要么搜索编译器文档(可能会使用一些编译指示预处理器指令),以便编译器帮助您为您调整数据。

相关问题