[an error occurred while processing this directive]
Делал вот так. размер уменьшается процентов на 30. (+)
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Сидоргек 02 сентября 2005 г. 16:20
В ответ на: Хочу ATMEGAой загрузить ACEX.... отправлено <font color=gray>rks</font> 02 сентября 2005 г. 13:17

Исходник программы - упаковщика:
////////////////////////////////////////////////////////////////////
#include

unsigned char buf[256000];
int blen = 0;

unsigned char res[256000];
int rlen = 0;

unsigned char msk[256000];
int mlen = 0;
int mbit = 0;

// Возвращает число одинаковых символов после того, на который указывает указатель
int SerLen(int from)
{
for (int i = from+1, n = 0; i < blen; i ++)
{
if (buf[i] != buf[from])
{
break;
}

n ++;
}

return n;
}

void Pack(int treshold)
{
rlen = 0;
mlen = 0;
msk[mlen] = 0;
mbit = 0;

for (int i = 0; i < blen;)
{
if (mbit > 7)
{
msk[++ mlen] = 0;
mbit = 0;
}

int sl = SerLen(i);

// Серия не длиннее байта
if (sl > 255)
{
sl = 255;
}

if ((buf[i] == 0) && (sl > treshold))
{
// Серия нулей
res[rlen++] = sl;
msk[mlen] |= 1 << mbit;

i += 1 + sl;
}
else
{
// Все остальное без сжатия
res[rlen++] = buf[i ++];
}

mbit ++;
}
}

// Контрольная распаковка
int tptr;
void UnpackedByte(unsigned char b)
{

if (buf[tptr++] != b)
{
printf("compare error in %d\n", tptr - 1);
}
}

void Unpack(void)
{
unsigned char n;

tptr = 0;

for (int pd = 0, bd = 0, mbit = 0; pd < rlen;)
{
if (mbit > 7)
{
bd ++;
mbit = 0;
}

if (msk[bd] & (1 << mbit))
{
n = res[pd++];

UnpackedByte(0);
while(n --)
{
UnpackedByte(0);
}
}
else
{
UnpackedByte(res[pd++]);
}

mbit ++;
}
}

void GenerateAssemblerOutput(char * fn)
{
// Сохраняю результат
FILE * outp = fopen ("altera.asm", "wt");

fprintf (outp, "; Упакованная прошивка Альтеры подготовлена из файла\n");
fprintf (outp, "; %s\n\n", fn);

fprintf (outp, "packed_data:", fn);
for (int i = 0, n = 8; i < rlen; i ++)
{
if (n == 8)
{
fprintf(outp, "\n\t.db\t");
n = 0;
}

fprintf(outp, "$%02X", res[i]);

if ((i < rlen-1) && (n < 7))
{
fprintf(outp, ", ");
}

n ++;
}
fprintf (outp, "\n\n");

fprintf (outp, "zero_burst_bits:", fn);

for (i = 0, n = 8; i < mlen+1; i ++)
{
if (n == 8)
{
fprintf(outp, "\n\t.db\t");
n = 0;
}

fprintf(outp, "$%02X", msk[i]);

if ((i < mlen) && (n < 7))
{
fprintf(outp, ", ");
}

n ++;
}
fprintf (outp, "\n");

fclose (outp);
}

void GenerateCOutput(char * fn)
{
// Сохраняю результат
FILE * outp = fopen ("altera_data.c", "wt");

fprintf (outp, "// Упакованная прошивка Альтеры подготовлена из файла\n");
fprintf (outp, "// %s\n\n", fn);

fprintf (outp, "#define PDLENGTH %d\n", rlen);

// fprintf (outp, "const unsigned int packed_data_length = PDLENGTH;\n");

fprintf (outp, "const unsigned char flash packed_data[PDLENGTH] =\n{");

for (int i = 0, n = 8; i < rlen; i ++)
{
if (n == 8)
{
fprintf(outp, "\n\t");
n = 0;
}

fprintf(outp, "0x%02X", res[i]);

if (i < rlen-1)
{
fprintf(outp, ", ");
}

n ++;
}
fprintf (outp, "\n};\n");

fprintf (outp, "const unsigned char flash zero_burst_bits[%d] =\n{", mlen+1);

for (i = 0, n = 8; i < mlen+1; i ++)
{
if (n == 8)
{
fprintf(outp, "\n\t");
n = 0;
}

fprintf(outp, "0x%02X", msk[i]);

if (i < mlen)
{
fprintf(outp, ", ");
}

n ++;
}
fprintf (outp, "\n};\n\n");

fclose (outp);
}

void main (int argc, char **argv)
{
if (argc < 2)
{
printf("RBF file needed\n");
return;
}

// Загружаю в буфер
printf ("Open file '%s'\n", argv[1]);
FILE * inp = fopen(argv[1], "rb");
if (!inp)
{
printf ("Open file error\n");
}

blen = 0;
while (!feof(inp))
{
buf[blen++] = fgetc(inp);
}
fclose(inp);

printf ("%d bytes loaded\n", blen);

// Пакую
Pack(1);

printf ("Total altera data length %d bytes\n", rlen + mlen + 1);

// Тестовая распаковка
printf ("Check\n");
Unpack();

// Ассемблер или С
if (argc == 3)
{
if ((argv[2][0] == 'a') || (argv[2][0] == 'A'))
{
GenerateAssemblerOutput(argv[1]);
}
}
else
{
GenerateCOutput(argv[1]);
}
}
////////////////////////////////////////////////////////////////////
Исходник распаковщика в Меге
////////////////////////////////////////////////////////////////////
#ifndef NO_ALTERA
#include "altera_data.c"
#endif

// Передача байта через SPI
#ifndef NO_ALTERA
static void spi(unsigned char byt)
{
SPDR = byt;
while(!SPSR.7);
}
#endif

// Заливка прошивки в Альтеру
void AlteraLoad(void)
{
#ifndef NO_ALTERA
unsigned char flash * pd_ptr;
unsigned char flash * zb_ptr;
unsigned char curr_bit, n;
#endif

// Разрешаю работу со внешней шиной
MCUCR = 0b11000000;
XMCRA = 0b00001110;
// Отключаю адрес от порта С
XMCRB = 0b00000111;

// Настройка контроллера SPI
SPCR = 0x78;
SPSR = 0x00;

// Управляющие ноги
PORTB &= 0b11111000;
DDRB |= 0b00000111;
PORTE |= 0b10000000;
DDRE |= 0b01000000;

#ifndef NO_ALTERA

// Начало загрузки
nCONFIG = 0;
delay_ms(10);
nCONFIG = 1;
while (!nSTATUS);

// Распаковка и загрузка
pd_ptr = &packed_data[0];
zb_ptr = &zero_burst_bits[0];
curr_bit = 0b00000001;

while (!CONF_DONE)
{
// Если биты закончились - к след. байту
if (!curr_bit)
{
zb_ptr ++;
curr_bit = 0b00000001;
}

if ((*zb_ptr) & curr_bit)
{ // Это последовательность нулевых байт
n = *(pd_ptr ++);

spi(0);
while(n--)
{
spi(0);
}
}
else
{ // Это просто байт
spi(*(pd_ptr ++));
}

// Следующий бит
curr_bit <<= 1;
}

// Для того, что бы прошивка заработала
spi(0);
spi(0);
spi(0);
spi(0);
spi(0);

#endif

// Сброс схемы в Альтере
ARESET = 0;
delay_ms(10);
ARESET = 1;
delay_ms(10);
}
///////////////////////////////////////////////////////////////////

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru