Асм листинг из cpp - что за фигня?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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 похожий исходник обработался нормально.. что могло случиться?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Полез смотреть потому как заинтриговало это:

#define ADC_MAX_BUFFER     2000
uint8_t      adcBuffer[ADC_MAX_BUFFER];

Определение глобального массива, используемого тут:

void adcMeasure()
{
  // register:
  uint8_t      _adc;
  uint8_t *    _buf        = &adcBuffer[0];
  uint8_t      _numChannel = adcMaxChannels;
  AdcChannel * _ptrChannel = &adcChannels[0];

и результат компиляции:

Скетч использует 1832 байт (0%) памяти устройства. Всего доступно 253952 байт.
Глобальные переменные используют 194 байт (2%) динамической памяти, оставляя 7998 байт для локальных переменных. Максимум: 8192 байт.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Запуск компилятора делал копированием из строки ИДЕ. После удаления опции -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-а конечно же нет..
 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ага, тоже заметил. Что-то они намутили с компиляцией в последних версиях. Вроде с какой-то версии 1.6* такой листинг получается.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Так 12 числа выводил в асм. код из подобной проги - нормально все было! Если отключить опцию -flto то тоже выводит как положено, оказывается. Почитал, опция вроде как и вовсе для линкера .. чё за фигня?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну и где наши "гуру" от программирования, все по дачам разбрелись? ;)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

~/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 похоже компиляется нормально .. что за нафиг?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Вот так описаны параметры к асм:

void adcMeasure()
{
  asm volatile(
    "    lds  %A[ptrCh],adcChannels       ; ptrCh=adcChannels;          \n\t"
// ...
    "    brne SAMPLES                     ;..                           \n\t"
    :
    : [buf]      "z" (&adcBuffer[0]),
      [ptrCh]    "y" (&adcChannels[0]),
      [measure]  "w" (adcSampleLength),
      [numCh]    "r" (adcMaxChannels),
      [samples]  "r" (adcMaxSamples),
      [shift]    "r" (adcShift),
      [level]    "r" (adcLevel),
      [sign]     "r" (adcSign),
      [isok]     "r",
      [adc]      "r",
      [admux]    "I" ((uint8_t *)ADMUX),
      [adcsra]   "I" ((uint8_t *)ADCSRA),
      [adch]     "I" ((uint8_t *)ADCH),
      [sizeofCH] "I" (sizeof(adcChannels)/sizeof(adcChannels[0]))
    :
  );

Если так как тут, то ругается на отсутствие скобок у параметров [isok],[adc], если вот так:

[isok] "r" ((uint8_t)0),
[adc] "r" ((uint8_t)0),

то получаю ошибку линковщика, что указана выше..

Если компилять руками и из gcc без опции -flto то все делается "молча", код с виду (в асм) вменяемый вполне..

Что сделано "не так"? (мож опять забыл чего..)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

В общем, пофиг. Убрал все параметры из асм(), назначил регистры вручную с сохранением и восстановлением контекста... и опаньки! Оптимизация "для идиотов" (-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 баллов. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну и ещё "чудесатось":

/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шт!):

// 2.2 wait and get ADC result:
    "WAIT_2:                        ; ...while(ADCSRA&(1<<ADIF)==0); \n\t"
    "    lds  r18,122               ; 0...                           \n\t"
    "    sbrs r18,4                 ; 2...                           \n\t"
    "    rjmp WAIT_2                ; ...                           \n\t"

rjmp не способен прыгнуть на две команды назад?!? Н-да .. наворотили..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Н-да .. похоже true програмисты перевелись совсем, остались тока "ползатели готовых либ" .. :(

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Arhat109-2 пишет:

Н-да .. похоже true програмисты перевелись совсем, остались тока "ползатели готовых либ" .. :(

Архат, иди нахуй.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Arhat109-2 пишет:

Н-да .. похоже true програмисты перевелись совсем, остались тока "ползатели готовых либ" .. :(

нет, Архат. Дело в том, что ты опять понес херню типа: "наворотили". Снова неправильный оптимизатор, неправильный компилятор и стандарты. Правильный - тольтко Архат.

У тех, кто видит твои ошибки - уже нет сил и желания коментировать. А те кто не видит - не могут. ВОт такой парадокс.

У тебя совсем нет понимания, как работает линк-тайм оптимизация. Поэтому гопнические закидоны про rjmp и непонимание почему нет параметров у ассемблерной вставки.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну клапауций - ладно, че на больных обижаться .. но Вы-то можете показать где ошибся, ведь прямо же вопрошал - "покажите"? Ладно, по большей части уже почти справился. Мне надо ИМЕННО такой порядок исполнения и ничего кроме rjmp в это место не влазит. Там потактовка +2 такта и .. усё, прошай оцифровка в 500кГц на мегах.

В целом оптимизатор сгенерил неплохой код, но он дольше моего на 6 тактов. Это - критично.

КАК сделать асм-вставку, которую прожует линковщик с включенной опцией -flto ?

Знаете - помогите. Нет не хрен писать что "я опять начал" .. оставайтесь "ползателями" с 15kbps..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Я-то могу и пойти, а вот ты тут останешься со школотой и своими бесполезными титановыми кнопарями .. ибо ни на что иное не способен. сколько там у тебя уже страниц в темах, ась? Даже разъяснить КАК это работает не способен, попрыгун фигов.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Arhat109-2 пишет:

Даже разъяснить КАК это работает не способен, попрыгун фигов.

ЭТО работает идеально.

файл README.md для кого писан?

ок. лично тебе что-то непонятно - ты зашёл в тему и спросил?

не спросил - значит, ты сейчас лжёшь и тебе всё понятно.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Лично мне - это не требуется ибо - тривиально. А вот количество страниц с вопросами - посчитаешь сам, ежели способен. :D

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Архат.

Я не вижу всего кода.

1.Во втором случае, с rjmp - чтобы оптимизатор не лез в ваш код ставьте волатиль, как вариант. но на куске кода - мало информации.

2. а параметры асм вставки - нужна видимость и волатиль. Вы же, небось, проект по куче файлов разбили?

На момент компиляции парметры в асм-вставке должны быть видимы в этой области. При  оптимизации, переменная, явно не используемая в файле, где объявлена - будет выкинута.

===================

ну и третье, на закуску: нафига вы херней маятесь? понимаю, если б студент для повышения скилла, но взрослый же человек? Мало велосипедов вокруг, чтобы новый изобреть? И снова, у контроллера с "запрещенным названиеми" ;) 1 МГц АЦП... и стоит он дешеле. Мне стоит призвать "демона ssss" в дискуссию? ;) ;) ;) Он быстро все по местм расставит ;) ;-)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Arhat109-2 пишет:

Лично мне - это не требуется ибо - тривиально. А вот количество страниц с вопросами - посчитаешь сам, ежели способен. :D

лично тебе это не требуется, но лично тебе пукан подрывает - парадокс.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Код не выкладываю, по причине его сырости. Рано ишо.

Асм вставка конечно же одним файлом и она волатил .. куда же без него теперича? Более того, пока это тестовый скетч - он вообще сделан одним файлом и будущий *.h ещё тоже внутрях. Есть один *.ino файл и кроме Serial в целях отладки не используется вообще ничего. В loop() тупо вывод накопленного буфера в процедуре "замер()", которая есть тупо обрамление над асм-вставкой. в setup() настройка портов и сериала. Всё, что там "выкладывать"?

Приведенный кусок асм-вставки - это собственно ВЕСЬ код, который связан с этой меткой и переходом на неё. ровно 3 команды взад .. всё "расстояние перехода". rjmp согласно даташиту охватывает 8 килобайт кода +- по 4кб .. и? То есть, линковщик сюда втыкает кусок больше 4к при длине всей программы в 1897байт?!?

По первому вопросу: как только включаешь опцию "-flto" так сразу .. пропадает асм-вывод компилятора. Вместо него весь асм упихан в какие-то .string .. и никакими опциями его оттудова не выковырять .. это что за "финт ушами"?

Знаете КАК заставить компилятор сгенерить асм-вывод при включенной опции "-flto" - колитесь, возможно будет видно в чем засада..

ну и третье .. вот есть код обработчика I2C. который тут уже обсирали, пардон обсуждали .. а потом Вы же его же и хвалили .. не?

Ну и вопрос Вам на засыпку: Если Вы считаете себя программистом, то что Вы бедете делать: искать ГОТОВУЮ библиотеку по вопросу или НАПИШЕТЕ свою? Если второе, то увы, но вы "юзверь" или как любит Клапауций - "ползатель" готового ПО. Ничего иного тут нет, ибо часто для МК проще накатать свое, чем тратить гору времени на розыск. Особенно если свое решает задачу на 2 порядка лучше.

Ну и по призыванию призраков: да пусть приходит .. тут решается ИНАЯ задача. кстати, по форумам за STM-осцилографы .. народ как-то поделал-поделал и .. выкинул. Шумят шибко .. не разобрать нифига. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Пысы. Для Мега128а асм-вставка практически уже отлажена 500кгц на ней результат более-менее уже рабочий.

У мега-корок есть замечательный режим "отключить flto" .. а вот для остальных плат этот режим в ИДЕ включен "по умолчанию" и опции "отключить" - нет. вот и хочется сделать так, чтобы можно было компилять с любой платой.. а не "тут в ИДЕ рыбу заворачивали"..

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

С ЛТО можно получить читаемый код только обжидампом из эльфа. Там хоть что-то разобрать можно.

Почему так - читайте про ЛТО до просветления. ;) Это не издевка. Просто нужно понять что это и как это использовать для радости, а не для гадости.

-----

если стесняетесь кинуть сюда - киньте в мыло - мой ник на жмейле. У меня есть штатная китайская 2560, я могу на ней прогнать и посмотреть, что и  как нужно поправить и почему с кодом напонятности.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

И еще про велосипеды:

1. Ваш код для И2С - я конечно хвлил, как хорошую любительскую программу. И "обсирал" я не код, а пафос... но это сложные материи.

2. Так вот про велосипеды: ослик до   1 Мспс - никому не нужен ввиду наличия тонны китайских DIY наборов с вполне приличными хар-ми.

ослик  до 20 Мспс, интересен только с экраном, опять же из-за кучи китайских ЮСБ осликов ценой в 3-4 Круб с АЦП на 20 Мспс.

(вот тут может пригодиться ваша плата и 3-х долларовый внешний АЦП на 20 Мспс типа AD9200 или аналог).

Очень интересно было бы сделать прибор с вменяемой себестоимостью на ... ну не гиг, как у Димах, а хоть 200 Мспс. Пусть без экрана, хотя хорошо бы с ним.

А 500 Кспс - это курам на смех, у DSO138 1 Мспс и спаял я его за 30 минут, заплатив китайцу 990 р. 500 Кспс - только для самоудовлетворения програмиста... в некотором смысле это мастурбация. Хотя и тут я ничего не имею против. ;)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Панимаите вчем дела-а.. :)

Я на все 146% согласен с тем что можно КУПИТЬ ослика и даже на гиг или хакнуть как Димах что по-проще .. но вот, опять жеж, какое отношение решение по приобретению "ослика" (тем более когда есть С1-122/4 с блоком цифровой задержки и к которому можно "за копейки" приобрести блоки до гигагерцев) к .. э-э-э "ардуино" и вопросу "разработки нового комплекта плат", в свете развития навыков у уже 11-и летнего ребенка? :)

Это не столько "мастурбация в попытке обзавестить осликом", сколько пример применимости АЦП мег "в целом"... ну и писания кода "на разные МК".

.. ну и не забывайте, что применимость скоростной оцифровки не только в "наблюдении" .. тот же съем с 10 датчиков АЦП для самобеглой тележки по линии .. не, не "та же самая" задачка? Ширее смотреть надо, ширее... :)

Ну и на пред.:

Вы меня извините, но приходилось править линковщик в СР/М, в т.ч. и для автовыбрасывания лишнего кода при подключении уже компилированных библиотек, сляпанных "в кучу". И для чего опция и как ею пользоваться - вполне понятно. Непонятно КАК эта опция теперь встраивает >4кб кусок кода в прямую последовательность из 3-х команд так что становится невозможной релокация адреса "на три команды взад" .. и главное "накуя".

Кстати, на стековерфлоу уже нашел целую кучу рекомендаций по PC: надо .. "переставить" порядок опций у линковщика в make и .. он начинает справляться с задачей ЛТО. Забавно, не находите?

Там нет проблем с "код не работает" .. работает все как надо. Там проблема со сборкой: если втыкать асм-вставку с ЛТО - сборка не завершается. Ошибку приводил. Теперь та, что последняя за неверный rjmp.. Доеду домой проверю перенастройку make в ИДЕ. С отключенной опцией (ATmega128a) все вполне собирается и даже работает.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

giphy.gif

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не ту картинку втыкнул .. надо с батутом. :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Arhat109-2 пишет:

Не ту картинку втыкнул .. надо с батутом. :)

49851_900.jpg

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016