Страница 390 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 14:05:32
КРАМ
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657605#p4657605"]Просто, так как я пользовался ассемблером исключительно из С, то упустил, что именно его загрузчик перемещает сегмент данных из флеша в оперативку.[/uquote]
Если я в коде на Си определю таблицу как const, то линкер ее прибъет гвоздями к флешу.
Нет никакого смысла в таблицах, если они будут отжирать дорогой и дефицитный RAM с 6 транзисторами на бит вместо дешевого флеша с 1 транзистором на бит.
В системе команд 8-битных (и не только) контроллеров отдельной фичей является доступ к флешу как к данным В РЕАЛЬНОМ ВРЕМЕНИ, а не с помощью создания копии в ОЗУ.
В современных чипах того же Микрочипа есть такое понятие, как PSV-доступ. Когда в гарвардской архитектуре пространство адресов флеша отображается в пространство адресов ОЗУ.
ЗЫ. И причем тут загрузчик?
Загрузчик не работает из исполняемого кода - у него совершенно другие функции. То, о чем вы говорите, называется стартапом. И если я определю таблицу как инициализированный массив в ОЗУ, тогда в стартапе произойдет загрузка в ОЗУ из таблицы расположенной непосредственно за программным кодом флеша.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 15:10:25
ПростоНуб
[uquote="Adrift",url="/forum/viewtopic.php?p=4657612#p4657612"]я сомневаюсь что был хоть один случай когда вместо программы размером 1КB приносили программу на 1GB и доказывали, что сама программа то 1KB, а все остальное - данные загружаемые с внешнего носителя )[/uquote]
Более того, такие решения я применяю постоянно. Например, прогнозирование выполняется в выходные за 36-40 часов, данные результата сохраняются, а остальной код, которому требуются результаты этого прогнозирования, используют эти данные в течении недели. И ни разу мне никто не сказал, что эти даже не гигабайтные, а стогигабайтные прогнозы, являются кодом тех модулей, которые этот прогноз использует.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 15:31:18
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)...куда-нибудь
если только не ошибся)
проверку цикла пришлось впереди поставить

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 15:45:06
ПростоНуб
[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 при старте.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 15:51:33
shonty
shonty писал(а):если только не ошибся)
нет, не ошибся, работает. Исключает где 1+ бит и 0 бит.
Добавлено after 39 seconds:
но про 0 бит не было установки куда сортировать
Добавлено after 1 minute 39 seconds:
20 байт
но пока рекорд))
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 16:13:11
Adrift
[uquote="shonty",url="/forum/viewtopic.php?p=4657686#p4657686"]20 байт
но пока рекорд))[/uquote]
Код: Выделить всё
cpi r0,2
brlo end
mov r1,r0
dec r1
and r0,r1
inc r0
end:
Проверить негде, но должно работать. Если в байте установлен единичный бит, то в r0 должно вернуть 1.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 16:29:21
shonty
Adrift писал(а):Если в байте установлен единичный бит, то в r0 должно вернуть 1.
да, возвращает, проверил.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 16:44:48
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() есть таблица которая используется для ускорения некоторых операций, можно пользоваться такой функцией без нее? Снова нет, эта таблица нужна чтобы программа в принципе могла работать и является неотъемлемой частью программы.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 16:55:41
shonty
Это издержки ЯВУ видимо.. Не все конечно, но некоторые погружаются в такую беспробудную виртуализацию

, что не воспринимают физическое существование объекта

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 18:34:17
ДядяВован
определить, что в байте единичный только 1 бит, все остальные в нуле
Если я правильно понимаю тз, то единичный бит может быть в любой позиции байта и надо понять, что он один?
Тогда так (проверяемый байт в r0, сохраняется)
Код: Выделить всё
ldi r16, 1
m1: mov r1, r16
eor r1, r0
breq label_one_bit
rol r16
brcc m1
; здесь имеем не одну единицу в байте
...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 18:54:19
КРАМ
[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. Я бы сказал, что таблицы у меня занимают минимум четверть хекса.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 21:30:17
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 разряде (отсчёт от нуля).
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 21:36:36
ПростоНуб
[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?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 22:08:29
КРАМ
[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 кратно не справится с задачей.

Это контроллер совершенно для другого.
Сейчас в работе ридер HF RFID, где требуется, чтобы в МК был приличный АЦП с рейтом 5 мспс и более. Плюс ядро от 240 мипс и более. В работу пошел AT32F435. 250 рублей, если что...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 22:45:45
ПростоНуб
То, что компилятор нарушает стандарт по-умолчанию - уже нарушение. Даже если его пинками можно заставить стандарт соблюдать.
А Ваши задачи - это всё же только Ваши задачи. И не надо распространять их на "большинство".
Последнее из субъективного опыта никак не может вытекать. Для таких утверждений нужна весьма широкая и репрезентативная выборка.
Ну и себестоимость производства единицы изделия ни о чем не говорит, без указания его тиража и стоимости его разработки.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 08, 2024 06:28:23
shonty
ПростоНуб писал(а):У меня avr-gcc упорно копирует данные со спецификатором const в RAM.
Вы это как представляете физически? Она же энергозависимая
Добавлено after 18 minutes 50 seconds:
AVR GCC: секции памяти (что такое .text, .data, .bss, .noinit?)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 08, 2024 09:30:13
КРАМ
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657868#p4657868"]То, что компилятор нарушает стандарт по-умолчанию - уже нарушение. Даже если его пинками можно заставить стандарт соблюдать.[/uquote]
Это не ко мне. Это к Микрочипу и Кайлу.
Догадайтесь с одного раза что они вам скажут на вашу "критику". Особенно с учетом вашей квалификации в электронике и радиотехнике.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657868#p4657868"]А Ваши задачи - это всё же только Ваши задачи. И не надо распространять их на "большинство".
Последнее из субъективного опыта никак не может вытекать.[/uquote]
Какое отношение "репрезентативность" имеет к обсуждаемым вопросам? Есть такое мнение, что вообще никакого.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4657868#p4657868"]Ну и себестоимость производства единицы изделия ни о чем не говорит, без указания его тиража и стоимости его разработки.[/uquote]
Для того, чтобы у вас были все данные для "все говорит о..." добавлю, что разработка длилась силами 1 (ОДНОГО) человека в течении 5 месяцев при нетто занятости именно этим проектом этого человека примерно 60%. Итого, чистого времени на весь проект 3 человеко-месяца. Из них на собственно написание кода - примерно четверть общих трудозатрат.
Тиражность следует из назначения изделия. Намекну - только один объект требует в среднем примерно 25 изделий. Объектов у только одной торговой сети примерно 500. Торговых сетей ... в общем вы поняли о чем я...

[uquote="shonty",url="/forum/viewtopic.php?p=4657917#p4657917"]Вы это как представляете физически?[/uquote]
Ну это как раз просто. Делаются костыли для согласования здравого смысла с чуждым стандартом в виде копирования содержимого флеша в озу в стартапе. И занудные погромисты остаются довольны.
Ведь const в стандарте это всего лишь самозапрет на модификацию - часть системы безопасности данных. Причем тут флеш?
Тем более, что и флеш может быть модифицирована.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 08, 2024 09:36:05
главный колбасист
[uquote="AQ29",url="/forum/viewtopic.php?p=4656405#p4656405"]Надо дождаться, когда дребезг закончиться, тогда можно считывать положения кнопок.
Я использовал простой вариант – программа считывает порт с кнопками 3 раза с интервалом 30 миллисекунд в 3 регистра РОН, например, r20, r21 и r22. Если r21 не равно r20, то начинаю считывать сначала. Когда все 3 регистра равны, то дребезг закончился, это реальное состояние кнопок.[/uquote]
А можно сделать программный симулятор дребезжащей кнопки,и сравнивать с ним,а не с предыдущими двумя считываниями ?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 08, 2024 10:31:15
КРАМ
[uquote="главный колбасист",url="/forum/viewtopic.php?p=4657965#p4657965"]Я использовал простой вариант – программа считывает порт с кнопками 3 раза с интервалом 30 миллисекунд в 3 регистра РОН...[/uquote]
А кнопка может дребезжать без нажатия на нее?
Какой смысл ждать бездребезгового состояния на интервале опроса большем, чем время дребезга?
Попадание на дребезг ничем не грозит. Просто читаете состояние.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 08, 2024 10:44:49
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"]Это издержки ЯВУ видимо.. Не все конечно, но некоторые погружаются в такую беспробудную виртуализацию

, что не воспринимают физическое существование объекта

[/uquote]
У меня есть более простая теория, но по этическим причинам ее лучше не озвучивать )