Так меня порой за "отступление от стандартных наименований" и матюкают. В общем то ... Исходная проблема стандарта применения нескольких файлов вытекает из необходимости прописывать все файлы в запускающей командной строке компилятора... А мне то оченно вломуушки было... Да и работа с "быстрым переходом" между тремя компиляторами - mcs51, PIC и AVR требовала использования максимально удобного обобщения для работы с исходниками для всех применяемых компиляторов. Вроде таки получилось относительно удобненько. Для АВРок еще одно интересное замечание - "карта переназначения регистров регистрового банка" - собственно с теми регистрами можно выбрать модель, соответствующую раскладке и функционалу регистров других МК/МП (аналогия воде только у ПИК24 - но те я лишь очень бегло смотрел - могу и ошибиться). Плюс карты- подсказки по системам команд, чтоб быстрее вспоминалось "недавно забытое" и на закусь конспекты по самим МК и системам команд. Начну с той карты... Собственно добавляю ее в каждый проект в разделе дефайнов (или позже отдельным файлом дефайнов*) Спойлер
Код:
;_____ ;таблица объявленных имен - переназначение регистров РОН ; ; принята базовая модель: ; область ограниченного функционала ; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование) ; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование) ; .def = r2 ;(ограниченный функционал) ; .def = r3 ;(ограниченный функционал) ; .def = r4 ;(ограниченный функционал) ; .def = r5 ;(ограниченный функционал) ; .def = r6 ;(ограниченный функционал) ; .def = r7 ;(ограниченный функционал) ; .def = r8 ;(ограниченный функционал) ; .def = r9 ;(ограниченный функционал) ; .def = r10 ;(ограниченный функционал) ; .def = r11 ;(ограниченный функционал) ; .def = r12 ;(ограниченный функционал) ; .def = r13 ;(ограниченный функционал) ; .def = r14 ;(ограниченный функционал) ; .def = r15 ;(ограниченный функционал) ; область полного функционала .def tmp0 = r16 ; рабочий регистр (полный функционал) .def tmp1 = r17 ; рабочий регистр (полный функционал) ; .def = r18 ;(полный функционал) ; .def = r19 ;(полный функционал) ; .def = r20 ;(полный функционал) ; .def = r21 ;(полный функционал) ; .def = r22 ;(полный функционал) ; .def = r23 ;(полный функционал) ; .def = r24 ;("указатель базы" полный функционал) ; .def = r25 ;("указатель базы" полный функционал) ; Xl = r26 ; адрес сегмента Х (полный функционал) ; Xh = r27 ; адрес сегмента Х (полный функционал) ; Yl = r28 ; адрес сегмента Y (полный функционал) ; Yh = r29 ; адрес сегмента Y (полный функционал) ; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование) ; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование) ; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд ; изменение их имени хотя и возможно, но нежелательно - ; возникает путаница с интегрированной абревиатурой системы команд ; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ ; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового ; файла одновременно (без "подкачки" наборов параметров через ОЗУ) ; рекомендовано переназначение индивидуальных имен регистров ; согласно текущей задачи ;
собственно регистру присваиваем условное имя для последующего использования в проекте уже по тому имени. Даже для тиньки 13 можно переделить так, как удобнее (с учетом особенности работы каждой группы регистров в системе команд АВР) для прикладного проекта. Можно модель распределения регистров и под 51ю и под 580 и под Z80 и под ПИК чего другого самодельного "прировнять"... А уж затем и применяемые алгоритмы легче переносить в другую систему команд. Воть как то так для начала... Если интересно - дальше продолжу...
Там много интересного можно делать - к примеру "область быстрого стека" с использованием mov/movw... Единственно аккуратно относиться к использованию R0-R1 и адресно - индексных R26-R31. Они могут в очень многих интересно-полезных случаях использоваться. Второй добавкой, является использование в заголовке главного файла описания конфигурационных бит применяемого МК как "по умолчанию", так и то, что в текущем проекте использоваться будет. Эта "шапка" заимствована из практики ПИКов. Хоть практически фузы не меняет - такой приятности у avrasm2 нету, но позволяет заранее знать конфигурацию проекта (и сохранить в документации). Минус - пришлось посидеть за даташитами на свой комплект "проработанных" МК... К примеру "шапки" шаблонов главного файла проекта для тинек:
Есть еще для нескольких МК, но те пока не проверялись в проектах. Ну и выкопировка *.inc файлов описания ресурсов из каталога ДИСК:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes это обычный минимум для любого варианта написания.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
...Очень пригождается в математике, сравнении с нулем "младших" регистров (cp r2, rZero), оперативного обнуления переменных в памяти (sts var, rZero), в команде CPSE.
Тоже использую R15=0, главное не только дефайнить, но и обнулять его Для сравнения с 0 и определения знака использую команду TST. Нравится команда сравнения слова с нулем ADIW RL,0 (RL может R24, XL,Y,L,ZL)
Последний раз редактировалось akl Ср дек 11, 2024 15:10:34, всего редактировалось 2 раз(а).
Нет - ATtiny2313... AT90S2313 это вроде из самых старых... Такой даже в "пробниках" не было. Заготовки вот на эти (не факт, что без возможных ошибок - не проверял пока):
Просто делалось только то, на что распечатка док и сами кристаллы имелись. Собственно цель ассемблерных конструкций прикладная самодельная периферия. Далее уже было изменение самой структуры файлов проекта. Для "слишком мелких" простых конечно и одного файла достаточно. А вот для более крупных используется та шапка и несколько дополнительных файликов: собственно *.inc из комплекта компилятора (иногда и его корректировать приходится, но крайне осторожно) ; файл распределения ресурсов mdf_avr.txt (включает и карту регистров и карту разметки ОЗУ и чего там еще ...); Спойлер
Код:
; ; "mdf_avr.txt" файл объявленных имен, бит и констант ; (шаблон основного файла определений проекта) ; ;---------- ; variable definitions ;(таблица обьявленных имен) ; ; определение метки многофайлового проекта ; ставится только в основном файле определений проекта #ifndef disposit #define disposit #endif ; ; ;_____ ;таблица обьявленных имен - пользовательские константы ; ; .equ name/label = const / expr ; define datas
;_____ ; блок определений ; ;таблица обьявленных имен - переназначение регистров РОН ; ; ; принята базовая модель: ; область ограниченного функционала ; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование) ; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование) ; .def s_sreg = r2 ; зеркало SREG(ограниченный функционал) ; .def sys_flag = r3 ; системные флаги(ограниченный функционал) ; .def = r4 ; (ограниченный функционал) ; .def = r5 ; (ограниченный функционал) ; .def = r6 ; (ограниченный функционал) ; .def = r7 ; (ограниченный функционал) ; ; .def = r8 ; (ограниченный функционал) ; .def = r9 ; (ограниченный функционал) ; .def = r10 ; (ограниченный функционал) ; .def = r11 ; (ограниченный функционал) ; .def = r12 ;(ограниченный функционал) ; .def = r13 ;(ограниченный функционал) ; .def = r14 ;(ограниченный функционал) ; .def = r15 ;(ограниченный функционал) ; ; область полного функционала .def tmp0 = r16 ; рабочий регистр(полный функционал) .def tmp1 = r17 ; рабочий регистр(полный функционал) .def tmp2 = r18 ; рабочий регистр(полный функционал) .def tmp3 = r19 ; рабочий регистр(полный функционал) .def tmp4 = r20 ; рабочий регистр(полный функционал) .def tmp5 = r21 ; рабочий регистр(полный функционал) .def tmp6 = r22 ; рабочий регистр(полный функционал) .def tmp7 = r23 ; рабочий регистр полный функционал) ; .def Bl = r24 ; "указатель базы"(полный функционал) .def Bh = r25 ; "указатель базы"(полный функционал) ; Xl = r26 ; адрес сегмента Х (полный функционал) ; Xh = r27 ; адрес сегмента Х (полный функционал) ; Yl = r28 ; адрес сегмента Y (полный функционал) ; Yh = r29 ; адрес сегмента Y (полный функционал) ; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование) ; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование) ; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд ; изменение их имени хотя и возможно, но нежелательно - ; возникает путаница с интегрированной абревиатурой системы команд ; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ ; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового ; файла одновременно (без "подкачки" наборов параметров через ОЗУ) ; рекомендовано переназначение индивидуальных имен регистров ; согласно текущей задачи ; ;_____ ;таблица обьявленных имен - секция флагов пользователя ; ; .equ name/label = expr ; ; флаги в регистре flags
файл макросов macros_proto.txt (или как-то иначе называть можно)... Спойлер
Код:
; ; "macross__proto.txt" ; файл описания макросов (шаблон) ; .macro xchrr ; псевдокоманда "обмен регистра/акумулятора/ с регистром" eor @0,@1 ; вызывается как xchrr rd,rs eor @1,@0 eor @0,@1 .endmacro ; .macro ldiw ; псевдокоманда "загрузка слова в регистровую пару /X,Y,Z/" ldi @0l,low(@1) ; вызывается как ldiw rp,0xnnnn или ldiw rp,name ldi @0h,high(@1) ; (где name=0xnnnn, rp=x,y,z) .endmacro ;
Далее собственно файлы программ подключаются - тоже с расширением*.txt Для расширения используются именно *.txt, а не *.inc, *.asm или *.s - чтоб компилятор их не путал и не матюкался. Собственно идет подстановка в *.asm файл текстовых вставок (компилятор их так и воспринимает). Сама папка проекта также разделена на несколько подразделов... К примеру вот такой проектик (из старых):
Правда из него вся графика и дополнительная документация удалены (слишком велики) - просто для понимания как все стыкуется и обзывается. Вобшчемссс... посмотрямс на интерес - может еще чего добавлю... Или выслушаю матюков со вниманием.
В своих проектах один из регистров "делаю нулевым" (для AVR)
в проектах для АТмега8 я нулевым делаю ZH, так как все данные у меня лежат в начале ОЗУ (0x60 - 0xFF), когда ZH = 0. поэтому у меня нет необходимости выделять отдельный регистр для нуля.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Мудро!!! Но в этом случае ИМХО лучше ограничить использование ОЗУ адресом (0xFF - 1), иначе может "что-то пойти не так" после команд RD Rx, Z+ / ST Z+, Rx. Хотя, обычно в конце ОЗУ стек, поэтому способ безопасный.
Нуль можно и в варианте константы определить. Да и весь младший блок регистров с ограниченным функционалом за исключением R0-R1 вполне сгодиться. Зачем полнофункциональные занимать?
А я бы советовал использовать распределение регистров полностью совпадающее с распределением GCC. Тогда меньше проблем, если вдруг приспичит поработать с ассемблерными модулями в Си.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Это хорошо, если используется модель АВР. Но ведь возможно и иное переназначение регистров файла под наиболее удобную модель распределения регистров... это все таки "чистый ассемблер". К примеру тот же "быстрый стек" под отдельные подпрограммы в младшей части регистрового банка...
С этой точки зрения и выбрал R15. Идея Старичка хороша тем, что при малом объеме ОЗУ ноль образуется "автоматически" (XH,YH,ZH) и вообще не нужно выделять отдельный регистр.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения