我必須將源代碼移植到運行Linux的ARM平臺。不幸的是,我遇到了未對齊的內存訪問問題。源使用指針強制轉換和訪問。ARM未對齊內存訪問解決方法
下面的代碼像病毒一樣遍佈代碼庫。由於gcc -Wcast-align
命令行選項,我可以精確定位有問題的位置,但有超過一千個實例需要通過。
u = (IEC_BOOL);
(((*(IEC_LINT*)pSP).H < b.H)
|| (((*(IEC_LINT*)pSP).H == b.H) && ((*(IEC_LINT*)pSP).L < b.L))) ? 1 : 0);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP >> u);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP << -u);
u = (IEC_BYTE)((*(IEC_DINT*)pSP != b) ? 1 : 0);
*(IEC_DWORD*)pSP = (IEC_DWORD)(*(IEC_DWORD*)pSP & w);
(*(IEC_ULINT*)pSP).H += u.H;
(((*(IEC_ULINT OS_SPTR *)pSP).H == b.H)
&& ((*(IEC_ULINT OS_SPTR *)pSP).L > b.L))) ? 1 : 0);
u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 : 0);
使用echo 2 > /proc/cpu/alignment
上使得Linux內核解決這些問題,但應用程序的性能下降到一個點,是不能接受的了。
我在網上搜索了關於GCC(v4.4.1)編譯器的關鍵字__unaligned
或__packed
的內容,但至今爲空。
我認爲很多有代表性的代碼行可以用一個或多或少複雜的正則表達式/替換來修復,但現在,在我看到這樣做了一段時間之後,這種方法也會花費大量繁瑣的工作。
你們有什麼建議如何完成這項工作?我認爲一個gcc 4.5編譯器插件會過度殺傷,但是比正則表達式更好嗎?你可以提出什麼其他建議?不一定所有的問題都需要修正,因爲我仍然可以依賴內核來處理少數情況。
我很想開玩笑說,這應該被轉移到TheDailyWTF.com。 – Crashworks 2011-02-25 23:23:35
繼續我們對現代語言學的研究,這裏我們有一個嵌入式程序員常用的C語言樣本。大致翻譯成英文,上述文字的意思是「F *** YOU!」,儘管沒有一種自然語言能夠真實地表達對一切神聖的蔑視,蔑視一切神聖的東西,並且普遍無視這裏傳達的讀者的人性。 – Dmitri 2015-12-10 23:13:26