Starichok51 писал(а):shonty, ты что, вручную вычисляешь смещения для РС?
Ну не огульно все
В "библиотеках" в циклах да. Избегаю меток при работе со шрифтами, при конвертациях различных..
Вобщем, что универсальное, там избегаю.
И если процедура до 20 строк допустим, то внутри метки тоже не ставлю))
Starichok51 писал(а):а если нужно сделать прыжок на много адресов,
по метке прыгаю)
Метки для подпрограмм в основном. Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))
[uquote="shonty",url="/forum/viewtopic.php?p=4678980#p4678980"]Использование PC более универсально, да и привычнее мне.
А конечный результат в данном случае в макросе оформлен будет.
С метками порой конфликты случаются, когда много своих "библиотек" подключаешь.[/uquote]
Использование PC как раз менее универсально. А чтобы не было конфликта подобных "одноразовых" меток, используйте цифры:
shonty писал(а):Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))
Извращение какое. А если понадобится лишнюю инструкцию вставить? А если поменять камень с m8 на m328 с соответствующей заменой in на lds и другим размером?
Если метка начинается с цифры, то avrasm2 пишет: "error: syntax error, unexpected INTEGER"
COKPOWEHEU писал(а):Извращение какое. А если понадобится лишнюю инструкцию вставить? А если поменять камень с m8 на m328 с соответствующей заменой in на lds и другим размером?
Если инструкцию вставить, то пересчитываю.
Если камень, то разные "библиотеки" у меня под m8, m328, lgt8, и т.д..
Так у m8/m328 даже регистры не все совпадают. Как универсалить
[uquote="shonty",url="/forum/viewtopic.php?p=4679000#p4679000"]Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))[/uquote]
Мне кажется, это не совсем хорошая практика. Трудно читаемо, особенно если после длительного перерыва или если кто-то другой разбирает исходник. Высчитывать смещения, загружать бошку. Программер должен быть достаточно ленивым.
Лишняя метка, особенно если это не безликая Label123, а осмысленное: LED_on, Busy и т.п. - денег не просит, но облегчает читаемость и модифицируемость.
[uquote="shonty",url="/forum/viewtopic.php?p=4679012#p4679012"]Если инструкцию вставить, то пересчитываю.[/uquote]
Вообще-то, метки для того и придуманы чтобы не пересчитывать.
shonty писал(а):Если метка начинается с цифры, то avrasm2 пишет: "error: syntax error, unexpected INTEGER"
Рекомендую начать осваивать гнутый ассемблер. Как минимум, проще потом с Си стыковаться.
shonty писал(а):Так у m8/m328 даже регистры не все совпадают. Как универсалить
Как все - ifdef-ами. И in/lds тоже. Хотя, честно говоря, не знаю, как это в гнутом асме делается.
shonty писал(а):Предпочтения по оформлению кода индивидуальны и субъективны
до тех пор, пока вы их не рекомендуете кому-то другому.
[uquote="shonty",url="/forum/viewtopic.php?p=4679031#p4679031"]Но, информативность должна быть достаточной, а не излишней)[/uquote]
У вас информативность НЕдостаточная. Почему именно +5, как узнать это число, не заглядывая в реализацию?
[uquote="shonty",url="/forum/viewtopic.php?p=4679063#p4679063"]Частично вы правы. Но как бы название метки, не заглядывая в реализацию, тоже не узнать))[/uquote]
Названия функций и их аргументы описываются в документации. Для этого не обязательно залезать в исходник. Да даже и залезая - пробежать глазами по меткам и вычленить те, что с осмысленными именами. Опять же не заглядывая в реализацию и не пытаясь угадать куда там можно прыгать, а куда нет.
А на языках высокого уровня вообще есть такая штука, как прототипы.
shonty писал(а):Но кстати, реализацию для себя поправил))
Стало гораздо хуже. Мало того, что не появилось осмысленных меток, так и та, что была, исчезла. При анализе кода как догадаться, что в эту точку подпрограммы вообще можно попасть кроме как с предыдущей строки?
shonty писал(а):Вот тут оправдан + к адресу:
И снова сделали только хуже. Из кода вообще неочевидно зачем туда прыгать.
shonty писал(а):PS: "+" к адресу иногда рациональнее писать , чем "PC-.."
В одном-единственном случае - когда он вычисляется в рантайме. Переход по таблице или что-то в этом роде.
shonty писал(а):...искать глазами в коде R18 (подсвеченную подсветкой синт-са) легче чем бесполезную метку))
Абсолютно неверное предположение.
Даже в старо-древних компиляторах "на бумажке карандашиком" высчитывать смещение для перехода было весьма муторно.
А при более сложной организации адресации это вообще достаточно затратное дело.
Тем более, что доступ по метке применяется как для полного адреса, так и для "укороченного" (+/- N), и не только для адресного пространства ПЗУ но и для адресного пространства ОЗУ (частью которого являются и регистровый файл и РСФ).
Получить карту меток также особого труда не представляет - или по листингу *.lst или по map файлу (*.map) (смотрим окно project в АВР студио 4.19 или аналогичное в микрочип студио).
Второе - компилятор позволяет выполнять вычисления с данными меток, удобные в случае специальных требований к размещению исполняемых модулей подпрограмм.
Да и "склеивание" взаимодействия двух независимых программ при использовании в подгружаемом софте части резидентного может пригодиться.
АВРка с ПЗУ программ конечно не 51я с совмещенной внешней памятью программ/данных, но вариант использования элементов бутлоадера загружаемой (обновляемой) программой в своих целях также не исключается.
Относительно использования абревиатуры R0 - R31...
не возбраняется и довольно часто используется при малом количестве используемых программой регистров - подобие "классического одноаккумуляторного" решения.
Однако АВР тем и отличается от I8080/Z80, MCS51 и PIC среднемладших, что имеет аж 32 регистр-аккумулятора с очень развитой системой доступа.
Нужно и про эти возможности помнить и применять. Вот тут и подходят заданные пользователем имена регистров согласно задач
Я такой вариант еще называю "модель регистров" - ибо можно задать практически модель аналогичную всем ранее перечисленным МП и МК.
Последний раз редактировалось BOB51 Вт фев 04, 2025 19:57:00, всего редактировалось 2 раза.
Хватит и такого, чтоб порой матюкнуться (особо, ежли еще учесть разницу что принимается за точку расчета нулевого адреса компилятором и "вручную" - это РАЗНЫЕ точки будут!):
BOB51 писал(а):Получить карту меток также особого труда не представляет - или по листингу *.lst или по map файлу (*.map) (смотрим окно project в АВР студио 4.19 или аналогичное в микрочип студио).
BOB51, редко иде открываю. Из нотепада++ батник запускаю, который компилит и, если ошибок нет, шьёт..
Starichok51 писал(а):а еще для ручного расчета смещения нужно точно знать длину каждой команды - один или два адреса.
Иногда в справку подглядываю, но точно знаю, что rcall 1 слово, а call 2 ))
Предпочтение все же надо отдавать IDE !
В АВР студии есть достаточно удобный отладчик - дебаггер.
Ядро и команды он отрабатывает прекрасно, хотя и имеет ерраты по некоторым аппаратным модулям МК(ограничения функционала описаны в документации IDE)/
Отладчик/симулятор штука весьма удобная (тем более дармовая).
Второе - не потребуется прописи в запускающей строке компилятора вручную ставить.
(Если "классический" многофайловик).
В самом названии темы есть ошибка режущая слух - никаких задержек в прерывании не должно быть! Я в прерывании обычно только выставляю флаг события, или если идёт поток данных, в SPI например, то только заранее подготовленные данные беру и отсылаю в соответствующий регистр и принимаю входные данные, всё, ничего другого и быть не должно.