реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Closed TopicStart new topic
> Нарвался на глючище в ИАРе. Негодую... :-о
Dr.Alex
сообщение Jul 3 2015, 19:53
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(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 не нужно, а просто делает как фишка ляжет, что и удручает.
Go to the top of the page
 
+Quote Post
Aner
сообщение Jul 3 2015, 20:05
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



Эти ваши какашки из куба, такого там оч много. Эта кубическая кривота, для начинающих, чтобы их мозг искалечить. Чтобы не смогли проги писать. Я посмотрел на это, поржал и все. Даже средненькие прогеры этот куб не пользуют, вам то он зачем сдался?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jul 3 2015, 20:19
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Dr.Alex @ Jul 4 2015, 00:59) *
Конечно, если снизить оптимизацию или объявить элемент dev_state как volatile, то компилит правильно, но это же не решение! :-о :-о

Это именно что решение.
Как это ни покажется странным, но компилятор не обязан заново считывать значение переменной, если она не volatile.
Более того, в некоторых случаях, когда значение dev_state точно известно на момент компиляции (например незадолго до того ей присвоили константное знасение и, стало быть, результат сравнения заранее известен), имеет право заоптимизировать всё вплоть до вечного цикла из одной команды перехода.
Это просто ещё один способ выстрелить себе в ногу.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 3 2015, 20:25
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Так ведь исходный код бессмысленный, зачем же после этого пенять на компилятор за то, что он бессмысленный код сгенерил? Из бессмысленности и получилась бессмысленность. Закономерный результат. Большего я от компилятора и не ждал бы laughing.gif
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Jul 3 2015, 20:37
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(SSerge @ Jul 3 2015, 23:19) *
Это именно что решение.
Как это ни покажется странным, но компилятор не обязан заново считывать значение переменной, если она не volatile.


Вы думаете я не знаю этих банальностей?
Я утверждаю лишь то что компилятор скомпилил бесмысленный код.
Он именно что "не обязан" проверять, но только в том случае если это даёт выигрыш.
А в данном случае он не сэкономил НИ БАЙТА и НИ ТАКТА.
Он ПЫТАЛСЯ проверять, но неправильно. Стоило прыгнуть на 1 инструкцию выше (чтение из памяти), и всё было бы логично.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 3 2015, 20:46
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Спасибо, поржал. Жаловаться на компилятор за то, что он не сэкономил байт в ошибочном коде - это пять :-)
Если приведёте пример, где проверка не-volatile переменной в бесконечном цикле - это не ошибочный код, тогда, возможно, передумаю.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Jul 3 2015, 20:54
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



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


Я бы привёл, а толку? Вы ж читать не умеете. Где я жаловался на несэкономленный байт?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 3 2015, 21:01
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Dr.Alex @ Jul 3 2015, 23:54) *
Где я жаловался на несэкономленный байт?

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

Или у вас тут есть двойник? Тады ой.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Jul 3 2015, 21:03
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



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

Идёте в магаз и покупаете новый пульт для ящика.
А он без батареек. Ну и ладно, имеют право.
Но вместо батареек в пульте добротно сделанные муляжи из металла, тяжёленькие.
Я спрашиваю: нафига? Они же дороже плохоньких батареек.
А мне отвечают: как почему без батареек? Право имеем!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 4 2015, 08:23
Сообщение #25


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

Последнее слово будет всё таки за мной.
Ввиду рецидива грубости пользователь Dr.Alex в течение месяца будет наш форум только читать.
Модератор.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 10:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.14094 секунд с 7
ELECTRONIX ©2004-2016