|
|
|
|
| PC上执行正确的程序,用arm-linux-gcc编译后在开发板上为何跑得不正确 |
 PC上执行正确的程序,用arm-linux-gcc编译后在开发板上为何跑得不正确 - dfnanman [ 2005-07-03 21:18 | 409 byte(s)]
 Re:问题已解决,谢谢 - dfnanman [ 2005-07-07 00:01 | 975 byte(s)]
 Re: PC上执行正确的程序,用arm-linux-gcc编译后在开发板上为何跑得不正确 - manlou_hua [ 2005-07-06 10:07 | 123 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
本人在做一个mpeg4运动侦测的测试程序,在pc上的linux下跑通了,准备移植到arm cpu上跑,用arm-linux-gcc编译通过后,倒是可以执行,但结果不太正常,我估计是gcc和arm-linux-gcc的差异造成的,如字节对齐,和如:
struct xxx
{
int x:8;
int y:4;
};
之类的问题,但具体错在哪却不知道.有谁碰到过类似问题,请不吝赐教.
arm-linux-gcc和gcc有和差异,不知有何好文章可推荐?多谢.
|
|
|
----
sinkang
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
考虑两点:
1。编译器处理big endian/little endian时bit序的问题
2。arm和x86在big endian/little endian的问题
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
感谢诸位的回复,我已找到问题.
在ARM CPU上,可能由于简化硬件设计和指令的原因,不支持任意位置的多字节取数.而必须四字节对齐,如有一buffer中,内容如下:
unsigned char buf[10];
buf[0] = 0x00;
buf[1] = 0x11;
buf[2] = 0x22;
buf[3] = 0x33;
buf[4] = 0x44;
buf[5] = 0x55;
buf[6] = 0x66;
buf[7] = 0x77;
buf[8] = 0x88;
.
.
.
unsigned int tmp = *((unsigned int*)buf);
printf("tmp = %x
",tmp);
tmp = *((unsigned int*)(buf+2));
printf("tmp = %x
",tmp);
在ARM CPU上我们会得到如下结果:
0x33221100
0x11003322
而在PC上的结果是:
0x33221100
0x55443322
好象在《see mips run》中讲mips的指令时还专门提到过这种情况的CPU的指令设计的优劣
|
|
|
----
sinkang
|
|
[Original]
[Print]
[Top]
|
|
|