Например TDA7294

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





Текущее время: Вт апр 16, 2024 16:15:35

Часовой пояс: UTC + 3 часа


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



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

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 12:03:08
Сообщений: 90
Откуда: Зеленоград
Рейтинг сообщения: 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 09:55:29 
Ум, честь и совесть. И скромность.
Аватар пользователя

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

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

Мой уютный бложик... заходите!


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

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


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

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

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

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 12:03:08
Сообщений: 90
Откуда: Зеленоград
Рейтинг сообщения: 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 ^= и смотрел на интервалы прерывания

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


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Наткнулся на какой то баг компилятора?
СообщениеДобавлено: Пн июл 09, 2018 10:35:45 
Поставщик валерьянки для Кота

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

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

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


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

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

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

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

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


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

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

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


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

Карма: 20
Рейтинг сообщений: 121
Зарегистрирован: Вс янв 19, 2014 22:41:55
Сообщений: 353
Рейтинг сообщения: 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 13:00:32 
Встал на лапы

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

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


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

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


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

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 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


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

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 12:03:08
Сообщений: 90
Откуда: Зеленоград
Рейтинг сообщения: 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 13:13:42, всего редактировалось 1 раз.

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

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


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

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


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


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

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

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


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

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


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

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Чт дек 09, 2010 12:03:08
Сообщений: 90
Откуда: Зеленоград
Рейтинг сообщения: 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 15:10:05 
Друг Кота
Аватар пользователя

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

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


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

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

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


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


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

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: Юрий48 и гости: 14


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

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


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