|
Нарвался на глючище в ИАРе. Негодую... :-о |
|
|
|
Jul 3 2015, 19:53
|
Профессионал
    
Группа: Свой
Сообщений: 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 не нужно, а просто делает как фишка ляжет, что и удручает.
|
|
|
|
|
Jul 3 2015, 20:19
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jul 3 2015, 20:37
|
Профессионал
    
Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863

|
Цитата(SSerge @ Jul 3 2015, 23:19)  Это именно что решение. Как это ни покажется странным, но компилятор не обязан заново считывать значение переменной, если она не volatile. Вы думаете я не знаю этих банальностей? Я утверждаю лишь то что компилятор скомпилил бесмысленный код. Он именно что "не обязан" проверять, но только в том случае если это даёт выигрыш. А в данном случае он не сэкономил НИ БАЙТА и НИ ТАКТА. Он ПЫТАЛСЯ проверять, но неправильно. Стоило прыгнуть на 1 инструкцию выше (чтение из памяти), и всё было бы логично.
|
|
|
|
|
Jul 3 2015, 20:46
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Dr.Alex @ Jul 3 2015, 23:37)  Он именно что "не обязан" проверять, но только в том случае если это даёт выигрыш. А в данном случае он не сэкономил НИ БАЙТА и НИ ТАКТА. Он ПЫТАЛСЯ проверять, но неправильно. Стоило прыгнуть на 1 инструкцию выше (чтение из памяти), и всё было бы логично. Спасибо, поржал. Жаловаться на компилятор за то, что он не сэкономил байт в ошибочном коде - это пять :-) Если приведёте пример, где проверка не-volatile переменной в бесконечном цикле - это не ошибочный код, тогда, возможно, передумаю.
|
|
|
|
|
Jul 3 2015, 20:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863

|
Цитата(scifi @ Jul 3 2015, 23:46)  Спасибо, поржал. Жаловаться на компилятор за то, что он не сэкономил байт в ошибочном коде - это пять :-) Если приведёте пример, где проверка не-volatile переменной в бесконечном цикле - это не ошибочный код, тогда, возможно, передумаю. Я бы привёл, а толку? Вы ж читать не умеете. Где я жаловался на несэкономленный байт?
|
|
|
|
|
Jul 3 2015, 21:01
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Dr.Alex @ Jul 3 2015, 23:54)  Где я жаловался на несэкономленный байт? Пожалуйста: Цитата(Dr.Alex @ Jul 3 2015, 23:37)  А в данном случае он не сэкономил НИ БАЙТА и НИ ТАКТА. Или у вас тут есть двойник? Тады ой.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|