Сегмент данных резервирует оперативную память, а не флеш.
AVR всегда для сегментов DATA и RODATA резервирует флеш. Содержимое сегмента DATA bootloader копирует в RAM, а RODATA - нет. Во флеш не попадает лишь BSS сегмент.
Вы нагло лжете. Я ни в каком месте не утверждал, что в сегменте данных находится код. Это принципиально невозможно. Это гарвардская архитектура. Я утверждал, что ТАБЛИЦЫ находятся во флеше и потому описываются в сегменте кода. Так устроен avrasm.
Добавлено after 42 minutes 40 seconds: Поэкспериментировал. Что касается извращений - я явно был не прав. AVR ассемблер не позволяет создать объектный файл с сегментом данных RODATA. Для того, чтобы создать объектный файл с сегментом данных RODATA пришлось извращаться через avr-gcc. Только после этого прошивка всё же собралась линкером. Так же я был не прав с копированием сегмента DATA из флеша bootloader. В случае ассемблера такого не происходит, только в startup коде GCC. В итоге, разместить таблицу в сегменте данных RODATA мне удалось, но это оказалось далеко от общепринятого и не средствами avrasm.
ПростоНуб, сегмент DATA - это ОЗУ. а когда ты подаешь питание на МК, в ОЗУ находится хаос, и никакие нужные для работы данные в ОЗУ не появятся. а чтобы в ОЗУ поместить нужные данные (твою таблицу) нужен кусок кода в программной памяти. так что, любые данные в сегменте данных - это код из программной памяти. у меня, например, все данные, нужные для работы, находятся в еепром. и при включении эти данные читаются из еепром и копируются в ОЗУ. и только когда данные (например таблица) лежит во флеши, дополнительный кусок кода для их копирования в ОЗУ не нужен. но при расположении данных во флеши сразу видно, что это часть кода.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 07, 2024 08:55:24
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Развели канитель. Я привёл код - несколько XORов. Кто-то сможет короче и быстрее?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Gudd-Head, вы привели картинку с текстом. Но не код на avr asm.
Вариант цикла (Starichok51, ваш вариант, я так понимаю +/- такой же)
R1:R0 - исходное значение
Код:
LDI R16,16 Label: ROR R1 ROR R0 ROL R3 ROL R2 DEC R16 BRNE Label
R3:R2 - результат. Длина кода 14 байт.
ПростоНуб писал(а):
Это будет уже третье изменение постановки.
Кто хочет спорить - тому будет третье. Кто хочет решить задачу - предлагает решения, даже в виде картинок. В постановке задачи было -
Just_Fluffy писал(а):
минимальный код на асме AVR
- т.е. без привязки к конкретному МК. Значит код должен корректно работать на любой старой доброй 8битной AVRке.
Adrift писал(а):
Речь про вот эти несколько XORов?
Именно про эти. Но тут есть маленькое но. Компилятор с ЯВУ зачастую сгенерит не самый оптимальный по размеру код. Поэтому то я и прошу Gudd-Head показать код на асме, а не скан книжки. Ибо его код, возможно и быстрее будет выполняться, но никак не короче. А в постановке задачи было
Just_Fluffy писал(а):
минимальный код на асме AVR
Но почему то под минимальным все считают самый быстрый, а не самый маленький. Самый быстрый - табличный, но он не маленький )))))
Добавлено after 9 minutes 32 seconds: Adrift, Кстати, если тупо в лоб циклом, то он компилируется в более короткий код.
Первая задача решается «в лоб», поэтому решение появилось. Вторая задача не совсем в лоб. Вот мой вариант из 5 команд. Yes – метка перехода, когда в байте один единичный бит. r0 - исходный байт.
Поменять, конечно. Чтобы не думать о порядке следования байтов, на «хорошем» ассемблере есть команда Shift_R V, которая сдвигает переменную V на один шаг вправо.
когда ты подаешь питание на МК, в ОЗУ находится хаос, и никакие нужные для работы данные в ОЗУ не появятся
Это само собой. Просто, так как я пользовался ассемблером исключительно из С, то упустил, что именно его загрузчик перемещает сегмент данных из флеша в оперативку.
но при расположении данных во флеши сразу видно, что это часть кода.
Как это видно? Видно, что на них управление передается? Может здесь принято иначе, но когда я употребляю по отношению к программированию слово "код", это я просто не уточняю, он "машинный", "исходный" или промежуточный (как у LLVM). То есть, код - это инструкции CPU или то, что привело к их формированию бекэндом-кодогенератором или компилятором. И если данные были конвертированы из бинарного файла в объектный при помощи objcopy, то когда и как они вдруг превратились в код? А если я на STM8 загружу код в RAM и выполню его оттуда, это будут данные или код? )))
Первая задача решается «в лоб», поэтому решение появилось.
Я пока так и не понял постановку задачи. Требуется оптимизировать размер кода или его производительность? В зависимости от этого задача решается по разному.
То есть, код - это инструкции CPU или то, что привело к их формированию бекэндом-кодогенератором или компилятором. И если данные были конвертированы из бинарного файла в объектный при помощи objcopy, то когда и как они вдруг превратились в код? А если я на STM8 загружу код в RAM и выполню его оттуда, это будут данные или код? )))
Представьте, что у нас один из тех конкурсов где нужно писать программы ограниченные по размеру до 1/4/64...КB. Слышали же про такие? Простые и понятные абсолютному большинству условия и я сомневаюсь что был хоть один случай когда вместо программы размером 1КB приносили программу на 1GB и доказывали, что сама программа то 1KB, а все остальное - данные загружаемые с внешнего носителя )
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения