Асм листинг из cpp - что за фигня?
- Войдите на сайт для отправки комментариев
GAS LISTING /tmp/cclxnjyt.s page 1
1 .file "Osciloscope.ino.cpp"
2 __SP_H__ = 0x3e
3 __SP_L__ = 0x3d
4 __SREG__ = 0x3f
5 __RAMPZ__ = 0x3b
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .text
9 .Ltext0:
10 .section .gnu.lto_.profile.fc1ebfc1cbb4adc1,"",@progbits
11 0000 789C 6366 .string "x\234cf```e\200"
11 6060 6065
11 8000
12 000a 4686 398C .string "F\2069\214i"
12 6900
13 0010 02C6 010D .ascii "\002\306\001\r"
14 .text
15 .section .gnu.lto_.jmpfuncs.fc1ebfc1cbb4adc1,"",@progbits
16 0000 789C 6D8E .string "x\234m\216;\n\002A\020D\253\272\375\255\202\007\360\016{\276\215\026\006\024\024A\217 f\3
16 3B0A 0241
16 1044 ABBA
16 FDAD 8207
16 F00E 7BBE
17 0022 2246 A666 .string "\"F\246f\006\232\272\013\302*\212=\376\"\207\206\201~\274\256R\374\177\307\317\237\203\22
17 069A BA0B
17 C22A 8A3D
17 FE22 8786
17 817E BCAE
Может кто-нибудь сказать что произошло и куда подевались мнемоники команд и почему они теперь идут через .string?
Ардуино ИДЕ 1.8.2. (avr-g++ из него), передаваемая опция ассемблеру: -Wa,-achls=osc.asm
12/06/2017 похожий исходник обработался нормально.. что могло случиться?
Полез смотреть потому как заинтриговало это:
Определение глобального массива, используемого тут:
и результат компиляции:
Скетч использует 1832 байт (0%) памяти устройства. Всего доступно 253952 байт.
Глобальные переменные используют 194 байт (2%) динамической памяти, оставляя 7998 байт для локальных переменных. Максимум: 8192 байт.
Запуск компилятора делал копированием из строки ИДЕ. После удаления опции -flto получил ещё и такое сообщение:
~/progs/arduino-1.8.2/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I~/progs/arduino-1.8.2/hardware/arduino/avr/cores/arduino" "-I~/progs/arduino-1.8.2/hardware/arduino/avr/variants/mega" "/tmp/arduino_build_64770/sketch/Osciloscope.ino.cpp" -Wa,-achls=osc.asm
/tmp/ccdPSxjs.s: Assembler messages:
/tmp/ccdPSxjs.s:151: Error: register r24, r26, r28 or r30 required
...:/tmp/arduino_build_64770$ man avr-g++
Нет справочной страницы для avr-g++
man-а конечно же нет..
Ага, тоже заметил. Что-то они намутили с компиляцией в последних версиях. Вроде с какой-то версии 1.6* такой листинг получается.
Так 12 числа выводил в асм. код из подобной проги - нормально все было! Если отключить опцию -flto то тоже выводит как положено, оказывается. Почитал, опция вроде как и вовсе для линкера .. чё за фигня?
Ну и где наши "гуру" от программирования, все по дачам разбрелись? ;)
~/progs/arduino-1.8.2/hardware/arduino/avr/cores/arduino/main.cpp: In function 'main':
Osciloscope:164: error: impossible constraint in 'asm'
);
^
lto-wrapper: ~/progs/arduino-1.8.2/hardware/tools/avr/bin/avr-gcc returned 1 exit status
~/progs/arduino-1.8.2/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
Без опции -flto похоже компиляется нормально .. что за нафиг?
Вот так описаны параметры к асм:
Если так как тут, то ругается на отсутствие скобок у параметров [isok],[adc], если вот так:
то получаю ошибку линковщика, что указана выше..
Если компилять руками и из gcc без опции -flto то все делается "молча", код с виду (в асм) вменяемый вполне..
Что сделано "не так"? (мож опять забыл чего..)
В общем, пофиг. Убрал все параметры из асм(), назначил регистры вручную с сохранением и восстановлением контекста... и опаньки! Оптимизация "для идиотов" (-flto) работает "на ура": оптимизатор выкинул из кода ВСЕ переменные, используемые в асм-вставке и после чего благоговейно ругнулся:
/tmp/ccCp8ymm.ltrans0.ltrans.o: In function `main':
ccCp8ymm.ltrans0.o:(.text.startup+0x1e4): undefined reference to `adcBuffer'
ccCp8ymm.ltrans0.o:(.text.startup+0x1e8): undefined reference to `adcBuffer'
ccCp8ymm.ltrans0.o:(.text.startup+0x1ec): undefined reference to `adcMaxSamples'
ccCp8ymm.ltrans0.o:(.text.startup+0x1f0): undefined reference to `adcShift'
ccCp8ymm.ltrans0.o:(.text.startup+0x1f4): undefined reference to `adcLevel'
ccCp8ymm.ltrans0.o:(.text.startup+0x1f8): undefined reference to `adcSign'
ccCp8ymm.ltrans0.o:(.text.startup+0x1fc): undefined reference to `adcSampleLength'
ccCp8ymm.ltrans0.o:(.text.startup+0x200): undefined reference to `adcSampleLength'
collect2: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino/Genuino Mega or Mega 2560.
просто +5 баллов. :)
Ну и ещё "чудесатось":
/tmp/cckYaqzF.ltrans0.ltrans.o: In function `WAIT_2':
cckYaqzF.ltrans0.o:(.text.startup+0x2a6): relocation truncated to fit: R_AVR_7_PCREL against `no symbol'
Переход на эту метку находится просто "обалденно далеко в коде процедуры (1шт!):
rjmp не способен прыгнуть на две команды назад?!? Н-да .. наворотили..
Н-да .. похоже true програмисты перевелись совсем, остались тока "ползатели готовых либ" .. :(
Н-да .. похоже true програмисты перевелись совсем, остались тока "ползатели готовых либ" .. :(
Архат, иди нахуй.
Н-да .. похоже true програмисты перевелись совсем, остались тока "ползатели готовых либ" .. :(
нет, Архат. Дело в том, что ты опять понес херню типа: "наворотили". Снова неправильный оптимизатор, неправильный компилятор и стандарты. Правильный - тольтко Архат.
У тех, кто видит твои ошибки - уже нет сил и желания коментировать. А те кто не видит - не могут. ВОт такой парадокс.
У тебя совсем нет понимания, как работает линк-тайм оптимизация. Поэтому гопнические закидоны про rjmp и непонимание почему нет параметров у ассемблерной вставки.
Ну клапауций - ладно, че на больных обижаться .. но Вы-то можете показать где ошибся, ведь прямо же вопрошал - "покажите"? Ладно, по большей части уже почти справился. Мне надо ИМЕННО такой порядок исполнения и ничего кроме rjmp в это место не влазит. Там потактовка +2 такта и .. усё, прошай оцифровка в 500кГц на мегах.
В целом оптимизатор сгенерил неплохой код, но он дольше моего на 6 тактов. Это - критично.
КАК сделать асм-вставку, которую прожует линковщик с включенной опцией -flto ?
Знаете - помогите. Нет не хрен писать что "я опять начал" .. оставайтесь "ползателями" с 15kbps..
Я-то могу и пойти, а вот ты тут останешься со школотой и своими бесполезными титановыми кнопарями .. ибо ни на что иное не способен. сколько там у тебя уже страниц в темах, ась? Даже разъяснить КАК это работает не способен, попрыгун фигов.
Даже разъяснить КАК это работает не способен, попрыгун фигов.
ЭТО работает идеально.
файл README.md для кого писан?
ок. лично тебе что-то непонятно - ты зашёл в тему и спросил?
не спросил - значит, ты сейчас лжёшь и тебе всё понятно.
Лично мне - это не требуется ибо - тривиально. А вот количество страниц с вопросами - посчитаешь сам, ежели способен. :D
Архат.
Я не вижу всего кода.
1.Во втором случае, с rjmp - чтобы оптимизатор не лез в ваш код ставьте волатиль, как вариант. но на куске кода - мало информации.
2. а параметры асм вставки - нужна видимость и волатиль. Вы же, небось, проект по куче файлов разбили?
На момент компиляции парметры в асм-вставке должны быть видимы в этой области. При оптимизации, переменная, явно не используемая в файле, где объявлена - будет выкинута.
===================
ну и третье, на закуску: нафига вы херней маятесь? понимаю, если б студент для повышения скилла, но взрослый же человек? Мало велосипедов вокруг, чтобы новый изобреть? И снова, у контроллера с "запрещенным названиеми" ;) 1 МГц АЦП... и стоит он дешеле. Мне стоит призвать "демона ssss" в дискуссию? ;) ;) ;) Он быстро все по местм расставит ;) ;-)
Лично мне - это не требуется ибо - тривиально. А вот количество страниц с вопросами - посчитаешь сам, ежели способен. :D
лично тебе это не требуется, но лично тебе пукан подрывает - парадокс.
Код не выкладываю, по причине его сырости. Рано ишо.
Асм вставка конечно же одним файлом и она волатил .. куда же без него теперича? Более того, пока это тестовый скетч - он вообще сделан одним файлом и будущий *.h ещё тоже внутрях. Есть один *.ino файл и кроме Serial в целях отладки не используется вообще ничего. В loop() тупо вывод накопленного буфера в процедуре "замер()", которая есть тупо обрамление над асм-вставкой. в setup() настройка портов и сериала. Всё, что там "выкладывать"?
Приведенный кусок асм-вставки - это собственно ВЕСЬ код, который связан с этой меткой и переходом на неё. ровно 3 команды взад .. всё "расстояние перехода". rjmp согласно даташиту охватывает 8 килобайт кода +- по 4кб .. и? То есть, линковщик сюда втыкает кусок больше 4к при длине всей программы в 1897байт?!?
По первому вопросу: как только включаешь опцию "-flto" так сразу .. пропадает асм-вывод компилятора. Вместо него весь асм упихан в какие-то .string .. и никакими опциями его оттудова не выковырять .. это что за "финт ушами"?
Знаете КАК заставить компилятор сгенерить асм-вывод при включенной опции "-flto" - колитесь, возможно будет видно в чем засада..
ну и третье .. вот есть код обработчика I2C. который тут уже обсирали, пардон обсуждали .. а потом Вы же его же и хвалили .. не?
Ну и вопрос Вам на засыпку: Если Вы считаете себя программистом, то что Вы бедете делать: искать ГОТОВУЮ библиотеку по вопросу или НАПИШЕТЕ свою? Если второе, то увы, но вы "юзверь" или как любит Клапауций - "ползатель" готового ПО. Ничего иного тут нет, ибо часто для МК проще накатать свое, чем тратить гору времени на розыск. Особенно если свое решает задачу на 2 порядка лучше.
Ну и по призыванию призраков: да пусть приходит .. тут решается ИНАЯ задача. кстати, по форумам за STM-осцилографы .. народ как-то поделал-поделал и .. выкинул. Шумят шибко .. не разобрать нифига. :)
Пысы. Для Мега128а асм-вставка практически уже отлажена 500кгц на ней результат более-менее уже рабочий.
У мега-корок есть замечательный режим "отключить flto" .. а вот для остальных плат этот режим в ИДЕ включен "по умолчанию" и опции "отключить" - нет. вот и хочется сделать так, чтобы можно было компилять с любой платой.. а не "тут в ИДЕ рыбу заворачивали"..
С ЛТО можно получить читаемый код только обжидампом из эльфа. Там хоть что-то разобрать можно.
Почему так - читайте про ЛТО до просветления. ;) Это не издевка. Просто нужно понять что это и как это использовать для радости, а не для гадости.
-----
если стесняетесь кинуть сюда - киньте в мыло - мой ник на жмейле. У меня есть штатная китайская 2560, я могу на ней прогнать и посмотреть, что и как нужно поправить и почему с кодом напонятности.
И еще про велосипеды:
1. Ваш код для И2С - я конечно хвлил, как хорошую любительскую программу. И "обсирал" я не код, а пафос... но это сложные материи.
2. Так вот про велосипеды: ослик до 1 Мспс - никому не нужен ввиду наличия тонны китайских DIY наборов с вполне приличными хар-ми.
ослик до 20 Мспс, интересен только с экраном, опять же из-за кучи китайских ЮСБ осликов ценой в 3-4 Круб с АЦП на 20 Мспс.
(вот тут может пригодиться ваша плата и 3-х долларовый внешний АЦП на 20 Мспс типа AD9200 или аналог).
Очень интересно было бы сделать прибор с вменяемой себестоимостью на ... ну не гиг, как у Димах, а хоть 200 Мспс. Пусть без экрана, хотя хорошо бы с ним.
А 500 Кспс - это курам на смех, у DSO138 1 Мспс и спаял я его за 30 минут, заплатив китайцу 990 р. 500 Кспс - только для самоудовлетворения програмиста... в некотором смысле это мастурбация. Хотя и тут я ничего не имею против. ;)
Панимаите вчем дела-а.. :)
Я на все 146% согласен с тем что можно КУПИТЬ ослика и даже на гиг или хакнуть как Димах что по-проще .. но вот, опять жеж, какое отношение решение по приобретению "ослика" (тем более когда есть С1-122/4 с блоком цифровой задержки и к которому можно "за копейки" приобрести блоки до гигагерцев) к .. э-э-э "ардуино" и вопросу "разработки нового комплекта плат", в свете развития навыков у уже 11-и летнего ребенка? :)
Это не столько "мастурбация в попытке обзавестить осликом", сколько пример применимости АЦП мег "в целом"... ну и писания кода "на разные МК".
.. ну и не забывайте, что применимость скоростной оцифровки не только в "наблюдении" .. тот же съем с 10 датчиков АЦП для самобеглой тележки по линии .. не, не "та же самая" задачка? Ширее смотреть надо, ширее... :)
Ну и на пред.:
Вы меня извините, но приходилось править линковщик в СР/М, в т.ч. и для автовыбрасывания лишнего кода при подключении уже компилированных библиотек, сляпанных "в кучу". И для чего опция и как ею пользоваться - вполне понятно. Непонятно КАК эта опция теперь встраивает >4кб кусок кода в прямую последовательность из 3-х команд так что становится невозможной релокация адреса "на три команды взад" .. и главное "накуя".
Кстати, на стековерфлоу уже нашел целую кучу рекомендаций по PC: надо .. "переставить" порядок опций у линковщика в make и .. он начинает справляться с задачей ЛТО. Забавно, не находите?
Там нет проблем с "код не работает" .. работает все как надо. Там проблема со сборкой: если втыкать асм-вставку с ЛТО - сборка не завершается. Ошибку приводил. Теперь та, что последняя за неверный rjmp.. Доеду домой проверю перенастройку make в ИДЕ. С отключенной опцией (ATmega128a) все вполне собирается и даже работает.
Не ту картинку втыкнул .. надо с батутом. :)
Не ту картинку втыкнул .. надо с батутом. :)