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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

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

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

Сообщение siimao »

Z_h_e, спасибо огроменное за ответ! Полез на дерево учиться...
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

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

Сообщение 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) – извлечение переменных из стека.
Макросы банальные, имеют минимальный объём, пользоваться просто.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

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

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

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

Сообщение BOB51 »

AQ29 писал(а):
dimmer писал(а):Мда... Однако... Интересную тему затронули. Большое спасибо всем за информацию, самому бы пришлось долго копаться, что-бы получить какое-то внятное представление. Я думаю, что если в будущем понадобится писать что-то больше 8 - 16Кбайт, то одним ассемблером наверно не обойдусь. Но пока хватает avrasm2.

Сильно занижаете возможности ассемблера. Я без проблем писал программу 32 КБ, хотя совсем не программист. Не вижу проблем и с большим по объёму кодом, просто не было таких задач. Пишу на макроассемблере АБ (Алгоритм Билдер)....


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

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

Сообщение Reflector »

AQ29 писал(а):Пишу на макроассемблере АБ (Алгоритм Билдер).
На мой взгляд, хорошо развитый ассемблер приближён к ЯВУ.

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

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

Сообщение ptr128 »

AQ29 писал(а):Слышал в интернете, что ограничение для ассемблера около 128 КБ.
На мой взгляд, хорошо развитый ассемблер приближён к ЯВУ.


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

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

Сообщение COKPOWEHEU »

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

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

Сообщение 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 писал(а):Что считать эффективностью. Затраты на написание программы или затраты на ее исполнение. По первому пункту ЯВУ обычно уделывают ассемблер, по второму - наоборот.


Насчёт приближения к ЯВУ сказал не в теоретическом, а в практичном смысле.
Переносимость программ в пределах семейства АВР хорошая, а на другие семейства переходить не вижу смысла.
Зачем нужна оптимизация для хорошо написанной на АБ программе?
Насчёт эффективности тоже вопрос.
При наличии нужных библиотечных элементов время написания, думаю схоже. Отладка в АБ, думаю, намного проще. Ну а про скорость выполнения и объём — все знают.
dimmer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

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

Сообщение dimmer »

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

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

Сообщение ptr128 »

COKPOWEHEU писал(а):Что считать эффективностью. Затраты на написание программы или затраты на ее исполнение. По первому пункту ЯВУ обычно уделывают ассемблер, по второму - наоборот.

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

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

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

Сообщение ARV »

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

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

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

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

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

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

:)))
Изображение
Вложения
PC1.jpg
(63.14 КБ) 484 скачивания
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

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

Сообщение ptr128 »

ARV писал(а):ваш опыт не может сдвинуть линию общего тренда...

Больная мозоль. В среднем, из всех проектов, которыми я руководил или архитектурой которых занимался, только в половине удается добиться написания оптимизированного кода до окончания ОПЭ, а не только после того как, у клиента объем обрабатываемых данных вырастет на несколько порядков и он начнет писать возмущенные письма.
И это при том, что проекты большие, некоторые длились годами и все были вокруг баз даных объемом до нескольких терабайт.
Но "линию общего тренда" при этом, как Вы правильно заметили, сдвинуть не удается. Копроэкономика... (
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
CB1
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт янв 01, 2015 13:44:12

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

Сообщение CB1 »

Доброго времени суток! По не многу начинаю изучать ассемблер для AVR. Написал небольшую программу счетчика. Сама программа компилируется, а когда пытаюсь запустить программу в Proteus, то он начинает ругаться. Подскажите в чем тут может быть дело? Проект в архиве.
Вложения
2. Семисегментный индикатор и кнопки(счетчик).rar
(79.22 КБ) 165 скачиваний
Все гениальное - просто
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

Тут кто хош заругается. Используете ret, а стек не инициализирован. А каким образом она считать должна? Кнопки не работают. Тут всё не так. :shock:
И ещё. Вам комментарии не нужны? Ведь через день забудете что наваяли
Я всё-всё узнAю и стану профессором.
CB1
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт янв 01, 2015 13:44:12

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

Сообщение CB1 »

Считать она должна нажатия на кнопки (при нажатии на кнопку PD4 - должен счетчик увеличиваться, а при нажатии на кнопку PD7 - уменьшаться). Если кнопки отбросить и сделать счетчик без кнопок, то все работает, происходит возвращение по команде ret.
Проблема в данной части кода

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

        cpi R17,0
   breq Nol
        ..............
        cpi R17, 9
   breq Devyat

если я ее закомментирую, то все работает.
Все гениальное - просто
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

Да вы хотя бы поменяли rjmp pause на rcall, и стек инициализируйте!!!
Может и заработает тогда что-то, и то, только в протеусе. В железе это не заработает
никогда(вы о дребезге слыхали?). Менять ВСЁ начиная с алгоритма.
Я всё-всё узнAю и стану профессором.
CB1
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт янв 01, 2015 13:44:12

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

Сообщение CB1 »

Дребезг контактов я учел и добавил паузу в метках (понятное дело что это самый простой метод, но я только начинаю изучать ассемблер).
Все гениальное - просто
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

Ну бляяяу!!! Да почитайте, наконец, Ревича:
" Практическое программирование МК Atmel AVR на языке ассемблера "
Или ссылку еще дать?
Я всё-всё узнAю и стану профессором.
Ответить

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