打印

不理解arm下的字节对齐问题,请指点

[复制链接]
2931|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlander|  楼主 | 2010-4-6 14:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
开发环境是ADS1.2。

写了多年的程序,我的一个工程近来出现莫名其妙的问题,具体现象是:
1种方法,如果全部代码都用C源代码编译,则正常。
2种方法,如果将其中的一部分代码做成静态库(.a文件),然后将另一部分代码跟.a文件编译,程序就会出现data abort的异常。

两种方法代码都是相同的,测试方法也一样。
第1种方法,没有异常,是不是就能够说明代码是可以工作的?
至于第2种方法为什么行不通,我现在也没找到原因,还请各位大侠指点制作.a文件的时候应该注意的事项。


现在严重怀疑跟字节对齐有关。
因为出问题的代码,是

uint32 i = pEventInfo->tSystemStatus;

pEventInfo是一个__packed结构体
tSystemStatus是一个uint16(unsigned short int)

如果把上面的代码注释掉,就不会有任何问题。

我查了有关字节对齐的资料。其中一篇**是,http://blog.21ic.com/user1/1425/archives/2008/49627.html

里面有一段说道:

6.对齐或非对齐读写访问带来问题
__packed struct STRUCT_TEST
{
          char a;
           int b;
           char c;
};
//定义如下结构此时b的起始地址一定是不对齐的
//在栈中访问b可能有问题,因为栈上数据肯定是对齐访问[from CL]

最后一句话非常关键,也让我非常迷惑。

于是我编写了一段测试代码
typedef __packed struct struct_a

{
           char a;
           int b;
           char c;
} STRUCT_A;
void test_emplty_function(void)
{
    STRUCT_A son;
    st.a = 1;
    st.b = 2;
    st.c = 3;
}
void test_struct(void)
{
    STRUCT_A father;
    st.a = 1;
    st.b = 2;
    st.c = 3;
    test_emplty_function();
}

int main (void)
{
    test_struct();
}

例子中的代码,我实验的结果是没有问题的。
实际上在我的工程中,结构体大部分都是这么用的。

按照**中的说法,“在栈中访问b可能有问题”,请问各位大侠,我例子中的father,son两个变量是不是在栈中?如果不是谁能给一段“有问题”的代码?

相关帖子

沙发
xlander|  楼主 | 2010-4-6 16:00 | 只看该作者
不是,是跟上位机通讯的时候用到一些通讯协议,所以就按字节对齐了

使用特权

评论回复
板凳
ejack| | 2010-4-6 20:26 | 只看该作者
LZ,你那两个测试函数中的结构体为什么是st呢。这程序编译都没报问题吗?
有什么地方特殊定义过吗?我好糊涂……

此外,就算是用son和father,按此程序来看一般也不会从栈调用。LZ可尝试把结构体作为形参传来传去多搞几层,总会被压进去的。

使用特权

评论回复
地板
xlander|  楼主 | 2010-4-7 08:12 | 只看该作者
应该是
void test_emplty_function(void)
{
    STRUCT_A son;
    son.a = 1;
    son.b = 2;
    son.c = 3;
}
void test_struct(void)
{
    STRUCT_A father;
    father.a = 1;
    father.b = 2;
    father.c = 3;
    test_emplty_function();
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

165

帖子

0

粉丝