Jump to content

    
Vlad_G

Отладка в CubeIDE

Recommended Posts

5 minutes ago, haker_fox said:

 

Всё это я автора просил проверить вот тут

 

Так по коду не видно. Я и спросил. Оно ж и метки на одном месте были? Поэтому нет уверенности.

Share this post


Link to post
Share on other sites

Сиё:

1 час назад, Vlad_G сказал:

if(((GPIOA->IDR) & 0x40) == 0x40)

И сиё:

40 минут назад, Vlad_G сказал:

if(GPIOA->IDR & 0x40 == 0x40)

разные вещи. Учите язык си! Естественно, что во 2-м случае компилятор оставил только "goto _2".

 

PS: Дурак как всегда оказался программист, а не компилятор.  :unknw:

Share this post


Link to post
Share on other sites
1 minute ago, jcxz said:

Естественно, что во 2-м случае компилятор оставил только "goto _2".

Ахренеть! А я то машинально смотрел на первый вариант скобок и не заметил, что автор убрал вообще всё что можно.

3 minutes ago, jcxz said:

Учите язык си!

Люто плюсую!

3 minutes ago, jcxz said:

PS: Дурак как всегда оказался программист, а не компилятор.

@jcxz, что то вы нервным стали))

Share this post


Link to post
Share on other sites
Just now, jcxz said:

PS: Дурак как всегда оказался программист, а не компилятор.  :unknw:

Никогда не исключал такое дело.

Скобки - это уже мои вариации, сразу были мысли, что может в них дело. Вот посмотрел разные варианты - и с кучей скобок (попросили пожалеть народ) и без них, ессно и промежуточный вариант не забыл.

Порт включаю так:

RCC->AHBENR |= RCC_AHBENR_GPIOAEN;						//включаем GPIO A

На включение порта не грешил, поскольку используются и другие пины этого порта и вопросов к ним не было.

Quote

haker_fox  Вот здесь r3 совпадает с тем, что отладчик читает в IDR?

IDR = 0x4660, в r3 пишет что = 0x4800 0000

Share this post


Link to post
Share on other sites
3 minutes ago, Vlad_G said:

и с кучей скобок (попросили пожалеть народ)

Так не все же их убрать, а только лишние.

3 minutes ago, Vlad_G said:

IDR = 0x4660, в r3 пишет что = 0x4800 0000

Всё, вам уже сказали в чём дело. Пробуйте. Должно работать.

Share this post


Link to post
Share on other sites

даже при отсутствии оптимизации неиспользуемый код может удаляться. А тут вообще кода нет. Точку остановки поставить можно, но она сместиться вниз. На первый неудаленной исполняемый оператор.
Если хотите четко в отладчике увидеть переход, то ставьте хотя бы присвоение значения какой то переменной, или лучше пустой цикл на несколько действий, 
{
int i =2;
while (i--) {};

}
ну типа такого. Это компилятор не удалит. И всегда можно будет поставить Breakpoint
раньше я просто ставил NOP и уже можно было на нем поставить точку останова. В Cube IDE не пробовал.


 

Share this post


Link to post
Share on other sites
15 minutes ago, bgc said:

даже при отсутствии оптимизации неиспользуемый код может удаляться. А тут вообще кода нет.

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

Благодарю откликнувшихся! Решено. Сделал нормальную развилку и все пошло.

Share this post


Link to post
Share on other sites
1 час назад, bgc сказал:

ну типа такого. Это компилятор не удалит. И всегда можно будет поставить Breakpoint

Как раз пустой цикл компилятор с большой вероятностью удалит. Получить неудаляемый код можно добавив какую-нить intrinsic-функцию. Например: __ISB() или аналогичную.

Развернётся всего в одну команду, причём - никак не пересекающуюся по регистрам с окружающим кодом. Не зависимо от уровня оптимизации. И на неё можно спокойно ставить бряк.

Share this post


Link to post
Share on other sites
1 hour ago, Vlad_G said:

Как знатузнать, что что-то было убрано...

Нужно знать и понимать язык на котором программируете. Думать немного как компилятор.

1 hour ago, Vlad_G said:

И что тогда значит - отключить оптимизацию?

 

18 minutes ago, Vlad_G said:

но если переменную цикла объявить как volatile, то оставит жить

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

Share this post


Link to post
Share on other sites

Обид нет. Скачал книгу. Тут только вопрос насколько соотносится Си для ПК и для МК, скажем на уровне компилятора.

А вот чем вам не понравилось - volatile? Скажем, чтобы увидеть переменную в отладчике STMStudio её надо пометить как волатиле, компилятор выделяет для нее постоянный адрес и спокойно можно работать с ней "дистанционно". А динамические переменные STMStudio уже не видит (может не разобрался (?)). Видел кучу "ср.чей" в тырнете относительно волатиле и разводить еще один не собираюсь, но все же коротенько, если возможно коротенько. 

В моих случаях объема ОЗУ хватает с лихвой, что бы экономить и применять динамические переменные.

Share this post


Link to post
Share on other sites
7 minutes ago, Vlad_G said:

Тут только вопрос насколько соотносится Си для ПК и для МК, скажем на уровне компилятора

Не понятен ваш вопрос. Что вы хотели спросить? Вам бы понять как устроен язык. А это будет одинаково и для компьютера и для микроконтроллера.

8 minutes ago, Vlad_G said:

Скажем, чтобы увидеть переменную в отладчике STMStudio её надо пометить как волатиле

Ключевое слово volatile предназначено совершенно для иного. Для чего - читайте. И здесь на форуме обсуждали несколько раз. И то, что вы с помощью неё отлаживаетесь говорит о невладении инструментов. Ну это всё равно, что забивать гвозди пассатижами. Да, можно. Но адекватный плотник скажет вам, что вы неправы.

9 minutes ago, Vlad_G said:

компилятор выделяет для нее постоянный адрес

Вздор. Происходит другое.

9 minutes ago, Vlad_G said:

А динамические переменные

Динамические переменные? О таких не слышал. О динамической памяти знаю. Но динамических переменных не существует.

10 minutes ago, Vlad_G said:

Видел кучу "ср.чей" в тырнете относительно волатиле и разводить еще один не собираюсь

Вы не срачи читайте, а книги. И разводить не надо) Уточнить можно.

11 minutes ago, Vlad_G said:

В моих случаях объема ОЗУ хватает с лихвой, что бы экономить и применять динамические переменные.

Дело ваше. Хотите - делайте правильно. Хотите - делайте так, как считаете нужным.

Share this post


Link to post
Share on other sites
49 minutes ago, haker_fox said:

Ключевое слово volatile предназначено совершенно для иного.

Если коротко, то volatile это сообщение компилятору, что данная переменная (в памяти) может быть изменена асинхронно. Например из прерывания или в результате работы DMA.
В этом случае компилятору запрещено копировать значение переменной из основного места в памяти куда либо (например, в регистр), с целью оптимизации кода. 
При каждом обращении к этой переменной компилятор будет повторять считывание из памяти. И брать последнее актуальное значение.

Share this post


Link to post
Share on other sites
6 minutes ago, bgc said:

Если коротко, то volatile это сообщение компилятору, что данная переменная (в памяти) может быть изменена асинхронно.

Ну и?) Вы знаете, я знаю, нужно чтобы автор сам разобрался с этим вопросом.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.