Цитата(aaarrr @ Nov 28 2007, 14:28)

STRB никогда не завалится, ибо байты можно писать как угодно.
Способ адресации никак не влияет на корректность обращения к памяти.
То есть программисты фирмы Samsung писавшие драйвер OneNand на самом деле не шарят, и делают лишнюю работу, когда сами руками проверяют выравнивание адресов:
Код
VOID OAM_Memcpy(VOID *pDst, VOID *pSrc, UINT32 nLen)
{
register INT32 nCnt;
register UINT8 *pD8, *pS8;
register INT32 nL = nLen;
register UINT32 *pD32, *pS32;
pD8 = (UINT8*)pDst;
pS8 = (UINT8*)pSrc;
if ( ((INT32)pD8 % sizeof(UINT32)) == ((INT32)pS8 % sizeof(UINT32)) ) // ВОТ ЭТО!!!
{
while ( (INT32)pD8 % sizeof(UINT32) )
{
*pD8++ = *pS8++;
nL--;
if( nL <= 0 )
return;
}
pD32 = (UINT32*)pD8;
pS32 = (UINT32*)pS8;
for (nCnt = 0; nCnt <(INT32)(nL / sizeof(UINT32)); nCnt++)
*pD32++ = *pS32++;
pD8 = (UINT8*)pD32;
pS8 = (UINT8*)pS32;
while( nL % sizeof(UINT32) )
{
*pD8++ = *pS8++;
nL--;
}
}
else
{
for( nCnt = 0; nCnt < nL; nCnt++)
*pD8++ = *pS8++;
}
Нашел вот еще на сайте ARM'a:
The ARM compiler assumes that all pointers are naturally-aligned (i.e. int* is word-aligned, short* is halfword-aligned, etc.).
You need to either explicitly tell the compiler when you are using unaligned pointers by using the __packed keyword or create a temporary char* pointer to access the addressКод
#include <string.h>
unsigned int * const dest;
void example (unsigned int * const unaligned_ptr)
{
__packed unsigned int * packed_ptr = unaligned_ptr;
char * temp_ptr = (char *)unaligned_ptr;
memcpy(dest, unaligned_ptr, 32); /* Unsafe */
memcpy(dest, (void *)packed_ptr, 32); /* Safe */
memcpy(dest, temp_ptr, 32); /* Safe */
}
То есть проблема реально существует. И сорцы с сайт'а zlib не будут работать там, где включено выравнивание указателей.
Еще раз спрашиваю, где есть сорцы zlib с учетом выравнивания?