АСМОДЕЙ алгоритмы (хроники ПадоВана)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

АСМОДЕЙ алгоритмы (хроники ПадоВана)

Сообщение BOB51 »

Данная тема предназначена в основном для любителей ассемблера.
Особенно в приложении для работы с различными семействами МК.
Однако в связи с «мультиязычностью» имеет некоторые особенности...
Описание алгоритма хотя и берется изначально с привязкой к определенной системе команд (в соответствии откуда изначально было сплагиачено) но выкладываться должно в «нейтральном» к какой-либо системе команд виде.
Основной задачей является возможность адаптации исходника алгоритма под любую из рассматриваемых пользователем систему команд. Предпочтительно в максимально облегченном для понимания неспециализированным в математических формулах радиолюбителем.
Посему предлагается для начала своеобразное
«соглашение о терминологии»
итак...
A - аккумулятор (аккумулятор в i8080, Z80, mcs51, stm8 регистр W в PIC10-12-16-18, основной регистр в из файла РОН АВР)
особое мнение следует в отношении АВР и PIC24 имеющих файлы регистров-аккумуляторов, одначе поскольку одновременно в качестве аккумулятора может использоваться только один из них до особых случаев предпочтительно иметь один аккумулятор, но не брезговать на всякий случай вариациями А0-АN.

R0-Rn регистры рабочего банка ...(R0-R7 в mcs51, регистры B,C,D,E,H,L у i8080, Z80, текущий банк у PIC10-12-16-18, область 0x00-0xFF у stm8 и «полнофункциональные» регистры у АВР — R16-R31)
Опять же «особое мнение» для АВР — в принципе к регистрам относятся все регистры файла... однако часть из них или заранее специализирована за определенными функциями (R0, R1, регистровые пары R24-R25, R26-R27(X), R28-R29(Y), R30-R31(Z)) или не имеет полноценного доступа от всей системы команд (R0-R15)

Status – регистр флагов статуса

C – флаг переноса (особо оговаривается в случаях с PIC микроконтроллерами)

Z - флаг нуля

остальные флаги требуют текстового описания по месту применения.

М — ячейка оперативной памяти (ОЗУ и/или ПЗУ/EEPROM)
при отдельных замечаниях области размещения в ПЗУ/EEPROM
кроме того к разновидности М могут относятся и области регистров оперативного доступа в случае с mcs51, АВР и PIC.

Также в тексте описания алгоритма помимо «стандартных» имен-меток
используются следующие условные обозначения:

* - текущая операция
*=? - операция-запрос
*Y - операция при соответствии условию запроса
*N - операция при несоответствии условию запроса
( операции типа *=?, *Y и/или *N могут выполняться как раздельными командами
так и одной/двумя командами в зависимости от текущей системы команд )
warm_pt: - контрольная точка начала/конца участка программы, требующего особого внимания в случае наличия разрешенных на во время выполнения программы прерываний
обычно пронумерованы и группируются согласно описания
выполняют информационные функции

Алгоритмы предоставляются в «чистом виде» - как самостоятельно действующая основная программа. Т.е. Не прописываются предварительные действия по хранению критичных ресурсов перед вызовом в режиме подпрограммы а также соответствующие процедуры при возврате (если алгоритм используется многократно как подпрограмма) а также не прописываются защитные блоки по устранению вредного влияния прерываний другими процессами при обязательном указании участков в которых необходима такая защита.
Возможно потребуется иногда и графические материалы добавлять — схемки/диаграммки перемещения данных по регистрам и/или последовательности событий к диаграммам напряжений на линиях связи.

Уфф... намутил...
:oops:

Однако вот тут ниже приведен конкретный пример такого подхода.
:roll:
Итак...
В древнебылые времена пришлось выцарапывать алгоритм Далласовской CRC8 для DS18B20.
Читаньки-почитаньки... книжек много вариантов малопонимаемых еще больше, попытки начирикать работоспособную программу одна за другой приводят к стандартному ЖО...
И тут попадается кусманчик... работоспособный... (еще под 51-ю).
Скопипастил...
На время проблему решило.
Одначе потребовалось поменять ресурсы и пошло-поехало, пришлось почитаньки внимательно исходник и обобщенную структуру набросать.
Затем и другие МК попробовать пришлось — а там уже и структура ресурсов иная и система команд значительно изменена (для враждебных фанатов).
Одначе имея обезличенный исходный текст вполне быстренько его удалось приспособить под то чего конкретно понадобилось.
В результате ход событий был следующим:

исходный текст для MCS51:
Спойлер;----------------------------------------------------------------
; CRC - КОНТРОЛЬ
;
CRCK: CLR ERL
CLR A
MOV R7,A
MOV R0,#30H
MOV R2,#9
CRCL: MOV A,@R0
MOV R5,A;PUSH A
MOV R3,#8
CRCLP: XRL A,R7;XRL A,TEMP
RRC A
MOV A,R7;MOV A,TEMP
JNC ZERO
XRL A,#18H
ZERO: RRC A
MOV R7,A;MOV TEMP,A
MOV A,R5;POP A
RR A
MOV R5,A;PUSH A
DJNZ R3,CRCLP
INC R0
DJNZ R2,CRCL
CLR A
ADD A,R7
JZ WCRC
SETB ERL
WCRC: RET
обезличенный шаблон (максимально универсализирован — собственно и есть вариант желаемого описания как образец для обсуждения и развития с учетом критических замечаний):
СпойлерБазовая заготовка библиотек для обработки
CRC7/CRC8 по алгоритму микроLAN согласно
требования MAXIM-DALLAS .

программа состоит из генератора для 7 или 8
байтовых блоков данных (crc_g7 crc_g8)
и проверки на соответствие приема 8 и 9
байтовых блоков, включающих в себя CRC-байт
(crc_k7 crc_k8)


непосредственно используемые ресурсы:

определение (разметка) рабочих регистров

crc_ptr указатель адреса текущего байта в массиве
возможно двухбайтовый - зависит от структуры доступа
к области памяти, определенной как bloknot (9 байт)
crc_cntb счетчик бит текущего байта
crc_cntw счетчик байт к обработке
crc_dat текущий обрабатываемый байт
crc_sum накопитель результата
crc_tmp временный регистр (только для среднемладших PIC!)

crc_flg регистр флагов обработчика
предпочтение размещению
в доступной из других программ зоне вне пределов
области случайного взаимозатирания данных

определение (разметка) области флагов пользователя

crc_ec_f флаг ошибки в CRC (актуально для crc_k7/crc_k8)
crc_g_f завершение программы в режиме генератора CRC

определение (разметка) констант

0x18 константа второго узла обработки

определение (разметка) используемых областей ОЗУ

bloknot адрес начала буферной области данных, используемых в
процессе обработки (в ОЗУ любого типа)
размер буфера до 9 байт
данные в области bloknot не разрушаются
полученный при выполнении режима генерации байт CRC добавляется
в соответствующее место в конце пакета
(8-й или 9-й байт соответственно)
* заполнение буфера данными производится от младших адресов к старшим *

определение (разметка) используемых областей ПЗУ

в данном случае не используется

-------------------------------------------------------


! загрузка указателя адреса может выполняться в отдельном макросе
при вызове подпрограммы в случае необходимости иметь различные
буферные области данных вида bloknot !
сам текст макроса зависит от синтаксическихправил конкретного
применяемого компилятора

основная часть программы:


crc_g7: ; точка входа режим генератора CRC7

* загрузить в crc_cntw (счетчик байт к обработке) число 7

* перейти в точку crcg_bs

crc_g8: ; точка входа режим генератора CRC8

* загрузить в crc_cntw (счетчик байт к обработке) число 8

crcg_bs: ; точка входа в обработку в режиме генератора CRC

* установить флаг признака режима генератора CRC crc_flg.crc_g_f = 1
и

* перейти к основному фрагменту обработчика в точку crck

crc_k7: ; точка входа режим верификации CRC7

* загрузить в crc_cntw (счетчик байт к обработке) число 8

* перейти в точку crcg_bc

crc_k8: ; точка входа режим верификации CRC8

* загрузить в crc_cntw (счетчик байт к обработке) число 9

crcg_bc:

* сбросить флаг признака режима генератора CRC crc_flg.crc_g_f = 0

crck: ; точка входа в основной обработчик CRC

* загрузить указатель адреса текущего байта crc_ptr
начальным адресом буфера данных bloknot
( при наличии разных областей данных для обработки
предпочтение макросу на участке выхова процедуры обработчика )

* сбросить флаг "ошибка CRC" crc_flg.crc_ec_f = 0

* загрузить в аккумулятор 0x00 (допускается простая очистка вида clr a)

* загрузить в накопитель результата crc_sum "магическую константу"
0x00 (допускается простая очистка вида clr crc_sum если позволяет
соответствующая система команд)

crcl: ; длинный цикл

* загрузить аккумулятор содержимым ячейки буфера данных по текущему адресу
в указателе адреса данных crc_ptr

* копируем это же значение из аккумулятора в crc_dat

* загрузить счетчик бит в текущем байте crc_cntb число 8

crclp: ; обработка байта данных

* исключающее или (XOR,EOR...) аккумулятора и содержимого накопителя результата crc_sum
результат остается в аккумуляторе (XOR бита 0 накопителя crc_sum и текущего бита 0 из
байта данных в аккумуляторе)

* выдвигаем результат в флаг CY регистра статуса

warm_pt0: ; условная контрольная точка начала интервала защиты содержимого CY

* копируем содержиме накопителя результата crc_sum в аккумулятор

*=? в случае, если результат обработки первого узла равен 0 (CY=0)
*Y идем в точку zero_m

*N если CY=1 ксорим содержимое аккумулятора и "магической константы" 0x18
(второй "узел" обработки)

zero_m: ; обработка очередного цикла

* полученный в аккумуляторе результат с учетом содержимого CY сдвигаем вправо
на один бит получая в аккумуляторе новое значение для накопителя результата crc_sum

warm_pt1: ; условная контрольная точка окончания интервала защиты содержимого CY

* копируем содержимое аккумулятора в накопитель результата crc_sum

* копируем содержимое текущего байта данных из crc_dat в аккумулятор

* сдвигаем аккумулятор на 1 бит вправо (содержимое старших битов значения не имеет)

* и помещаем результат из аккумулятора обратно в crc_dat

* декремент счетчика бит crc_cntb

*=? если crc_cntb не равен нулю
*N идем в точку crclp

*Y если crc_cntb = 0 то

* инкремент содержимого указателя адреса текущего байта данных crc_ptr

* декремент счетчика байт обрабатываемого массива crc_cntw

*=? если crc_cntw не равен нулю
*N идем в точку crcl

*Y если crc_cntw = 0 обработка массива завершена

*=? если режим генерации (crc_flg.crc_g_f=1)
*Y идем в crc_gend

*N иначе завершение обработки в режиме проверки целостности данных в пакете

* сравнить содержимое накопителя результата crc_sum с нулем

*=? если CRC правильна и в накопителе 0
*Y идем в точку wcrc (завершение программы)

*N иначе устанавливаем флаг ошибки CRC crc_flg.crc_ec_f = 1

wcrc: ; точка завершения программы

* может быть командой возврата из подпрограммы
при соблюдении всех обязательств по восстановлению стека и управления прерываниями
либо коротким переходом в точку end_line

crc_gend: ; точка выхода в режиме генерации CRC

* копировать содержимое накопителя результата crc_sum в аккумулятор

* и размещаем содержимое аккумулятора по адресу ячейки в текущем указателе данных
crc_ptr (содержимое crc_ptr к данному моменту установилось или на 8й или на 9й
байт области буфера bloknot )
с последующим выходом из программы/подпрограммы

* идем в точку wcrc при необходимости выхода из подпрограммы
с восстановлением "затираемых" ресурсов из стека

end_line: ; точка выхода при использовании алгоритма как участка линейного вида

--------------------------------------------------------------------------------------
условные обозначения:
* - текущая операция
*=? - операция-запрос
*Y - операция при сответствие условию запроса
*N - операция при несоответствие условию запроса
операции типа *=?, *Y и/или *N могут выполняться как раздельными командами
так и одной/двумя командами в зависимости от текущей системы команд
warm_pt: контрольная точка начала/конца участка программы, требующего особого внимания
в случае наличия разрешенных на во время выполнения программы прерываний
обычно пронумерованы и группируются согласно описания
выполняют информационные функции
Ниже приведены три варианта применения вышеизложенного шаблона — именно варианты, а не конкретная догма (ресурсы заданные в шаблоне могут иметь размещение и в совсем иных местах в соответствующих областях регистров и ОЗУ МК — общее разве что аккумулятор, и то не всегда).

текст чистовика под MCS51:
прим.3.txt
(2.66 КБ) 128 скачиваний
текст чистовика под PIC:
прим.4.txt
(3.24 КБ) 131 скачивание
текст чистовика под AVR:
прим.5.txt
(3.59 КБ) 131 скачивание
Пока в планах еще CRC16...а из имеющегося вроде были генератор случайных чисел, некоторые протоколы, многобайтовая математика (урезанная).
Ежли у кого математика в большем объеме и прочие стандартные приятности из области фильтров/статистики или еще чего — добавляйте. Для простого пользователя вполне может пригодиться. Сами алгоритмы не претендуют на оригинальность или авторство — основная задача обеспечение легкой понимаемости сути алгоритма и возможности его приспособления в конкретной задаче под свой МК. Некоторые моменты указаны как «магические константы» - их требуется выполнять только так как указано — а почему долго искать и объяснение весьма квалифицированного специалиста требует (ежли кто сумеет чего добавить на соответствующем уровне — всегда и с превеликим уважением принимается).
:beer:
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: АСМОДЕЙ алгоритмы (хроники ПадоВана)

Сообщение BOB51 »

Графический вариант алгоритма CRC7/CRC8 dallas:
http://img.radiokot.ru/files/20529/k5qefb1oc.GIF ( скачанное хорошо смотрится/масштабируется в IrfanView )
несколько нагляднее возможность распределения/использования ресурсов МК.
:roll:
Реклама
Ответить

Вернуться в «Разные вопросы по МК»