ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
81321 Топик полностью
AVR (15.02.2007 00:18, просмотров: 1) ответил д__ на Спасибо! Успехи действительно есть! Всего 92 такта... На процике не дороже 16меги...
Как видно из листинга, Кейловцы наконец-то освоили деление и взятие остатка от деления на константу через умножение на обратную величину, как это делал и я в своем примере для dsPIC Для long эта величина равна 0xCCCCCCCD ~= (2^32/10)*8, для int - 0xCCCD ~=((2^16)*8)/10. Эта long-константа видна в листинге как L1.304. В dsPIC деление int на 10 выглядит очень просто и выполняется за 3 такта: <asm> mov #65536*8/10+1,w1 ; 52429 = 0xCCCD mul.uu w0,w1,w0 ; w0=N, w1=MSW(w0*65536*8/10) lsr w1,#3,w0 ; w0=w1/8=N/10 </asm> На приличном 32-битном процессоре/DSP, имеющем однотактный умножитель 32*32=64 и продающемся за цену, сопоставимую с ценой средних AVR/ARM, ltoa с подменой деления умножением на обратную величину, может быть в лоб написана хоть на С, хоть на АСМ и займет всего пару десятков тактов (ARM я не могу отнести к приличным процессорам хотя бы из-за размытости времени исполнения команд в зависимости от местоположения операндов и звезд на небе). Но изначально речь-то шла о простеньком 8-битном AVR, который и 8х8-то умножает за 2 такта, а 16х16 - уже за 17, поэтому для него такое писать нужно очень тщательно. Я приводил свой быстрый ассемблерный вариант для AVR, использующий этот метод - он выполняется за 73 такта (и можно еще повоевать тактов за 5-10), но из-за жонглирования регистрами и наглого использования разных типов данных без приведений его будет трудно без существенных потерь положить на С. А твой вариант с делениями вряд ли какой из компиляторов сделает для AVR так же хитро, как для ARM - что и правильно, потому как существенного выигрыша достигнуто все равно не будет. И еще для информации к размышлению - вчера на телесисах некто Quasy предложил модификацию декрементного метода - http://www.telesys …8/messages/22356.shtml . Ценой небольших дополнительных затрат число декрементов в каждом десятичном разряде он сократил вдвое - сначала текущий остаток сравнивается с половиной максимально возможного его значения, и если остаток больше, то из него сразу вычитается (а к ASCII сразу прибавляется) эта половина, а потом уже идут декременты. Я проверил его код на С и на АСМ, получились весьма неплохие результаты - на С 182/66 тактов (в среднем 124), на АСМ 110/62 такта (в среднем 86), код длиной 58 (С)/48 (АСМ) слов. Так как на телесисах я забанен, то поблагодарить автора не смог - можешь туда кинуть ссылку на этот пост, если не влом. Ну и самое главное - несмотря на перебранку, ты все же показал рациональность применения своего кода хотя бы для ARM, и это наверняка пойдет на пользу заинтересованным. А я, в свою очередь, не ожидал, что тебя так сильно заденет моя природная неучтивость, поэтому приношу свои извинения за свою грубость и прошу более не принимать такое близко к сердцу - мы же мужики, и оба в летах, как я понимаю