|
Нарвался на глючище в ИАРе. Негодую... :-о |
|
|
|
Jul 3 2015, 17:59
|
Профессионал
    
Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863

|
В цикле проверяется значение элемента структуры dev_state. Как видите, ИАР 7.40 загружает содержимое элемента в R0, потом сравнивает R0 с тройкой (это USBD_STATE_CONFIGURED), а на следующем цикле прыгает НЕ НА ЗАГРУЗКУ R0 (LDRB.W R0, ...), а сразу на сравнение (CMP R0, #3)!!! Удивляюсь, что у меня всё остальное вообще работает, с таким-то качеством компилёжки. Конечно, если снизить оптимизацию или объявить элемент dev_state как volatile, то компилит правильно, но это же не решение! :-о :-о
Эскизы прикрепленных изображений
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Jul 3 2015, 18:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
Цитата В цикле проверяется значение элемента структуры dev_state.
Как видите, ИАР 7.40 загружает содержимое элемента в R0, потом сравнивает R0 с тройкой (это USBD_STATE_CONFIGURED), а на следующем цикле прыгает НЕ НА ЗАГРУЗКУ R0 (LDRB.W R0, ...), а сразу на сравнение (CMP R0, #3)!!!
Удивляюсь, что у меня всё остальное вообще работает, с таким-то качеством компилёжки.
Конечно, если снизить оптимизацию или объявить элемент dev_state как volatile, то компилит правильно, но это же не решение! :-о :-о А что вам говорит техподдержка IAR ? или вы в очередной раз хотите чтобы ваши проблемы с платным компилятором решал "почтальон Печкин"?
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
|
Jul 3 2015, 18:13
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата онечно, если снизить оптимизацию или объявить элемент dev_state как volatile, то компилит правильно, но это же не решение! :-о :-о В смысле?!!!! объявить переменную изменчивой, для того чтобы компилятор каждый раз грузил ее значение заново не решение? А нафига тогда нужно такое объявление иначе  ? Цитата А что вам говорит техподдержка IAR ? Это шутка? int i = 0; while(i != 5); практически все оптимизаторы сделают тут вечный висяк, если даже i где то в прерываниях меняется... для этого volatile и придумано....
|
|
|
|
|
Jul 3 2015, 18:20
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
Цитата(Golikov A. @ Jul 3 2015, 21:13)  В смысле?!!!! объявить переменную изменчивой, для того чтобы компилятор каждый раз грузил ее значение заново не решение? А нафига тогда нужно такое объявление иначе  ? Это шутка? int i = 0; while(i != 5); практически все оптимизаторы сделают тут вечный висяк, если даже i где то в прерываниях меняется... для этого volatile и придумано.... конечно. ТС живёт в категории "ниасилил". ему плевать, что он сделал, - висяк, или не очень.
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
|
Jul 3 2015, 18:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863

|
Цитата(Golikov A. @ Jul 3 2015, 21:18)  снизойдите скажите ответ, сил нет понять где сглупил.... ОК. Если компилятор считает, что переменная не меняется, он не станет её проверять в цикле. А здесь проверяет (цикл есть), но делает это неправильно, потому что после сравнения прыгает не на загрузку регистра, а сразу на его сравнение. То есть, сгенерённый код бессмыслен.А нужно ли было объявлять элемент структуры (или всю структуру) как volatile или нет, это уже другой вопрос, и он к писателям STM (как вы могли заметить, это Cube).
|
|
|
|
|
Jul 3 2015, 18:55
|
Частый гость
 
Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355

|
Цитата(Dr.Alex @ Jul 3 2015, 23:22)  Если компилятор считает, что переменная не меняется, он не станет её проверять в цикле. Компилятор проверяет не переменную, а значение регистра R0, который наверняка где-то объявлен как volatile, как и все регистры IO.
|
|
|
|
|
Jul 3 2015, 19:01
|
Частый гость
 
Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355

|
Цитата(Dr.Alex @ Jul 3 2015, 23:58)  :-))))))))))))))))) Вы начинающий, так что не стану ругаться.. :-о Да, лет так 30 программирую, так что до вас мне далеко.
|
|
|
|
|
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
|
|
|