Цитата(crunch @ Sep 5 2006, 16:29)

Так порядка 40-50 получается...а хотеться меньше вот и думаю
Что-то многовато. Даже вот такой код меньше дает.
struct TTableItem
{
char Len;
int Data;
};
__flash struct TTableItem TableItem[256]=
{//таблица Хафмана, длина, данные
};
unsigned long ShiftData=0;
char LenData=0;
inline void AddWord(char Len, int Word)
{
unsigned long temp = Word<<LenData;
ShiftData |= temp;
LenData += Len;
}
void main()
{
while(1)
{
//берем очередной байт
char a=GetByte();
//кладем в сдвиговый регистр
AddWord(TableItem[a].Len, TableItem[a].Data);
//обслуживаем выдачу
while(LenData >= 8)
{
char SendByte=(char)ShiftData;
//выдаем SendByte в SPI
ShiftData >>= 8;
LenData -= 8;
}
}
}
По примерным прикидкам тут получается порядка 150 тактов на входной байт и порядка 80 тактов на
выходной байт. А если учесть, что сдвиговый регистр можно сделать 24битным, то переписав это на асме можно сэкономить на лишних сдвигах. Думаю, 20 тактов на входной бит получить можно, сильно меньше - навряд.