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

Поскольку сам писал так же, решил проверить. В Кейле.

Оптимизация -o0
Код
;;;84       while (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED) { }
  000010  bf00              NOP      
                    |L3.18|
  000012  480a              LDR      r0,|L3.60|
  000014  f89001fc          LDRB     r0,[r0,#0x1fc]; hUsbDeviceFS
  000018  2803              CMP      r0,#3
  00001a  d1fa              BNE      |L3.18|

Оптимизация -o3
Код
;;;84       while (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED) { }
   000010  4809              LDR      r0,|L3.56|
   000012  f89001fc          LDRB     r0,[r0,#0x1fc]
                     |L3.22|
   000016  2803              CMP      r0,#3
   000018  d1fd              BNE      |L3.22|


Видим, что Кейл ведет себя так же. rolleyes.gif А писатели Куба - лохи голимые. Надо было volatile задать.

Dr.Alex - спасибо. Еще один малый шаг к вершинам познания...
alag57
Цитата(ViKo @ Jul 4 2015, 14:18) *
Dr.Alex - спасибо. Еще один малый шаг к вершинам познания...

Спасибо то за что? Это же очевидно.
Corvus
Цитата(ViKo @ Jul 4 2015, 12:18) *
А писатели Куба - лохи голимые. Надо было volatile задать.


Все ошибаются. Если не трудно, напишите ST в саппорт - пофиксят. И всем будет приятно. sm.gif
ViKo
Цитата(alag57 @ Jul 4 2015, 13:11) *
Спасибо то за что? Это же очевидно.


Очевидно, когда увидел. А когда у меня USB не запускается из-за этого, возможно - то спасибо тут к месту. rolleyes.gif

В саппорт писать нет смысла. Там, скорее всего, сделано, как задумано. Я лучше продолжу штудировать Референс Мануал, и писать своё... но уже после отпуска. laughing.gif

alag57
Цитата(ViKo @ Jul 4 2015, 15:27) *
А когда у меня USB не запускается из-за этого

Из-за volatile? Я был о вас лучшего мнения biggrin.gif
ViKo
Цитата(alag57 @ Jul 4 2015, 16:01) *
Из-за volatile? Я был о вас лучшего мнения biggrin.gif


Т.е., когда я ничтоже сумняшеся написал:

while (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED) { }

то виноват я сам, а Куб тут не при чем? rolleyes.gif Состояние USB устройства нельзя было проверять таким образом? Скажу по секрету, что без проверки устройство в одном проекте запускается, в другом нет. И данный пример окончательно поставил крест на Кубе (не стране biggrin.gif )!

Может, и не из-за этого... мало ли в Кубе глюков?



scifi
Тут есть два аспекта.
1) А вот не надо включать оптимизацию без надобности. Именно по этой причине. Для тех, кто в танке: по причине того, что всякие кубы - это индусский говнокод.
2) Доктор Алекс вчера перебрал горячительного и выплеснул на форум. Не обращайте внимания.
ViKo
Доктор Алекс в своей манере высказал свое мнение. Не обращая внимание на форму, скажем спасибо за содержание.
Оптимизация не должна влиять на работоспособность программы. Удивляюсь таким советам!
jcxz
Цитата(ViKo @ Jul 4 2015, 20:55) *
Оптимизация не должна влиять на работоспособность программы. Удивляюсь таким советам!

Поддерживаю!
А если она всё-таки влияет, то в топку не оптимизацию, а такой код.
Если включаешь оптимизацию и что-то перестаёт работать - надо браться за отладчик и искать, а не прятать голову в песок.
scifi
Цитата(ViKo @ Jul 4 2015, 17:55) *
Оптимизация не должна влиять на работоспособность программы.

Да ради бога. Я же на заставляю вас использовать этот куб.
Golikov A.
Тот извесный школьник давил на то что неверный полученный код, а на самом деле неверный входной код.

В той теме тс начал гнать и не слушать... Вы берете маленький кусок и смотрите, переменная не объявлена изменчивой и нигде не меняеться, а вы вспомните что эта переменная может измениться внутри вайла. Попробуйте добавить изменения переменной под вайлом по какому то условию и все может поменятся....
HardEgor
Цитата(ViKo @ Jul 4 2015, 15:18) *
Видим, что Кейл ведет себя так же. rolleyes.gif А писатели Куба - лохи голимые. Надо было volatile задать.

Возможно для этого они и объявляют на каждый чих собственную функцию, т.е. вашей проверке вместо переменной hUsbDeviceFS.dev_state должна быть функция типа check_hUsbDeviceFS(_dev_state). Тогда компилятор её не завернет и volatile не потребуется. Ну подумаешь немножечко код подрастет... ж)
adnega
Цитата(ViKo @ Jul 4 2015, 17:55) *
Доктор Алекс в своей манере высказал свое мнение.

Он обвинил компилятор в генерации некорректного кода, а не исходник.
Кста, а Куб не запрещает ли включать оптимизацию? Может, он только для -o0 писан.
Golikov A.
Вроде там была функция типа Getstatus, или state, вместо прямого обращения к полям структуры.

Компиляторы работают верно и ожидать от них другого не надо. Почему они вообще не выкидывают проверку? Потому что изменение дальше по коду изменит регистр и проверка выполнится.

Куб имеет четкий воркфлов, на дефолтной оптимизации, а этотне 0 уровень у меня много работало корректно, только надо не гнать отсебятину, а делать по их заданной последовательности. Многое там не оптимально, но как быстрый тест или детский пример покатит....
Corvus
Цитата(Golikov A. @ Jul 5 2015, 18:39) *
Многое там не оптимально, но как быстрый тест или детский пример покатит....

Но здесь-то все профи высшего класса, ошибок никогда не допускают. Уже успели создать 2 темы и обругать, как ST, так и два компилятора (совершенно незаслуженно при этом). Название тем достойно восхищения. biggrin.gif
ViKo
Цитата(Corvus @ Jul 5 2015, 18:56) *
Но здесь-то все профи высшего класса, ошибок никогда не допускают. Уже успели создать 2 темы и обругать, как ST, так и два компилятора (совершенно незаслуженно при этом). Название тем достойно восхищения. biggrin.gif

Компилятор я не ругал. Хотя и не понимаю смысла проверять в цикле регистр, который не может измениться. Здесь бы предупреждение выдать не помешало.
Я потому и ввел проверку состояния, что устройство то запускается, то нет...
GetStatus - это запрос по шине USB, по-моему, не то.

Цитата(Golikov A. @ Jul 5 2015, 18:39) *
Почему они вообще не выкидывают проверку? Потому что изменение дальше по коду изменит регистр и проверка выполнится.

Как же она выполнится, если процессор зациклился на проверке? Посмотрите второй код в первом сообщении. rolleyes.gif

Цитата(Golikov A. @ Jul 5 2015, 18:39) *
только надо не гнать отсебятину, а делать по их заданной последовательности.

Где??? Где она описана, эта ... последовательность? Тыкаюсь, как слепой, во все дыры... Конкретно - USB CDC на STM32F207.
Golikov A.
Обвиняли как раз компилятор, и это не верно.

Компилятор делает не только ваш код.
int TimeOut = 0;
While(TimeOut <= 10)
{
.....
TimeOut+= TickSize;
}

Такого кода, конечно, никто и представить не может. Таймауты, счетчики ошибок, и многое. Привязались к одному конкретному куску кода и все перетираете....

Кстати регистр можно изменить и жетагом, такой брекпоинт своеобразный. Главное что есть четкие правила как этого избежать, и чего обсуждать.

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