|
Нарвался на глючище в ИАРе. Негодую... :-о |
|
|
|
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, то компилит правильно, но это же не решение! :-о :-о
Эскизы прикрепленных изображений
|
|
|
|
|
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 программирую, так что до вас мне далеко.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|