реклама на сайте
подробности

 
 
> ZLib для ARM, Где найти сорцы
Hexxx
сообщение Nov 27 2007, 17:22
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 29-03-06
Пользователь №: 15 592



Ищу имплементацию с учетом выравнивания буфера по 4 байта, и которая юзает как можно меньше RAM (мне в AT91 запихнуть надо). Знает кто-нить где взять?

Или может какой-то другой алгоритм для сжатия?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение Nov 27 2007, 19:23
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



http://www.zlib.net/ - A Massively Spiffy Yet Delicately Unobtrusive Compression Library.

У меня поставилась на ARM без малейших проблем.
Go to the top of the page
 
+Quote Post
Hexxx
сообщение Nov 28 2007, 10:19
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 29-03-06
Пользователь №: 15 592



Цитата(sergeeff @ Nov 27 2007, 23:23) *
http://www.zlib.net/ - A Massively Spiffy Yet Delicately Unobtrusive Compression Library.

У меня поставилась на ARM без малейших проблем.

Поставилась - это только 10% всех проблем. Оно виснет/вылетает по exception при работе на всяких там операциях типа:
Цитата
#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
if (*((unsigned char *)(&endian)))

Потому что проц настроен на проверку выравнивания памяти. Т.е. если
R0 = 0x1000;
STRB R1,[R0] - отработает нормально. Т.к. в R0 адрес кратный 4.

А если
R0 = 0x1001;
STRB R1,[R0] - завалится. Т.к. в R0 адрес некратный 4.

Если нужно писать по адресу 0x1001 должен генериться вот такой код:
R0 = 0x1000;
STRB R1,[R0,#1]

Сорцы zlib должны учитывать выравнивание памяти. Пока что не могу нигде найти.

p.s. Может как-то настроить можно компилер? Я на IAR'e.

Сообщение отредактировал Hexxx - Nov 28 2007, 10:20
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 28 2007, 10:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Hexxx @ Nov 28 2007, 13:19) *
R0 = 0x1001;
STRB R1,[R0] - завалится. Т.к. в R0 адрес некратный 4.

STRB никогда не завалится, ибо байты можно писать как угодно.

Цитата(Hexxx @ Nov 28 2007, 13:19) *
Если нужно писать по адресу 0x1001 должен генериться вот такой код:
R0 = 0x1000;
STRB R1,[R0,#1]

Способ адресации никак не влияет на корректность обращения к памяти.
Go to the top of the page
 
+Quote Post
Hexxx
сообщение Nov 28 2007, 12:40
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 29-03-06
Пользователь №: 15 592



Цитата(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 с учетом выравнивания?

Сообщение отредактировал Hexxx - Nov 28 2007, 12:40
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 00:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016