#pragma pack(push,1)
typedef struct
{
unsigned short it;
float f;
} OUTDATA;
#pragma pack(pop)
OUTDATA *p_out;//當前值
float GetInFloat(int cc)
{
float f=1.23;
return f;
}
int CalculateF(float *data)
{
*data = GetInFloat(0); //arm中該方式會觸發SIGBUS信號,Alignment trap(訪問非對齊記憶體空間出錯)
return 1;
}
int main(int argc, char *argv[])
{
p_out=new OUTDATA;
memset(p_out,0,sizeof(OUTDATA));
CalculateF(&p_out->f);
return 0;
}
上面代碼有問題,因為data地址除以4除不整,會報下面的錯誤Alignment trap: not handling instruction edc37a00 at [<0001061c>]
Unhandled fault: alignment exception (0x801) at 0x0119500a
pgd = 8a7dc000
[0119500a] *pgd=8a6c8831, *pte=8c5be75f, *ppte=8c5bec7f
Bus error
但是如果把所有的float換成int就可以,但是換成int之后,data的地址還是不能整除4卻可以成功。
如果不把float改成int,把*data=https://bbs.csdn.net/topics/GetInFloat(0)直接換成*data=1.23也是正確的,很無語,不知為why
uj5u.com熱心網友回復:
檢查一下三個地方:1、mcu是32位,還是多少位的?僅僅是呼叫GetInFloat時,涉及到float的進堆疊和出堆疊。
2、編譯器的選項,是否使用地址自動對齊?
3、對float的支持,是軟支持還是硬支持,如果軟支持,編譯器地址自動對齊選項是否一致。
uj5u.com熱心網友回復:
感謝回復,我這個是ARM v7 32位的,編譯器支持自動處理位元組對齊,對float軟支持還是硬支持我也不清楚,我把*data=https://bbs.csdn.net/topics/GetInFloat(0)換成 float *test;test=GetInFloat(0);*data=*test;這樣轉一下也是可以得,暫時先這樣了。很郁悶,后面有時間再從匯編指令著手,看看為啥不行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/39131.html
標籤:嵌入開發(WinCE)
