Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Я могу сделать так:
int16 *ptr; // actually R0
int16 *uz; // actually R1;
int16 acc; // accumulator, storage for offset for R0
int16 B; // B register
int16 T; // T register (internal)
Т = GetBitField(*(ptr+acc), B); // Get 4 bits from offset B*4;
PutBitField(*(ptr+acc), *(uz+(T << 1)), B); B = (B+1); if (B&4) {B=0; acc++};
Первая операция занимает шину чтения из ОЗУ, *(ptr+acc) сохраняется в хитром месте (оно и так есть в проце).
Вторая операция занимает шину записи в ОЗУ для результата, шину чтения из ОЗУ для uz и берет то сохраненное *(ptr+acc). Параллельно делается операция над регистрами А и B отдельными независимыми от шин средствами. Типа как 2 такта и можно ставить подряд друг за другом для всего блока (что эквивалентно повтору в аппаратном цикле, который тактов не ест)
других относительно шустрых реализаций я пока не видю. регистровых пар нет и не поддерживается.
Составить ответ | Вернуться на конференцию
Ответы