Например TDA7294

Форум РадиоКот • Просмотр темы - Наткнулся на какой то баг компилятора?
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вс июл 21, 2019 11:47:42

Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 10:36:48 
Встал на лапы

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 13:03:08
Сообщений: 85
Откуда: Зеленоград
Рейтинг сообщения: 0
C8T6, 72Мгц, внешний кварц, CMSIS без каких либо надстроек, g++

имеется прерывание 4мкс, он же счетчик для событий + необходимо некоторые данные обновлять \ считать

почему то скобки очень сильно влияют на время выполнения прерывания, например если условно:

a = (((b * 10) + (c / 60)) - 1) * 5; - прерывание будет выполняться 5.184135 мкс

а вот такая конструкция:

x = b * 10;
y = c / 60;
a = x + y - 1;
a *= 5;


не будет влиять на время прерывания, т.е. время прерывания чётко 4.000000мкс

что компилятору там могло в голову ударить ? :shock:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 10:55:29 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1424
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 13692
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
V2oD2o писал(а):
a = (((b * 10) + (c / 60)) - 1) * 5;
ну а если записать "естественно", без лишних скобок:a = (b*10 + c/60 - 1) * 5;? что будет?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
удивительно, но при взгляде на многих сверху ничего не меняется...


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 11:04:27 
Собутыльник Кота
Аватар пользователя

Карма: 4
Рейтинг сообщений: 136
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 2546
Рейтинг сообщения: 0
Какие типы переменных? Float или Double среди них есть?
Результат первой и второй конструкции идентичен или отличается?
Оптимизация по скорости включена?


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 11:29:55 
Встал на лапы

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 13:03:08
Сообщений: 85
Откуда: Зеленоград
Рейтинг сообщения: 0
V2oD2o писал(а):
a = (((b * 10) + (c / 60)) - 1) * 5;
ну а если записать "естественно", без лишних скобок:a = (b*10 + c/60 - 1) * 5;? что будет?


Пример условный, но закономерность именно такая, всё считаешь в одной строке - лаг по времени прерывания, разделяешь - все нормально

Добавлено after 2 minutes 18 seconds:
Какие типы переменных? Float или Double среди них есть?
Результат первой и второй конструкции идентичен или отличается?
Оптимизация по скорости включена?


C8T6 не имеет FPU, в первом посте указал что только CMSIS без всяких надстроек т.е. никаких извращений с float на цельночисленном камне, тип данных uint16_t или 32_t - ситуация одинаковая, оптимизации пробовал разных уровней - результат малоотличим

Данные снимал анализатором, в прерывании ->ODR ^= и смотрел на интервалы прерывания

И еще, для понимания - калькуляция там не одна, их с десяток наберется, за пределы результирующей длины слова - не вылезает, по отладчику перепроверено несколько раз


Вернуться наверх
 
Плавкие предохранители LittelFuse. Грамотный подбор

Выбор оптимального плавкого предохранителя требует учета многих параметров. Для упрощения выбора оптимального предохранителя и автоматизации расчетов Littelfuse предлагает онлайн-утилиту. Подробнее>>
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 11:35:45 
Опытный кот

Карма: 15
Рейтинг сообщений: 142
Зарегистрирован: Вс июн 19, 2016 10:32:03
Сообщений: 815
Рейтинг сообщения: 0
ну а если записать "естественно", без лишних скобок:a = (b*10 + c/60 - 1) * 5;? что будет?

А есть варианты? Твоя программа разбора выражений со скобками и без могла выдавать разные результаты?

V2oD2o, такое выражение целиком за пол мкс должно считаться, даже без оптимизации будет не на много больше, причем в таком случае медленнее должен быть вариант с промежуточными переменными, так что весьма вероятно баг где-то в другом месте.


Вернуться наверх
 
Немногим дороже дискретного решения: новое поколение импульсных стабилизаторов Mornsun

Практически во всех радиоэлектронных устройствах массово применяются линейные понижающие стабилизаторы напряжения типа КРЕН в корпусе TO220 (другое обозначение – 78хх) и им подобные для формирования основного напряжения питания схемы.
Данные стабилизаторы позволяют без особых затрат получить нужное для каскада или узла схемы напряжение, если устройство питается от внешнего источника с более высоким напряжением. Для этого требуются… Подробнее>>
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 11:40:11 
Встал на лапы

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 13:03:08
Сообщений: 85
Откуда: Зеленоград
Рейтинг сообщения: 0
ну а если записать "естественно", без лишних скобок:a = (b*10 + c/60 - 1) * 5;? что будет?

А есть варианты? Твоя программа разбора выражений со скобками и без могла выдавать разные результаты?

V2oD2o, такое выражение целиком за пол мкс должно считаться, даже без оптимизации будет не на много больше, причем в таком случае медленнее должен быть вариант с промежуточными переменными, так что весьма вероятно баг где-то в другом месте.


выражение условное, там несколько десятков расчётов завязанные на разные временные события и внешние прерывания, основная масса расчетов ведётся по данным ADC через DMA - 4 канала

попробую сформировать вечером реальный пример, на котором можно увидеть "у себя" описанную проблему

результат - всегда одинаковый, просто разбивание строки со скобками убирает проблему полностью, таймер начинает считать нормально


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 12:37:48 
Потрогал лапой паяльник
Аватар пользователя

Карма: 20
Рейтинг сообщений: 121
Зарегистрирован: Вс янв 19, 2014 23:41:55
Сообщений: 354
Рейтинг сообщения: 1
тип данных uint16_t или 32_t - ситуация одинаковая

В многострочном варианте промежуточный результат явно приводится к типу присваиваемых переменных, в однострочном - нет. Проверьте, интересу ради, вариант a = (uint_16t)(((uint_16t)(b * 10) + (uint_16t)(c / 60)) - 1) * 5; Кроме того, теоретически, операции "перемножение" и "домножение" имеют разное количество аргументов - и компилятор вполне может решить пользоваться разными инструкциями буде такие в его распоряжении на рассматриваемой платформе. А сгенерированный ASM код наверняка неидентичен - может туда глянуть? ;-)

_________________
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 14:00:32 
Встал на лапы

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 13:03:08
Сообщений: 85
Откуда: Зеленоград
Рейтинг сообщения: 0
тип данных uint16_t или 32_t - ситуация одинаковая

В многострочном варианте промежуточный результат явно приводится к типу присваиваемых переменных, в однострочном - нет. Проверьте, интересу ради, вариант a = (uint_16t)(((uint_16t)(b * 10) + (uint_16t)(c / 60)) - 1) * 5; Кроме того, теоретически, операции "перемножение" и "домножение" имеют разное количество аргументов - и компилятор вполне может решить пользоваться разными инструкциями буде такие в его распоряжении на рассматриваемой платформе. А сгенерированный ASM код наверняка неидентичен - может туда глянуть? ;-)


На работе к сожалению нет возможности objdump сделать, дома по-любому буду построчно разбирать и бряки делать на каждом шагу, вчера ночью только наткнулся на этупроблему, особо времени не было разбираться

Насчет приведения к типам - хорошая идея, попробую вечером


Вернуться наверх
 
Prist.ru предлагает скидку всем частным лицам при покупке приборов АКИП, GW Instek, APPA (кроме осциллографов АКИП-4115/1А, GDS-71102)!

Интересные новинки уже на складе:

Осциллограф АКИП-4126Е

Многоканальные источники питания серии GPP

Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 14:03:29 
Собутыльник Кота
Аватар пользователя

Карма: 4
Рейтинг сообщений: 136
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 2546
Рейтинг сообщения: 0
Эту строку.
Код:
a = (((b * 10) + (c / 60)) - 1) * 5;
GCC компилировал так (все переменные uint32_t).
Код:
//      a = (((b * 10) + (c / 60)) - 1) * 5;
080004AC   ldr   r1, [pc, #64]   ; (0x80004f0 <main+116>)
080004B0   add.w   r2, r2, r2, lsl #2
080004B4   umull   r1, r3, r1, r3
080004B8   lsrs   r3, r3, #5
080004BA   add.w   r3, r3, r2, lsl #1
080004BE   add.w   r3, r3, r3, lsl #2
080004C2   subs   r3, #5
Эти строки.
Код:
    x = b * 10;
    y = c / 60;
    a = x + y - 1;
    a *= 5;
скомпилировались в такой код.
Код:
//      x = b * 10;
080004B0   add.w   r2, r2, r2, lsl #2
//      y = c / 60;
080004AC   ldr   r1, [pc, #64]   ; (0x80004f0 <main+116>)
080004B4   umull   r1, r3, r1, r3
080004B8   lsrs   r3, r3, #5
//      a = x + y - 1;
080004BA   add.w   r3, r3, r2, lsl #1
080004BE   subs   r3, #1
//      a *= 5;
080004C0   add.w   r3, r3, r3, lsl #2


Вернуться наверх
 
Купить электронные компоненты в LCSC

Отправка со склада через 4 часа после заказа!
900 000 пользователей, 3000+ заказов в день!
Зарегистрируйтесь сегодня и получите скидку 8 долларов на первый заказ!
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 14:12:03 
Встал на лапы

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 13:03:08
Сообщений: 85
Откуда: Зеленоград
Рейтинг сообщения: 0
Эту строку.
Код:
a = (((b * 10) + (c / 60)) - 1) * 5;
GCC компилировал так (все переменные uint32_t).
Код:
//      a = (((b * 10) + (c / 60)) - 1) * 5;
080004AC   ldr   r1, [pc, #64]   ; (0x80004f0 <main+116>)
080004B0   add.w   r2, r2, r2, lsl #2
080004B4   umull   r1, r3, r1, r3
080004B8   lsrs   r3, r3, #5
080004BA   add.w   r3, r3, r2, lsl #1
080004BE   add.w   r3, r3, r3, lsl #2
080004C2   subs   r3, #5
Эти строки.
Код:
    x = b * 10;
    y = c / 60;
    a = x + y - 1;
    a *= 5;
скомпилировались в такой код.
Код:
//      x = b * 10;
080004B0   add.w   r2, r2, r2, lsl #2
//      y = c / 60;
080004AC   ldr   r1, [pc, #64]   ; (0x80004f0 <main+116>)
080004B4   umull   r1, r3, r1, r3
080004B8   lsrs   r3, r3, #5
//      a = x + y - 1;
080004BA   add.w   r3, r3, r2, lsl #1
080004BE   subs   r3, #1
//      a *= 5;
080004C0   add.w   r3, r3, r3, lsl #2


Уровень оптимизации какой ?
Судя по строке
080004C2 subs r3, #5 - что то пошло не так


Последний раз редактировалось V2oD2o Пн июл 09, 2018 14:13:42, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 14:12:51 
Собутыльник Кота
Аватар пользователя

Карма: 4
Рейтинг сообщений: 136
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 2546
Рейтинг сообщения: 0
-Ofast.
Необязательно для всего проекта. Можно только для нужной функции.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 14:14:25 
Встал на лапы

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 13:03:08
Сообщений: 85
Откуда: Зеленоград
Рейтинг сообщения: 0
-Ofast.
Необязательно для всего проекта. Можно только для нужной функции.


Обновил пред коммент, откуда там?
080004C2 subs r3, #5


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 14:36:43 
Опытный кот

Карма: 15
Рейтинг сообщений: 142
Зарегистрирован: Вс июн 19, 2016 10:32:03
Сообщений: 815
Рейтинг сообщения: 1
откуда там?
080004C2 subs r3, #5

Современные компиляторы очень умные, в данном случае он раскрыл скобки(b * 50 + c / 12 - 5), заменил деление умножением, умножение заменил сдвигами и сложением, более того т.к. из-за целочисленного деления результат упрощенного выражения может быть другим, то было предусмотрено и это. Так что не нужно искать баги у компилятора, ищи баги у себя :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 18:11:17 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 144
Зарегистрирован: Пн июл 28, 2008 23:12:01
Сообщений: 3474
Рейтинг сообщения: 0
V2oD2o , покажите полносттю обработчик прерывания таймера.
Особенно интересует сброс флага...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Вт июл 10, 2018 10:20:24 
Встал на лапы

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 13:03:08
Сообщений: 85
Откуда: Зеленоград
Рейтинг сообщения: 0
V2oD2o , покажите полносттю обработчик прерывания таймера.
Особенно интересует сброс флага...


Там все в порядке, проект рабочий, после доработок, не сразу, но было замечено увеличение времени отсчета по таймеру примерно х1.8 - х2, т.е. событие по 10мс, выполнялось в 18.5064мс

Добавлено after 7 minutes 45 seconds:
тип данных uint16_t или 32_t - ситуация одинаковая

В многострочном варианте промежуточный результат явно приводится к типу присваиваемых переменных, в однострочном - нет. Проверьте, интересу ради, вариант a = (uint_16t)(((uint_16t)(b * 10) + (uint_16t)(c / 60)) - 1) * 5; Кроме того, теоретически, операции "перемножение" и "домножение" имеют разное количество аргументов - и компилятор вполне может решить пользоваться разными инструкциями буде такие в его распоряжении на рассматриваемой платформе. А сгенерированный ASM код наверняка неидентичен - может туда глянуть? ;-)


"Дело было не в бобине" - и действительно, приведение к типам дало прирост, очень ощутимый, было 18мс вместо 10мс, перевёл все расчеты на u32_t (в 16 не влезу) - стало 13.3мс, добавил -O3 - и увидел заветные 10мс, пробовал нагрузить еще всякими вычислениями, даже гораздо более сложными и считать их каждый тик, а не по событию - проблема решилась, каждый тик ровно 5.000 мкс, спасибо за наводку! 8)

Что интересно -Ох без использования однотипных данных - почти ничего не давало


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Вт июл 10, 2018 16:10:05 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 144
Зарегистрирован: Пн июл 28, 2008 23:12:01
Сообщений: 3474
Рейтинг сообщения: 0
Особенно интересует сброс флага...

И все же, многие влетали на эти грабли сбрасывая флаг в конце распухшего прерывания...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Вт июл 10, 2018 16:15:59 
Встал на лапы

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 13:03:08
Сообщений: 85
Откуда: Зеленоград
Рейтинг сообщения: 0
Особенно интересует сброс флага...

И все же, многие влетали на эти грабли сбрасывая флаг в конце распухшего прерывания...


Да, я не исключение, проходили


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y