Forth http://fforum.winglion.ru/ |
|
Перекодирование файла для прошивки ПЗУ(случай из практики) http://fforum.winglion.ru/viewtopic.php?f=19&t=2512 |
Страница 2 из 2 |
Автор: | Hishnik [ Пн мар 15, 2010 22:48 ] |
Заголовок сообщения: | |
chess писал(а): 2. Быстродействие данных решений не в пользу табличных, так
как таблицы здесь не выдают результаты за одно обращение к ним, а требуется пробежать по таблице. Однако эти решения годятся для произвольного количества перестановок, а не только для одного переставленного бита. К тому же сразу видо, что и куда пошло. |
Автор: | mOleg [ Вт мар 16, 2010 19:04 ] |
Заголовок сообщения: | |
Хищник писал(а): Однако эти решения годятся для произвольного количества перестановок, а не только для одного переставленного бита. К тому же сразу видо, что и куда пошло.
кстати да. Табличные решения могут давать непредсказуемые проблемы (достаточно не правильно один бит набрать...). насчет обработки группы бит, это и я заметил, но решил без них. |
Автор: | WingLion [ Вт мар 16, 2010 19:22 ] |
Заголовок сообщения: | |
mOleg писал(а): кстати да. Табличные решения могут давать непредсказуемые проблемы (достаточно не правильно один бит набрать...).
и чем эти проблемы страшнее косоглазого тополога? |
Автор: | mOleg [ Вт мар 16, 2010 19:31 ] |
Заголовок сообщения: | |
WingLion писал(а): и чем эти проблемы страшнее косоглазого тополога?
страшнее случайностью проявления. Например, один какой-либо редкий код(адрес) может вообще не встречаться долгое время, а потом вдруг появиться. То есть такие ошибки наиболее тяжело отыскиваются в силу своей редкости и неожиданности. Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять особенно, если таблица большая. |
Автор: | WingLion [ Вт мар 16, 2010 19:41 ] |
Заголовок сообщения: | |
mOleg писал(а): страшнее случайностью проявления. Например, один какой-либо редкий код(адрес) может вообще не встречаться долгое время, а потом вдруг появиться. Может, я туплю, но как этот адрес станет редким при 20 штуках адресов всего? Чтобы ошибиться в таблицах, что у меня в решении, надо быть не только косоглазым, но и криворуким, чтобы не на те кнопки нажимать и не увидеть, что нажал не то. mOleg писал(а): Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять Smile особенно, если таблица большая.
У меня она фактически вычисляется... каждый элемент таблицы - в момент использования |
Автор: | Hishnik [ Вт мар 16, 2010 23:24 ] |
Заголовок сообщения: | |
mOleg писал(а): То есть такие ошибки наиболее тяжело отыскиваются в силу своей редкости и неожиданности.
Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять особенно, если таблица большая. То есть вычисление таблицы программируется проще, чем сама таблица? И что значит "большая таблица"? В ней число элементов равно числу разрядов. Кстати, проверка целостности данных делается очень просто - OR по всем элементам, и должно получиться число, у которого единицы во всех младших разрядах, а их число равно разрядности адреса/данных. Это будет гарантией того, что каждая маска упомянута в таблице по одному разу. Вот уж гарантия правильного размещения масок - извините, это "проверка на криворукость". Ошибиться в программировании вычисления маски существенно проще, поскольку результат не виден. |
Автор: | chess [ Ср мар 17, 2010 17:21 ] |
Заголовок сообщения: | |
Хищник писал(а): Ошибиться в программировании вычисления маски существенно проще, поскольку результат не виден.
Тут надо уточнить, ошибиться в чем: в алгоритме или в кодировании алгоритма. Форт средство интерактивное и позволит быстро протестировать и отладить простейшую функцию переброса разрядов(у меня к примеру обмениваются только два разряда). Вот вариант с классическими решающими таблицами: Код: 16 CONSTANT NADDR \ разрядность адреса
8 CONSTANT NDATA \ разрядность данных 0 VALUE [Amix] \ нач. адрес таблицы перепутывания адресов 0 VALUE [Dmix] \ нач. адрес таблицы перепутывания данных \ обмен пары разрядов : SWAPB ( bitmask n -- n') SWAP 2DUP AND OVER 1 SWAP WITHIN AND XOR ; : LOAD-TABLES BASE @ >R 0x2 BASE ! 1 NADDR LSHIFT DUP DUP ALLOCATE THROW DUP TO [Amix] SWAP ERASE 0 DO \ FEDCBA9876543210 0000000000010001 \ обмен шин A0 и A4 на выводах ПЗУ 0000000000100010 \ обмен шин A1 и A5 I SWAPB SWAPB [Amix] I + C! LOOP 1 NDATA LSHIFT DUP DUP ALLOCATE THROW DUP TO [Dmix] SWAP ERASE 0 DO \ 76543210 01000010 \ обмен шин D1 и D6 на выводах ПЗУ 10000100 \ обмен шин D2 и D7 I SWAPB SWAPB [Dmix] I + C! LOOP R> BASE ! ; \ табличное преобразование адреса и данных : Aperf ( A -- A') [Amix] + C@ ; : Dperf ( D -- D') [Dmix] + C@ ; Остальное типовая обертка ПС. Из табличных вариантов решений - этот самый быстрый, но и требует соответствующего объема памяти. |
Автор: | Jelsay [ Вс мар 21, 2010 19:20 ] |
Заголовок сообщения: | |
Цитата: Шина A0 у него пошла на вывод A4 ПЗУ, шина A1 на вывод A5,
шина D1 на вывод D6, шина D2 на вывод D7. : rszbor ( b -- 1..2..3..4.....8..) 8 0 DO 2 /mod LOOP ; : sborADR ( 1..2..3.....8..-- b) 2* + 2* + 2* + >R 3 Pick 2* + 2* + 2*+ R> 2* + : sborDATA (1..2..3.....8..-- b) ... ... ... реально бы наверное использовал для создания 2-х массивов для перекодировки младших 4-х бит адреса (16 ячеек) и байта данных (256 ячеек) |
Автор: | Jelsay [ Пн мар 22, 2010 12:44 ] |
Заголовок сообщения: | |
\ Раз уж Форт позиционирует себя как язык для встраевыемых систем то - вообще то должна быть базовая библиотечка для работы с битами с числами разной длинны \ нечто вроде GetBit( N i -- 0|1) SetBit (N 0/1 i --) SwapBit (N i1/i2 --) ещё чего? \ потому что решая в лоб легко ошибиться - я ошибся раз 5 пока не отладил инициализацию массивов. Код: Create m 8 allot
: m@ ( i --0/1 ) m + c@ ; : m! ( 0/1 i-- ) m + c! ; : razval_byte ( b -- ) 8 0 DO 2 /Mod swap I m! LOOP drop ; : .m ( -- ) 8 0 DO I m@ . LOOP ; : sbor_Adr ( -- b ) 0 m@ 2* 1 m@ + 2* 6 m@ + 2* 7 m@ + 2* 4 m@ + 2* 5 m@ + 2* 2 m@ + 2* 3 m@ + ; : sbor_DAT ( -- b ) 7 m@ 2* 6 m@ + 2* 2 m@ + 2* 3 m@ + 2* 4 m@ + 2* 5 m@ + 2* 6 m@ + 2* 7 m@ + ; create Mass_ADR 32 allot create Mass_DAT 256 allot : init_ ADR ( --) 32 0 DO i razval_byte sbor_Adr 31 AND i Mass_ADR + c! LOOP ; init_ ADR : init_ DAT ( --) 256 0 DO i razval_byte sbor_DAT i Mass_DAT + c! LOOP ; init_ DAT \ основные процедуры: : GetAdr ( A--A) dup 31 AND Mass_ADR + c@ swap 224 AND + ; \ меняем только младшие 5 бит - экономим 224 байта : GetDAT ( A--A) Mass_DAT + c@ ; / меняем всё 8 младших 8 бит - быстрее, |
Автор: | вопрос [ Пн мар 22, 2010 17:52 ] |
Заголовок сообщения: | |
WingLion писал(а): Может, я туплю, но как этот адрес станет редким при 20 штуках адресов всего?
Чтобы ошибиться в таблицах, что у меня в решении, надо быть не только косоглазым, но и криворуким, чтобы не на те кнопки нажимать и не увидеть, что нажал не то. Бывает и такое Чернушный офтоптный стишок - Шеф, помоги - гдЕ я ступил? - так "ламер" "хакера" просил... Никак не хочет код работать - найти ошибку нету сил... Лукаво хакер смотрит в код (а дел своих невпроворот): - Ошибку вижу я пока ... прости, лишь только - в ДНК |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |