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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25162
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657605#p4657605"]Просто, так как я пользовался ассемблером исключительно из С, то упустил, что именно его загрузчик перемещает сегмент данных из флеша в оперативку.[/uquote]
Если я в коде на Си определю таблицу как const, то линкер ее прибъет гвоздями к флешу.
Нет никакого смысла в таблицах, если они будут отжирать дорогой и дефицитный RAM с 6 транзисторами на бит вместо дешевого флеша с 1 транзистором на бит.
В системе команд 8-битных (и не только) контроллеров отдельной фичей является доступ к флешу как к данным В РЕАЛЬНОМ ВРЕМЕНИ, а не с помощью создания копии в ОЗУ.
В современных чипах того же Микрочипа есть такое понятие, как PSV-доступ. Когда в гарвардской архитектуре пространство адресов флеша отображается в пространство адресов ОЗУ.
ЗЫ. И причем тут загрузчик? :dont_know:
Загрузчик не работает из исполняемого кода - у него совершенно другие функции. То, о чем вы говорите, называется стартапом. И если я определю таблицу как инициализированный массив в ОЗУ, тогда в стартапе произойдет загрузка в ОЗУ из таблицы расположенной непосредственно за программным кодом флеша.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

[uquote="Adrift",url="/forum/viewtopic.php?p=4657612#p4657612"]я сомневаюсь что был хоть один случай когда вместо программы размером 1КB приносили программу на 1GB и доказывали, что сама программа то 1KB, а все остальное - данные загружаемые с внешнего носителя )[/uquote]
Более того, такие решения я применяю постоянно. Например, прогнозирование выполняется в выходные за 36-40 часов, данные результата сохраняются, а остальной код, которому требуются результаты этого прогнозирования, используют эти данные в течении недели. И ни разу мне никто не сказал, что эти даже не гигабайтные, а стогигабайтные прогнозы, являются кодом тех модулей, которые этот прогноз использует.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

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

clr R16
ldi R17, 9
dec R17
breq pc+5
lsl(lsr) R1
brcc pc-3
inc R16
rjmp pc-5
; ---
dec r16
breq(brne)...куда-нибудь
если только не ошибся)
проверку цикла пришлось впереди поставить :dont_know:
Последний раз редактировалось shonty Сб дек 07, 2024 15:55:05, всего редактировалось 2 раза.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4657641#p4657641"]Если я в коде на Си определю таблицу как const, то линкер ее прибъет гвоздями к флешу.[/uquote]
Можете точно, до последних цифр в версии, указать используемый компилятор и линкер? У меня avr-gcc упорно копирует данные со спецификатором const в RAM. Для того, чтобы заставить его разместить их во флеше приходится явно указывать дополнительно спецификатор PROGMEM.

[uquote="КРАМ",url="/forum/viewtopic.php?p=4657641#p4657641"]Нет никакого смысла в таблицах, если они будут отжирать дорогой и дефицитный RAM[/uquote]
В AVR есть, так как особенности системы команд приводят к снижению производительности при доступе к данным в флеше.
Для доступа к данным в флеш есть единственная команда LPM, гвоздями прибитая к адресу в r31:r30 и выполняемая за 3 такта.
Тогда как возможности LD куда шире, а выполняются они за 2 такта.
Так что, если для задачи RAM достаточно, а производительность очень важна, то лучше копировать все или часть константных данных в RAM при старте.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

shonty писал(а):если только не ошибся)
нет, не ошибся, работает. Исключает где 1+ бит и 0 бит.

Добавлено after 39 seconds:
но про 0 бит не было установки куда сортировать :)

Добавлено after 1 minute 39 seconds:
20 байт :dont_know:
но пока рекорд))
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

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

Сообщение Adrift »

[uquote="shonty",url="/forum/viewtopic.php?p=4657686#p4657686"]20 байт :dont_know:
но пока рекорд))[/uquote]

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

      cpi r0,2
      brlo end
      mov r1,r0
      dec r1
      and r0,r1
      inc r0
end:
Проверить негде, но должно работать. Если в байте установлен единичный бит, то в r0 должно вернуть 1.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Adrift писал(а):Если в байте установлен единичный бит, то в r0 должно вернуть 1.
да, возвращает, проверил.
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

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

Сообщение Adrift »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657670#p4657670"][uquote="Adrift",url="/forum/viewtopic.php?p=4657612#p4657612"]я сомневаюсь что был хоть один случай когда вместо программы размером 1КB приносили программу на 1GB и доказывали, что сама программа то 1KB, а все остальное - данные загружаемые с внешнего носителя )[/uquote]
Более того, такие решения я применяю постоянно. Например, прогнозирование выполняется в выходные за 36-40 часов, данные результата сохраняются, а остальной код, которому требуются результаты этого прогнозирования, используют эти данные в течении недели. И ни разу мне никто не сказал, что эти даже не гигабайтные, а стогигабайтные прогнозы, являются кодом тех модулей, которые этот прогноз использует.[/uquote]
Есть у вас, допустим, функция std::sort(), она поставляется вместе с данными которые должна сортировать? Нет конечно, можно хоть пустой массив передать на сортировку, ей без разницы. А что если внутри std::sort() есть таблица которая используется для ускорения некоторых операций, можно пользоваться такой функцией без нее? Снова нет, эта таблица нужна чтобы программа в принципе могла работать и является неотъемлемой частью программы.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Это издержки ЯВУ видимо.. Не все конечно, но некоторые погружаются в такую беспробудную виртуализацию :facepalm: , что не воспринимают физическое существование объекта :)
Аватара пользователя
ДядяВован
Мучитель микросхем
Сообщения: 490
Зарегистрирован: Вс окт 25, 2020 22:13:25
Откуда: Смоленск

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

Сообщение ДядяВован »

определить, что в байте единичный только 1 бит, все остальные в нуле

Если я правильно понимаю тз, то единичный бит может быть в любой позиции байта и надо понять, что он один?
Тогда так (проверяемый байт в r0, сохраняется)

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

       ldi r16, 1
m1: mov r1, r16
       eor r1, r0
       breq label_one_bit
       rol r16
       brcc m1
      ; здесь имеем не одну единицу в байте
      ...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25162
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657685#p4657685"]У меня avr-gcc упорно копирует данные со спецификатором const в RAM. Для того, чтобы заставить его разместить их во флеше приходится явно указывать дополнительно спецификатор PROGMEM.[/uquote]
Это проблема конкретно gcc, который писался для фоннеймана, а не для гарварда.
Но на gcc свет клином не сошелся. XC8 и XC16 (а так же Кайл) по умолчанию размещают const во флеш.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657685#p4657685"]В AVR есть, так как особенности системы команд приводят к снижению производительности при доступе к данным в флеше.
Для доступа к данным в флеш есть единственная команда LPM, гвоздями прибитая к адресу в r31:r30 и выполняемая за 3 такта.
Тогда как возможности LD куда шире, а выполняются они за 2 такта.
Так что, если для задачи RAM достаточно, а производительность очень важна, то лучше копировать все или часть константных данных в RAM при старте.[/uquote]
С этим трудно не согласиться. Однако в большинстве задач таблицы имеют значительный размер и не влазят в ОЗУ.
По крайней мере в моем чисто радиотехническом эмбедде. Это тригонометрические функции, оконные функции, таблицы линеаризации, таблицы обмена, таблицы шифрования и CRC. Я бы сказал, что таблицы у меня занимают минимум четверть хекса.
Последний раз редактировалось КРАМ Сб дек 07, 2024 21:31:20, всего редактировалось 1 раз.
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

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

Сообщение AQ29 »

[uquote="ДядяВован",url="/forum/viewtopic.php?p=4657639#p4657639"]
AQ29 писал(а):вариант из 5 команд
Коротко конечно. Но с допущением, что входящее значение имеет только один единичный бит. Если больше или ноль, то зависли.[/uquote]
Почему программа зависнет?
Если байт не содержит один единичный бит, в конце 8 цикла команда LSL обнулит r20, бит Z в SREG установится в 1. Команда BRNE будет пропущена.
Ещё один плюс программы, по значению r20 можно узнать положение бита.
Если r20 = 0, то единичного бита нет, если, например, r20 = 4, то единичный бит находится во 2 разряде (отсчёт от нуля).
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4657755#p4657755"]Это проблема конкретно gcc, который писался для фоннеймана, а не для гарварда.[/uquote]
Очень сомневаюсь, но об этом ниже.

[uquote="КРАМ",url="/forum/viewtopic.php?p=4657755#p4657755"]XC8 и XC16 (а так же Кайл) по умолчанию размещают const во флеш.[/uquote]
Это очень похоже на нарушение стандарта.
Спецификатор const в стандарте относится только к своей области видимости и лишь запрещает модификацию переменной с этим спецификатором.
Но спецификатор const не должен влиять на область памяти, в которой эта переменная находится и на машинный код, который используется для доступа к этой переменной.
В одном модуле может выделяться память для переменной со спецификатором const (или даже const volatile), а в другом модуле - содержаться функция, модифицирующая эту переменную, как extern. Например, вычисляя какие-то калибровочные значения.
Получается, что если для каких то модулей глобальная переменная может модифицироваться, а для каких-то - нет, то указанные Вами компиляторы, в разрез стандарту, не позволяют это указать.

[uquote="КРАМ",url="/forum/viewtopic.php?p=4657755#p4657755"]С этим трудно не согласится. Однако в большинстве задач...[/uquote]
В большинстве Ваших задач - возможно. А я, например, выбираю МК под задачу, а не наоборот. Если Вам мало 2К в ATMega328, то кто мешает взять ESP32-C3 с 400К, который сейчас стоит чуть ли не дешевле Arduino Nano?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25162
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657831#p4657831"]указанные Вами компиляторы, в разрез стандарту, не позволяют это указать.[/uquote]
Я в каком то месте сказал, что не позволяют? Я сказал, что делают это по дефолту. Я в курсе стандарта, если что. Однако контроллеры - это особая тема со своей спецификой.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657831#p4657831"]В большинстве Ваших задач - возможно. А я, например, выбираю МК под задачу, а не наоборот.[/uquote]
Вы не поверите - я тоже. Только у нас с вами задачи разные.
Плюс к этому нужно сопоставлять не любые МК, а только те, которые вообще способны удовлетворять ТТХ целевого устройства.
Приведу пример.
Года два назад я разработал RF-EAS систему моно типа (есть альтернативная - свипирующая, а эта с импульсным возбуждением). Стандартное решение в этой системе по аналоговому фронтэнду - конвейерный АЦП 10...12 разрядов с рейтом от 40 мспс. Нужно этот поток втянуть в МК и обеспечить обработку в 9 частотных фильтрах и последующим корреляционным анализом.
Все производители ставят на входе FPGA и только потом МК или все делают на FPGA. Я обошелся одним 5 долларовым двухядерным dsPIC33CH512MP208.
В результате электроника изделия имеет себестоимость 70 долларов против 160 у самых дешевых китайцев и 250 у чехов.
Есть такое мнение, что ESP кратно не справится с задачей. :wink: Это контроллер совершенно для другого.
Сейчас в работе ридер HF RFID, где требуется, чтобы в МК был приличный АЦП с рейтом 5 мспс и более. Плюс ядро от 240 мипс и более. В работу пошел AT32F435. 250 рублей, если что... :)
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

То, что компилятор нарушает стандарт по-умолчанию - уже нарушение. Даже если его пинками можно заставить стандарт соблюдать.
А Ваши задачи - это всё же только Ваши задачи. И не надо распространять их на "большинство".
Последнее из субъективного опыта никак не может вытекать. Для таких утверждений нужна весьма широкая и репрезентативная выборка.

Ну и себестоимость производства единицы изделия ни о чем не говорит, без указания его тиража и стоимости его разработки.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

ПростоНуб писал(а):У меня avr-gcc упорно копирует данные со спецификатором const в RAM.
Вы это как представляете физически? Она же энергозависимая :dont_know:

Добавлено after 18 minutes 50 seconds:
AVR GCC: секции памяти (что такое .text, .data, .bss, .noinit?)
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25162
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657868#p4657868"]То, что компилятор нарушает стандарт по-умолчанию - уже нарушение. Даже если его пинками можно заставить стандарт соблюдать.[/uquote]
Это не ко мне. Это к Микрочипу и Кайлу. :tea:
Догадайтесь с одного раза что они вам скажут на вашу "критику". Особенно с учетом вашей квалификации в электронике и радиотехнике. :)
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657868#p4657868"]А Ваши задачи - это всё же только Ваши задачи. И не надо распространять их на "большинство".
Последнее из субъективного опыта никак не может вытекать.[/uquote]
Какое отношение "репрезентативность" имеет к обсуждаемым вопросам? Есть такое мнение, что вообще никакого.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657868#p4657868"]Ну и себестоимость производства единицы изделия ни о чем не говорит, без указания его тиража и стоимости его разработки.[/uquote]
Для того, чтобы у вас были все данные для "все говорит о..." добавлю, что разработка длилась силами 1 (ОДНОГО) человека в течении 5 месяцев при нетто занятости именно этим проектом этого человека примерно 60%. Итого, чистого времени на весь проект 3 человеко-месяца. Из них на собственно написание кода - примерно четверть общих трудозатрат.
Тиражность следует из назначения изделия. Намекну - только один объект требует в среднем примерно 25 изделий. Объектов у только одной торговой сети примерно 500. Торговых сетей ... в общем вы поняли о чем я... :tea:
[uquote="shonty",url="/forum/viewtopic.php?p=4657917#p4657917"]Вы это как представляете физически?[/uquote]
Ну это как раз просто. Делаются костыли для согласования здравого смысла с чуждым стандартом в виде копирования содержимого флеша в озу в стартапе. И занудные погромисты остаются довольны. :)))
Ведь const в стандарте это всего лишь самозапрет на модификацию - часть системы безопасности данных. Причем тут флеш?
Тем более, что и флеш может быть модифицирована. :wink: :tea:
Аватара пользователя
главный колбасист
Это не хвост, это антенна
Сообщения: 1324
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край
Контактная информация:

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

Сообщение главный колбасист »

[uquote="AQ29",url="/forum/viewtopic.php?p=4656405#p4656405"]Надо дождаться, когда дребезг закончиться, тогда можно считывать положения кнопок.
Я использовал простой вариант – программа считывает порт с кнопками 3 раза с интервалом 30 миллисекунд в 3 регистра РОН, например, r20, r21 и r22. Если r21 не равно r20, то начинаю считывать сначала. Когда все 3 регистра равны, то дребезг закончился, это реальное состояние кнопок.[/uquote]
А можно сделать программный симулятор дребезжащей кнопки,и сравнивать с ним,а не с предыдущими двумя считываниями ?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25162
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="главный колбасист",url="/forum/viewtopic.php?p=4657965#p4657965"]Я использовал простой вариант – программа считывает порт с кнопками 3 раза с интервалом 30 миллисекунд в 3 регистра РОН...[/uquote]
А кнопка может дребезжать без нажатия на нее?
Какой смысл ждать бездребезгового состояния на интервале опроса большем, чем время дребезга?
Попадание на дребезг ничем не грозит. Просто читаете состояние.
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

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

Сообщение Adrift »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657831#p4657831"]Но спецификатор const не должен влиять на область памяти, в которой эта переменная находится и на машинный код, который используется для доступа к этой переменной.
В одном модуле может выделяться память для переменной со спецификатором const (или даже const volatile), а в другом модуле - содержаться функция, модифицирующая эту переменную, как extern. Например, вычисляя какие-то калибровочные значения.
Получается, что если для каких то модулей глобальная переменная может модифицироваться, а для каких-то - нет, то указанные Вами компиляторы, в разрез стандарту, не позволяют это указать.[/uquote]
Вы же сами выше написали, что модификатор const в стандарте запрещает модификацию переменных, следовательно не должно быть никаких функций в других модулях этой модификацией занимающихся, разве что вы сами собираетесь нарушать стандарты. Можно, конечно, взять указатель, привести его к неконстантному и записать новое значение, но с непредсказуемым результатом. В VS, например, я в таком случае ловлю эксепшен. Вариантов всего два: или инициализируем const переменную константным значением, или вычисляемым в рантайме.

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

int calcVar() { return GPIOA->IDR; }

const int gvar  = 10;
const int gvar2 = calcVar();
Если посмотреть на адреса, то gvar оказалась во флеше, а gvar2 - в RAM. Если calcVar() будет в другом модуле и компилятор не сможет понять свернется она до константы или нет, то переменная пойдет в RAM.

Добавлено after 9 minutes 5 seconds:
[uquote="shonty",url="/forum/viewtopic.php?p=4657715#p4657715"]Это издержки ЯВУ видимо.. Не все конечно, но некоторые погружаются в такую беспробудную виртуализацию :facepalm: , что не воспринимают физическое существование объекта :)[/uquote]
У меня есть более простая теория, но по этическим причинам ее лучше не озвучивать )
Ответить

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