Обходной путь доступа к невыровненной памяти ARM

Мне нужно перенести исходный код с платформы ARM, на которой работает Linux. К сожалению, я столкнулся с проблемами невыровненного доступа к памяти. Источник использует приведение указателей и интенсивный доступ.

Код, подобный приведенному ниже, распространился по базе кода, как вирус. Я могу точно определить проблемные места с помощью параметра командной строки 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 on заставляет ядро ​​Linux исправлять проблемы, но производительность приложения снижается до неприемлемой точки.

Я поискал в сети что-то вроде __ unaligned или __ упаковано ключевое слово для компилятора GCC (v4.4.1), но пока не оказалось пустым.

Я думал, что многие проблемные строки кода можно исправить более или менее сложным regexp / replace, но теперь, сделав это некоторое время, я вижу, что этот подход также потребует огромного количества утомительной работы.

Ребята, у вас есть какие-нибудь предложения, как выполнить эту работу? Я думаю, что gcc 4. 5 было бы излишним, но есть ли что-то лучше, чем регулярные выражения? какие еще предложения вы можете придумать? Не обязательно все экземпляры проблем должны быть исправлены, поскольку я все еще могу полагаться на ядро ​​в нескольких более редких случаях.

10
задан trenki 25 February 2011 в 16:07
поделиться