Tolyaha 1 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 5 minutes ago, haker_fox said: Всё это я автора просил проверить вот тут Так по коду не видно. Я и спросил. Оно ж и метки на одном месте были? Поэтому нет уверенности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 2 minutes ago, Tolyaha said: Я и спросил. В данном случае я вам маленько посочувствовал, так сказать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Сиё: 1 час назад, Vlad_G сказал: if(((GPIOA->IDR) & 0x40) == 0x40) И сиё: 40 минут назад, Vlad_G сказал: if(GPIOA->IDR & 0x40 == 0x40) разные вещи. Учите язык си! Естественно, что во 2-м случае компилятор оставил только "goto _2". PS: Дурак как всегда оказался программист, а не компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 1 minute ago, jcxz said: Естественно, что во 2-м случае компилятор оставил только "goto _2". Ахренеть! А я то машинально смотрел на первый вариант скобок и не заметил, что автор убрал вообще всё что можно. 3 minutes ago, jcxz said: Учите язык си! Люто плюсую! 3 minutes ago, jcxz said: PS: Дурак как всегда оказался программист, а не компилятор. @jcxz, что то вы нервным стали)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Just now, jcxz said: PS: Дурак как всегда оказался программист, а не компилятор. Никогда не исключал такое дело. Скобки - это уже мои вариации, сразу были мысли, что может в них дело. Вот посмотрел разные варианты - и с кучей скобок (попросили пожалеть народ) и без них, ессно и промежуточный вариант не забыл. Порт включаю так: RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //включаем GPIO A На включение порта не грешил, поскольку используются и другие пины этого порта и вопросов к ним не было. Quote haker_fox Вот здесь r3 совпадает с тем, что отладчик читает в IDR? IDR = 0x4660, в r3 пишет что = 0x4800 0000 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 3 minutes ago, Vlad_G said: и с кучей скобок (попросили пожалеть народ) Так не все же их убрать, а только лишние. 3 minutes ago, Vlad_G said: IDR = 0x4660, в r3 пишет что = 0x4800 0000 Всё, вам уже сказали в чём дело. Пробуйте. Должно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bgc 0 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба даже при отсутствии оптимизации неиспользуемый код может удаляться. А тут вообще кода нет. Точку остановки поставить можно, но она сместиться вниз. На первый неудаленной исполняемый оператор. Если хотите четко в отладчике увидеть переход, то ставьте хотя бы присвоение значения какой то переменной, или лучше пустой цикл на несколько действий, { int i =2; while (i--) {}; } ну типа такого. Это компилятор не удалит. И всегда можно будет поставить Breakpoint раньше я просто ставил NOP и уже можно было на нем поставить точку останова. В Cube IDE не пробовал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 15 minutes ago, bgc said: даже при отсутствии оптимизации неиспользуемый код может удаляться. А тут вообще кода нет. Вот в этом все и дело. Как знатузнать, что что-то было убрано... Безусловный переход, это тоже код, вполне себе занимает место в памяти, а куда идет, так это мое дело (защищенную память не рассматриваю). В ассме всё так делал заглушки на начальной стадии, потом дописывал нужный код. И что тогда значит - отключить оптимизацию? Ладно. Благодарю откликнувшихся! Решено. Сделал нормальную развилку и все пошло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 1 час назад, bgc сказал: ну типа такого. Это компилятор не удалит. И всегда можно будет поставить Breakpoint Как раз пустой цикл компилятор с большой вероятностью удалит. Получить неудаляемый код можно добавив какую-нить intrinsic-функцию. Например: __ISB() или аналогичную. Развернётся всего в одну команду, причём - никак не пересекающуюся по регистрам с окружающим кодом. Не зависимо от уровня оптимизации. И на неё можно спокойно ставить бряк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Да, пустой удалит, но если переменную цикла объявить как volatile, то оставит жить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 1 hour ago, Vlad_G said: Как знатузнать, что что-то было убрано... Нужно знать и понимать язык на котором программируете. Думать немного как компилятор. 1 hour ago, Vlad_G said: И что тогда значит - отключить оптимизацию? 18 minutes ago, Vlad_G said: но если переменную цикла объявить как volatile, то оставит жить Без обид за прямоту, но у вас полное непонимание языка. Почитайте книгу, которую я вам посоветовал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Обид нет. Скачал книгу. Тут только вопрос насколько соотносится Си для ПК и для МК, скажем на уровне компилятора. А вот чем вам не понравилось - volatile? Скажем, чтобы увидеть переменную в отладчике STMStudio её надо пометить как волатиле, компилятор выделяет для нее постоянный адрес и спокойно можно работать с ней "дистанционно". А динамические переменные STMStudio уже не видит (может не разобрался (?)). Видел кучу "ср.чей" в тырнете относительно волатиле и разводить еще один не собираюсь, но все же коротенько, если возможно коротенько. В моих случаях объема ОЗУ хватает с лихвой, что бы экономить и применять динамические переменные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 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: В моих случаях объема ОЗУ хватает с лихвой, что бы экономить и применять динамические переменные. Дело ваше. Хотите - делайте правильно. Хотите - делайте так, как считаете нужным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bgc 0 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 49 minutes ago, haker_fox said: Ключевое слово volatile предназначено совершенно для иного. Если коротко, то volatile это сообщение компилятору, что данная переменная (в памяти) может быть изменена асинхронно. Например из прерывания или в результате работы DMA. В этом случае компилятору запрещено копировать значение переменной из основного места в памяти куда либо (например, в регистр), с целью оптимизации кода. При каждом обращении к этой переменной компилятор будет повторять считывание из памяти. И брать последнее актуальное значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба 6 minutes ago, bgc said: Если коротко, то volatile это сообщение компилятору, что данная переменная (в памяти) может быть изменена асинхронно. Ну и?) Вы знаете, я знаю, нужно чтобы автор сам разобрался с этим вопросом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться