开发环境是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两个变量是不是在栈中?如果不是谁能给一段“有问题”的代码? |