Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нарвался на глючище в ИАРе. Негодую... :-о
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dr.Alex
В цикле проверяется значение элемента структуры dev_state.

Как видите, ИАР 7.40 загружает содержимое элемента в R0, потом сравнивает R0 с тройкой (это USBD_STATE_CONFIGURED),
а на следующем цикле прыгает НЕ НА ЗАГРУЗКУ R0 (LDRB.W R0, ...), а сразу на сравнение (CMP R0, #3)!!!

Удивляюсь, что у меня всё остальное вообще работает, с таким-то качеством компилёжки.

Конечно, если снизить оптимизацию или объявить элемент dev_state как volatile, то компилит правильно, но это же не решение! :-о :-о
krux
Цитата
В цикле проверяется значение элемента структуры dev_state.

Как видите, ИАР 7.40 загружает содержимое элемента в R0, потом сравнивает R0 с тройкой (это USBD_STATE_CONFIGURED),
а на следующем цикле прыгает НЕ НА ЗАГРУЗКУ R0 (LDRB.W R0, ...), а сразу на сравнение (CMP R0, #3)!!!

Удивляюсь, что у меня всё остальное вообще работает, с таким-то качеством компилёжки.

Конечно, если снизить оптимизацию или объявить элемент dev_state как volatile, то компилит правильно, но это же не решение! :-о :-о



А что вам говорит техподдержка IAR ?

или вы в очередной раз хотите чтобы ваши проблемы с платным компилятором решал "почтальон Печкин"?
Golikov A.
Цитата
онечно, если снизить оптимизацию или объявить элемент dev_state как volatile, то компилит правильно, но это же не решение! :-о :-о

В смысле?!!!!

объявить переменную изменчивой, для того чтобы компилятор каждый раз грузил ее значение заново не решение? А нафига тогда нужно такое объявление иначеsm.gif?


Цитата
А что вам говорит техподдержка IAR ?

Это шутка?
int i = 0;
while(i != 5); практически все оптимизаторы сделают тут вечный висяк, если даже i где то в прерываниях меняется... для этого volatile и придумано....
Dr.Alex
Цитата(krux @ Jul 3 2015, 21:09) *
или вы в очередной раз хотите чтобы ваши проблемы с платным компилятором решал "почтальон Печкин"?


От вас мне никаких "решений" не требуется, так что можете быть свободны.
Golikov A.
sm.gif докторишка как всегда в своем репертуаре, отдохнул недельку и опять за старое взялсяsm.gif))))
Задает вопрос, а на любой ответ всех обкладываетsm.gif)))....
Dr.Alex
Цитата(Golikov A. @ Jul 3 2015, 21:13) *
Это шутка?
int i = 0;
while(i != 5); практически все оптимизаторы сделают тут вечный висяк, если даже i где то в прерываниях меняется... для этого volatile и придумано....


А если подумать головой?
Даю вам на это несколько минут. Каждый может сглупить, главное вовремя исправиться и признать свою ошибку.
Golikov A.
снизойдите скажите ответ, сил нет понять где сглупил....
krux
Цитата(Golikov A. @ Jul 3 2015, 21:13) *
В смысле?!!!!

объявить переменную изменчивой, для того чтобы компилятор каждый раз грузил ее значение заново не решение? А нафига тогда нужно такое объявление иначеsm.gif?

Это шутка?
int i = 0;
while(i != 5); практически все оптимизаторы сделают тут вечный висяк, если даже i где то в прерываниях меняется... для этого volatile и придумано....

конечно.
ТС живёт в категории "ниасилил".
ему плевать, что он сделал, - висяк, или не очень.
Dr.Alex
Цитата(Golikov A. @ Jul 3 2015, 21:18) *
снизойдите скажите ответ, сил нет понять где сглупил....


ОК.

Если компилятор считает, что переменная не меняется, он не станет её проверять в цикле.

А здесь проверяет (цикл есть), но делает это неправильно, потому что после сравнения прыгает не на загрузку регистра, а сразу на его сравнение.
То есть, сгенерённый код бессмыслен.

А нужно ли было объявлять элемент структуры (или всю структуру) как volatile или нет, это уже другой вопрос, и он к писателям STM (как вы могли заметить, это Cube).
Golikov A.
Цитата
То есть, сгенерённый код бессмыслен.

Ну тогда я думаю krux прав, вам следует срочно написать об этом в службу поддержки IAR. У них там как раз утро, прям баг репорт сразу пишите.

Dr.Alex
Цитата(Golikov A. @ Jul 3 2015, 21:26) *
Ну тогда я думаю krux прав, вам следует срочно написать об этом в службу поддержки IAR. У них там как раз утро, прям баг репорт сразу пишите.


Таки я не понял, вы признали свою ошибку?
Golikov A.
одну ошибку я определенно сегодня сделал....
alag57
Цитата(Dr.Alex @ Jul 3 2015, 23:22) *
Если компилятор считает, что переменная не меняется, он не станет её проверять в цикле.

Компилятор проверяет не переменную, а значение регистра R0, который наверняка где-то
объявлен как volatile, как и все регистры IO.
Dr.Alex
Цитата(alag57 @ Jul 3 2015, 21:55) *
Компилятор проверяет не переменную, а значение регистра R0, который наверняка где-то
объявлен как volatile, как и все регистры IO.


:-))))))))))))))))) Вы начинающий, так что не стану ругаться.. :-о
alag57
Цитата(Dr.Alex @ Jul 3 2015, 23:58) *
:-))))))))))))))))) Вы начинающий, так что не стану ругаться.. :-о

Да, лет так 30 программирую, так что до вас мне далеко.
Dr.Alex
Цитата(alag57 @ Jul 3 2015, 22:01) *
Да, лет так 30 программирую, так что до вас мне далеко.


По-видимому да.

Ну гениально, чё сказать....
Переменная не меняется, её не проверяют.
А вот временный регистр, куда её грузят чтобы проверить, меняется. Неожиданно. В прерывании. Прямо во время то ли загрузки, то ли проверки! :-))))




UPD:
На досуге ещё немного поэкспериментировал.

Оказалось что хотя следующий цикл компилится "неправильно" (ровно так же как исходный)
do; while (hUsbDeviceHS.dev_state != USBD_STATE_CONFIGURED);

Код
0xF898 0x01FC      LDRB     R0,[R8, #+508]
       ??main_1: (+1)                      
0x2803             CMP      R0,#+3        
0xD1FD             BNE.N    ??main_1



То вот такой так как и ожидалось:
do __DSB(); while (hUsbDeviceHS.dev_state != USBD_STATE_CONFIGURED);

Код
       ??main_1
0xF3BF 0x8F4F      DSB                    
0xF898 0x01FC      LDRB     R0,[R8, #+508]
0x2803             CMP      R0,#+3        
0xD1F9             BNE.N    ??main_1

То есть компилятор вовсе не уверен, что проверять dev_state не нужно, а просто делает как фишка ляжет, что и удручает.
Aner
Эти ваши какашки из куба, такого там оч много. Эта кубическая кривота, для начинающих, чтобы их мозг искалечить. Чтобы не смогли проги писать. Я посмотрел на это, поржал и все. Даже средненькие прогеры этот куб не пользуют, вам то он зачем сдался?
SSerge
Цитата(Dr.Alex @ Jul 4 2015, 00:59) *
Конечно, если снизить оптимизацию или объявить элемент dev_state как volatile, то компилит правильно, но это же не решение! :-о :-о

Это именно что решение.
Как это ни покажется странным, но компилятор не обязан заново считывать значение переменной, если она не volatile.
Более того, в некоторых случаях, когда значение dev_state точно известно на момент компиляции (например незадолго до того ей присвоили константное знасение и, стало быть, результат сравнения заранее известен), имеет право заоптимизировать всё вплоть до вечного цикла из одной команды перехода.
Это просто ещё один способ выстрелить себе в ногу.
scifi
Цитата(Dr.Alex @ Jul 3 2015, 21:22) *
А здесь проверяет (цикл есть), но делает это неправильно, потому что после сравнения прыгает не на загрузку регистра, а сразу на его сравнение.
То есть, сгенерённый код бессмыслен.

Так ведь исходный код бессмысленный, зачем же после этого пенять на компилятор за то, что он бессмысленный код сгенерил? Из бессмысленности и получилась бессмысленность. Закономерный результат. Большего я от компилятора и не ждал бы laughing.gif
Dr.Alex
Цитата(SSerge @ Jul 3 2015, 23:19) *
Это именно что решение.
Как это ни покажется странным, но компилятор не обязан заново считывать значение переменной, если она не volatile.


Вы думаете я не знаю этих банальностей?
Я утверждаю лишь то что компилятор скомпилил бесмысленный код.
Он именно что "не обязан" проверять, но только в том случае если это даёт выигрыш.
А в данном случае он не сэкономил НИ БАЙТА и НИ ТАКТА.
Он ПЫТАЛСЯ проверять, но неправильно. Стоило прыгнуть на 1 инструкцию выше (чтение из памяти), и всё было бы логично.
scifi
Цитата(Dr.Alex @ Jul 3 2015, 23:37) *
Он именно что "не обязан" проверять, но только в том случае если это даёт выигрыш.
А в данном случае он не сэкономил НИ БАЙТА и НИ ТАКТА.
Он ПЫТАЛСЯ проверять, но неправильно. Стоило прыгнуть на 1 инструкцию выше (чтение из памяти), и всё было бы логично.

Спасибо, поржал. Жаловаться на компилятор за то, что он не сэкономил байт в ошибочном коде - это пять :-)
Если приведёте пример, где проверка не-volatile переменной в бесконечном цикле - это не ошибочный код, тогда, возможно, передумаю.
Dr.Alex
Цитата(scifi @ Jul 3 2015, 23:46) *
Спасибо, поржал. Жаловаться на компилятор за то, что он не сэкономил байт в ошибочном коде - это пять :-)
Если приведёте пример, где проверка не-volatile переменной в бесконечном цикле - это не ошибочный код, тогда, возможно, передумаю.


Я бы привёл, а толку? Вы ж читать не умеете. Где я жаловался на несэкономленный байт?
scifi
Цитата(Dr.Alex @ Jul 3 2015, 23:54) *
Где я жаловался на несэкономленный байт?

Пожалуйста:
Цитата(Dr.Alex @ Jul 3 2015, 23:37) *
А в данном случае он не сэкономил НИ БАЙТА и НИ ТАКТА.

Или у вас тут есть двойник? Тады ой.
Dr.Alex
Поскольку начинает происходить то же что и всегда - в тему набивается хамящая школота, самоутверждающаяся за чужой счёт (не все конечно), то придётся разъяснить на примере (иначе они не понимают), и закрыть тему.

Идёте в магаз и покупаете новый пульт для ящика.
А он без батареек. Ну и ладно, имеют право.
Но вместо батареек в пульте добротно сделанные муляжи из металла, тяжёленькие.
Я спрашиваю: нафига? Они же дороже плохоньких батареек.
А мне отвечают: как почему без батареек? Право имеем!
IgorKossak
Цитата(Dr.Alex @ Jul 4 2015, 00:03) *
Поскольку начинает происходить то же что и всегда - в тему набивается хамящая школота, самоутверждающаяся за чужой счёт (не все конечно), то придётся разъяснить на примере (иначе они не понимают), и закрыть тему.

Последнее слово будет всё таки за мной.
Ввиду рецидива грубости пользователь Dr.Alex в течение месяца будет наш форум только читать.
Модератор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.