Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

siimao писал(а):
ILYAUL писал(а):Вообще-то это решается двумя короткими командами и akl их написал в своём коде
Уважаемый akl, про какие две команды Вы упоминали? Здесь применен совершенно другой принцип, если я правильно понимаю.
akl писал(а):По мне, это плохая практика. Почему бы не так
http://radiokot.ru/forum/viewtopic.php? ... 5#p2529895

Уважаемый akl, не могу промяукать ваше предложение. Переделал программу по вашей рекомендации и на выходе usart не вижу команд.
1).
inc interrupt
cpi interrupt,80
; breq rst2
BRLO PC+2 ;если interrupt меньше 80, то перепрыгиваем одну команду и сбрасываем interrupt и выходим из прерывания. Но тогда никогда не достигнем 80.
SET ;Set T in SREG
clr interrupt
reti

2).
taimer_overflow: ;на эту метку мы возвращались по завершению цикла программы или совпадению interrupt==80. Как ее применять сейчас - не понятно.
NOP
RJMP START ;Эта команда бросает нас на начальную инициализацию. Но ведь это делается один раз при старте.

Буду благодарен за ответы.

Добавлено after 1 minute 58 seconds:
Z_h_e писал(а):Хоть ссылку бы дали про что Вы. "Хотелось бы, так сказать, в общих чертах понять, что ему нужно". Ну а если это не касается других форумчан, то пишите в личку воспрашаемому.
Исправился. Был уверен, что нажав на кнопку "Цитата" под сообщением, оно займет соответствующее место, а не выкинет в конец темы. Учту. Спасибо.
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

siimao писал(а): 1).
inc interrupt
cpi interrupt,80
BRLO PC+2 ;если interrupt меньше 80, то перепрыгиваем одну команду и сбрасываем interrupt и выходим из прерывания. Но тогда никогда не достигнем 80.
SET ;Set T in SREG
clr interrupt
reti
Да, это ошибка. Нужно
Спойлер

Код: Выделить всё

Taimer:
   inc      interrupt
   cpi      interrupt,80
   BRLO   Taimer_OUT	;PC+3
   SET      ; ??????? ????
   clr      interrupt
Taimer_OUT:
   reti
siimao писал(а): 2).
taimer_overflow: ;на эту метку мы возвращались по завершению цикла программы или совпадению interrupt==80. Как ее применять сейчас - не понятно.
Значит эта метка не нужна.
siimao писал(а): RJMP START ;Эта команда бросает нас на начальную инициализацию. Но ведь это делается один раз при старте.
Опыт подсказывает, что периодическая инициализация лишней не бывает. К тому же, это учебный пример, позволяющий зациклить программу, а не стоять в RJMP PC, стартуя каждый раз вручную.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

Спасибо за ответы!!! :))

1) - Спасибо.
2) - Метка пригодится, найду ей место для прыжка.
3) - Заранее прошу прощения, что по этому ответу придираюсь за помощью...
"периодическая инициализация лишней не бывает". -> Но внутри нее предустанавливаются порты IO. Можно, конечно, еще одну метку установить, чтобы порты не трогать...
"это учебный пример, позволяющий зациклить программу, а не стоять в RJMP PC, стартуя каждый раз вручную." -> не понятна концовка "..., стартуя каждый раз вручную". Что имелось ввиду под ручным стартом? А если он не нужен, этот старт?

Ну и пошел переделывать программу. Интересен результат.
А в чем advantage этого метода перед использованием 4 x pop?

Изучая asm по книгам и больше на примерах, понял, что при входе в каждую процедуру обработки прерываний в самом начале необходимо сохранять в стек значения переменных, которые задействованы в конкретной процедуре обработки и SREG. Это не применено ни у автора и не предложено Вами.
Последний раз редактировалось siimao Ср ноя 09, 2016 14:54:17, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

siimao писал(а):Изучая asm по книгам и больше на примерах, понял, что при входе в каждую процедуру обработки прерываний в самом начале необходимо сохранять в стек значения переменных, которые задействованы в конкретной процедуре обработки. Это не применено ни у автора и не предложено Вами.
Не всегда надо сохранять и сохранять не обязательно на стек. Например, если основной цикл программы ничего не делает, то сохранение не нужно. Иногда реакция на какое-то событие должна быть максимально быстрая. Выделяете регистры, которые не будут использоваться в основном теле программы, в один из регистров сохраняете SREG, остальные сохранять не надо, так как больше нигде не используется. В прерывании можно не сразу сохранять значения, например, включаете порт используя команды не меняющие флаги и регистры, а уж потом сохраняете нужно и выполняете остальное.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

OK, спасибо.
В основной программе используются регистры 16 to 31.
Допускается ли для сохранения SREG и переменных использовать младшие регистры?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Что Вы имеете ввиду говоря "переменная"?
siimao писал(а):Допускается ли для сохранения SREG и переменных использовать младшие регистры?
Поймите смысл сохранения данных в прерывании. Есть, например, основной цикл программы. Основная программа считывает значение порта в R16, затем проверяет его на равенство с "число" и если равно, то что-то выполняет и есть куча неких прерываний.
Если прерывание возникло после считывания порта в R16, в обработчике прерывания Вы его изменили, то на равенство с "числом" после выхода из подпроограммы будет проверяться другое значение.
Ушли в прерывания после команды сравнения на равенство с "числом", но не сохранили SREG. Флаги будут изменены подпрограммой и Вы уже не знаете результат сравнения.
Основная программа не использует регистры R0-15, т.е. ей без разницы что в них.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

Z_h_e писал(а):Что Вы имеете ввиду говоря "переменная"?

Временное значение, хранящееся в регистре.
Z_h_e писал(а):Основная программа не использует регистры R0-15, т.е. ей без разницы что в них.

Значит можно использовать эти регистры R0-15 для временного хранения SREG и переменных; или их можно использовать в обработчиках прерываний.
Встречал, что есть какие-то ограничения на их применения. Но уже сил нет перечитывать всю литературу... хоть где копать, подскажите.
За ликбез о прерываниях - спасибо!
А каковы причины переполнения стека? :dont_know: Это как-то связано с этими самыми прерываниями? Я только "первый раз сказал Мяу". Какие вкладки в AVR Studio 4.19 надо открыть, чтобы этот процесс отследить, понять и избежать?
Спасибо!
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

siimao писал(а):Встречал, что есть какие-то ограничения на их применения.
Не со всеми командами работают.
siimao писал(а):А каковы причины переполнения стека?
Ошибки в программировании.
Возникло прерывание, адрес возврата сохранился на стеке, SP=SP-2, выполнили PUSH R , SP=SP-1, не выполнили POP R, команда RETI, в PC загрузился адрес возврата ХЗ, так как SP указывает не туда.
В неком цикле делаете обмен данными между регистрами, с помощью команд PUSH POP, но пропустили одну из команд.
Ушли в подпрограмму, вышли из нее не используя RET .
Слишком много данных сохранено на стеке.
Указатель стека неверно инициализирован.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

Z_h_e, спасибо огроменное за ответ! Полез на дерево учиться...
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб июл 30, 2011 21:00:24

Сообщение AQ29 »

dimmer писал(а):Мда... Однако... Интересную тему затронули. Большое спасибо всем за информацию, самому бы пришлось долго копаться, что-бы получить какое-то внятное представление. Я думаю, что если в будущем понадобится писать что-то больше 8 - 16Кбайт, то одним ассемблером наверно не обойдусь. Но пока хватает avrasm2.
Сильно занижаете возможности ассемблера. Я без проблем писал программу 32 КБ, хотя совсем не программист. Не вижу проблем и с большим по объёму кодом, просто не было таких задач. Пишу на макроассемблере АБ (Алгоритм Билдер).
Слышал в интернете, что ограничение для ассемблера около 128 КБ.
На мой взгляд, хорошо развитый ассемблер приближён к ЯВУ.
ARV писал(а):я сделал (при помощи советов знатоков, конечно) макрос ENTER и макрос LEAVE. для первого надо было в параметрах перечислить через запятую любое количество любых регистров, и макрос автоматически заталкивал этот список в стек - начало обработчика прерывания. а в конце обработчика надо было поставить LEAVE уже без параметров - и этот макрос автоматически в обратном порядке восстанавливал из стека все регистры, которые передавались в параметрах первого. в итоге разработка обработчика прерывания становилась просто сказочно удобной
Наверно, намного проще создать простейшие макросы на каждое число переменных, посылаемых в стек. Скажем, в АБ для 3 переменных это будут макросы:
IN_Stek_3 (a, b, c) – посылка переменных a, b, c в стек,
OUT_Stek_3 (a, b, c) – извлечение переменных из стека.
Макросы банальные, имеют минимальный объём, пользоваться просто.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

AQ29 писал(а):Макросы банальные, имеют минимальный объём, пользоваться просто.
Это некорректное утверждение, макрос по сути это оператор ЯВУ и имеет значение во что он скомпилируется. Не скажу что мне понравились макросы ENTER LEAVE, но второй сам восстанавливает сохраненное, не нужно параметры указывать.
AQ29 писал(а):Я без проблем писал программу 32 КБ
Безо всякого намерения как-то принизить Ваши результаты работы, но скажу, большой размер кода не показатель успешного программирования.

Пожалуйста только не развивайте тему, какой язык круче. Этого тут и так хватает и членами все давно перемерялись.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 15792
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

AQ29 писал(а):
dimmer писал(а):Мда... Однако... Интересную тему затронули. Большое спасибо всем за информацию, самому бы пришлось долго копаться, что-бы получить какое-то внятное представление. Я думаю, что если в будущем понадобится писать что-то больше 8 - 16Кбайт, то одним ассемблером наверно не обойдусь. Но пока хватает avrasm2.
Сильно занижаете возможности ассемблера. Я без проблем писал программу 32 КБ, хотя совсем не программист. Не вижу проблем и с большим по объёму кодом, просто не было таких задач. Пишу на макроассемблере АБ (Алгоритм Билдер)....
Ну уж алгоритм билдер также есть "надстройка более высокого уровня".
8)
Да и задачи для большого объёма кода иные. Тут даже наоборот - преимущество за малыми по объёму фрагментами при их последующей "склейке" в нечто более объёмистое.
Насчет макросов... более показатель недостатка стандартных команд для пишущего прожку.
Частенько от оных избавляет точно продуманный алгоритм с использованием уже имеющегося в наличии арсенала команд и правильно подобранного для конкретной цели МК.
:wink:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

AQ29 писал(а):Пишу на макроассемблере АБ (Алгоритм Билдер).
На мой взгляд, хорошо развитый ассемблер приближён к ЯВУ.
Одно из основных отличий ЯВУ - это переносимость программ. Допустим завтра ты решишь переходить на STM32, а там нет АБ, ассемблер совсем другой и практически никто на нем не пишет. В итоге все свои наработки на авр-м ассме придется переписывать на С(или опять на ассме, что еще хуже).
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

AQ29 писал(а): Слышал в интернете, что ограничение для ассемблера около 128 КБ.
На мой взгляд, хорошо развитый ассемблер приближён к ЯВУ.
Во-первых, на ассемблере пишутся программы любого размера. Сам на IBM/370 участвовал в создании кода на несколько сот килобайт. Но там просто не было ЯВУ позволящего эффективно использовать ресурсы каналов и стоек управления. Наилучшее приближение обеспечивал COBOL, но писать на нем - еще то удовольствие.
Во-вторых, ассемблер ну никак не может быть приближен к языку высокого уровня. Хотя бы потому, что ЯВУ обязан быть не зависящим от платформы и заниматься оптимизацией, а ассемблер никогда этим не занимается. И если для какого-то участка кода ассемблер кажется приближен к ЯВУ, то вы используете ассемблер не по назначению и эффективней этот код было бы написать, например, на С.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Что считать эффективностью. Затраты на написание программы или затраты на ее исполнение. По первому пункту ЯВУ обычно уделывают ассемблер, по второму - наоборот.
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб июл 30, 2011 21:00:24

Сообщение AQ29 »

Z_h_e писал(а):
AQ29 писал(а):Макросы банальные, имеют минимальный объём, пользоваться просто.
Это некорректное утверждение, макрос по сути это оператор ЯВУ и имеет значение во что он скомпилируется. Не скажу что мне понравились макросы ENTER LEAVE, но второй сам восстанавливает сохраненное, не нужно параметры указывать.
Скомпилируется в точно те же команды, которые пришлось бы писать «вручную».
Макрос очень прост, можно даже здесь привести:

IN_Stek_3 (aa, bb, cc)
~aa →
~bb →
~cc →

→ это в АБ операция записи в стек. Второй макрос аналогичен.
Часто при написании подпрограмм использую сохранение в стеке. Писал «вручную», ARV подтолкнул к мысли, что можно ввести небольшую автоматизацию.
Для вызова второго макроса нужно просто скопировать команду первого макроса и изменить буквы в имени с IN на OUT, поэтому параметры указывать не надо. Вот при изменении параметров придётся, конечно, корректировать второй макрос, но это мелочь.
Z_h_e писал(а):
AQ29 писал(а):Я без проблем писал программу 32 КБ
Безо всякого намерения как-то принизить Ваши результаты работы, но скажу, большой размер кода не показатель успешного программирования.
Пожалуйста только не развивайте тему, какой язык круче. Этого тут и так хватает и членами все давно перемерялись.
Это понятно. Здесь токмо в плане занижения возможностей ассемблера. Порог 8 - 16 КБ — явно мало. Скажем, в программе нужно взять логарифм. Секунд за 15 написал команду (вызов библиотечного элемента)
Log_10 (a, b)
и готово, кажется, более 1 КБ отлаженного ассемблерного кода.
Здесь двухбайтная переменная a – аргумент логарифма, b – итог вычисления логарифма.
BOB51 писал(а): Да и задачи для большого объёма кода иные. Тут даже наоборот - преимущество за малыми по объёму фрагментами при их последующей "склейке" в нечто более объёмистое.
Насчёт преимущества не понял. И небольшие подпрограммы (хорошо написанные) хороши, и большие хороши. Скажем, из нескольких небольших библиотечных элементов написал большой библиотечный элемент - логарифм. У кого какое преимущество?
BOB51 писал(а): Насчет макросов... более показатель недостатка стандартных команд для пишущего прожку.
Частенько от оных избавляет точно продуманный алгоритм с использованием уже имеющегося в наличии арсенала команд и правильно подобранного для конкретной цели МК.
:wink:
В АБ нет библиотеки, поэтому стандартные команды (умножение, деление, тот же логарифм) приходится искать или создавать самому.
Reflector писал(а): Одно из основных отличий ЯВУ - это переносимость программ. Допустим завтра ты решишь переходить на STM32, а там нет АБ, ассемблер совсем другой и практически никто на нем не пишет. В итоге все свои наработки на авр-м ассме придется переписывать на С(или опять на ассме, что еще хуже).
У АВР широкая номенклатура микроконтроллеров, обещают поддержку 10 лет, так что не вижу смысла переносить программы.
ptr128 писал(а): Во-первых, на ассемблере пишутся программы любого размера. Сам на IBM/370 участвовал в создании кода на несколько сот килобайт. Но там просто не было ЯВУ позволящего эффективно использовать ресурсы каналов и стоек управления. Наилучшее приближение обеспечивал COBOL, но писать на нем - еще то удовольствие.
Во-вторых, ассемблер ну никак не может быть приближен к языку высокого уровня. Хотя бы потому, что ЯВУ обязан быть не зависящим от платформы и заниматься оптимизацией, а ассемблер никогда этим не занимается. И если для какого-то участка кода ассемблер кажется приближен к ЯВУ, то вы используете ассемблер не по назначению и эффективней этот код было бы написать, например, на С.
COKPOWEHEU писал(а):Что считать эффективностью. Затраты на написание программы или затраты на ее исполнение. По первому пункту ЯВУ обычно уделывают ассемблер, по второму - наоборот.
Насчёт приближения к ЯВУ сказал не в теоретическом, а в практичном смысле.
Переносимость программ в пределах семейства АВР хорошая, а на другие семейства переходить не вижу смысла.
Зачем нужна оптимизация для хорошо написанной на АБ программе?
Насчёт эффективности тоже вопрос.
При наличии нужных библиотечных элементов время написания, думаю схоже. Отладка в АБ, думаю, намного проще. Ну а про скорость выполнения и объём — все знают.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Во-первых не нужно извращать мои слова. Я нигде не писал, что 8 - 16 Кб это порог для ассемблера. Дословно было:"Я думаю, что если в будущем понадобится писать что-то больше 8 - 16Кбайт, то одним ассемблером наверно не обойдусь."
Имел в виду, что как будет подходящая возможность, то хочется попробовать что-то другое (скорее всего С++).
Во-вторых, если коротко по поводу остального, что Вы написали - это по ту сторону Добра и Зла.
:) И вааще на С пишут те, кто на бейсике писать не умеет. :))
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

COKPOWEHEU писал(а):Что считать эффективностью. Затраты на написание программы или затраты на ее исполнение. По первому пункту ЯВУ обычно уделывают ассемблер, по второму - наоборот.
Не эффективно, это когда "овчинка выделки не стоит".
То есть, когда трудозатраты на ассемблерное кодирование оказались больше, чем экономический эффект от них.
В простейшем случае, когда эффективная реализация алгоритма на ассемле вообще не принесла видимого эффекта, так как определенные в ТЗ требования к производительности можно было достичь и на ЯВУ.
В более сложном, когда, хотя требования к производительности в ТЗ и не были оговорены, но прирост производительности от ассемблерного кодирования оказался в пределах статистической погрешности измерения этой производительности.

То есть эффективно - это верно выбранный баланс между тем, какой код проекта следовало писать на ЯВУ, а какой на ассемблере.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ptr128 писал(а):прирост производительности от ассемблерного кодирования оказался в пределах статистической погрешности измерения этой производительности
на сегодняшний день вопрос прироста производительности не стоит вообще, т.к. быстродействие даже микроконтроллеров AVR достигла такого уровня, что задумываться о быстродействии практически не приходится. если же взять мир 32-битных и тем паче 64-битных контроллеров, то там и подавно. про PC вообще молчу.

для слабых микроконтроллеров единственное обоснование использования ассемблера - это отсутствие должного объема памяти. для "больших" платформ я вообще не представляю причин, которые могут вынудить его применять.

P.S. само собой, я говорю о "прикладных" задачах, чаще любительских. ядро ОСРВ и на больших системах, скорее всего, без ассемблера не обойдется хотя бы в виде вставок. прошу только ptr128: не надо приводить в пример ваши изыски в работе с ЖКИ :) ваш опыт не может сдвинуть линию общего тренда...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

:)))
Изображение
Вложения
PC1.jpg
(63.14 КБ) 523 скачивания
Ответить

Вернуться в «AVR»