DevDes 0 26 июня, 2023 Опубликовано 26 июня, 2023 · Жалоба 53 minutes ago, Палыч said: Если Вы для отладки используете ULINK, то в опциях отладки нужно его и выбрать. В выложенном Вами проекте выбран JLINK... Это случайность, т.е пробовал и с ULINK-ом потом случайно переключил на JLINK Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба В 24.06.2023 в 11:02, DevDes сказал: именно исчезают брекпоинты (т.е поставить можно, но в отладочной сесии становятся недоступны и отстановки на них не происходит) Укажите место (файл, строку) в которое ставите брекпоинты. Обычно они недоступны в местах, которые были выкинуты из проекта из-за ненадобности. Например, в подпрограмме, которую некто не вызывает. или в присваивании переменной, которую никто не использует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DevDes 0 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба On 6/26/2023 at 12:01 PM, jcxz said: Есть или нет отладочная информация - это никак не должно влиять на возможность установки и работу бряков в окне дизассемблера. И именно там и нужно проверять работу этих бряков. Надеюсь ТС именно в окне дизасма и ставит бряки? Отсутствие отладочной инфы влияет только на работу бряков в окне исходного кода. Как впрочем и высокие уровни оптимизации могут приводить к проблемам с бряками в окне исходного кода. Поэтому: сперва проверить работу бряков в окне дизасма, а затем (если всё ок) - поставить оптимизацию на минимум (или вообще выключить) и проверить работу бряков в окне исходного кода. PS: И ULink я бы заменил на что-то более вменяемое... В окне дизассембера бряки ставить удалось, а вот что в исходном коде - никак. Можете указать точнее где и как добавить отладочную информацию (сам какие то галки ставил но это не помогло). Так же по прежнему не могу найти причину, обрывов связи, а так же причину изменения тактовой частоты процессора. 6 hours ago, Палыч said: Укажите место (файл, строку) в которое ставите брекпоинты. Обычно они недоступны в местах, которые были выкинуты из проекта из-за ненадобности. Например, в подпрограмме, которую некто не вызывает. или в присваивании переменной, которую никто не использует. В цикле опроса кнопок в файле main.c т.е никак не может пролетать мимо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба 46 минут назад, DevDes сказал: В окне дизассембера бряки ставить удалось, а вот что в исходном коде - никак. Можете указать точнее где и как добавить отладочную информацию (сам какие то галки ставил но это не помогло). Далее нужно выключить оптимизацию. А также убедиться, что тот фрагмент кода, где пытаетесь ставить бряк, был скомпилён (а не выкинут компилятором/компоновщиком из-за неиспользуемости). Убедиться обычно в этом можно по тому же окну дизасма: Если при установке точки исполнения на строку исходного кода, происходит перепрыг на соответствующий ей ассемблерный код в окне дизасма - код скомпилён. И при установке бряка на исходнике, этот бряк должен появляться в окне дизасма на соответствующем ему коде. Где отладочную инфу включить - не подскажу, так как с Keil for ARM не работал. 46 минут назад, DevDes сказал: В цикле опроса кнопок в файле main.c т.е никак не может пролетать мимо. Может. Если например: PORT_ReadInputDataBit(PORTC,PORT_Pin_10) всегда возвращает !=0, то всю ветку true для: if (PORT_ReadInputDataBit(PORTC,PORT_Pin_10) == 0) компилятор имеет право выбросить, а любые попытки установки бряков внутри ветки true будет игнорировать. PS: Код написан совершенно безграмотно... Все ваши: for (i=0;i<200000;i++){}; и аналогичные, нормальный компилятор имеет полное право просто выкинуть. И никакие бряки там естественно тогда ставиться не будут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DevDes 0 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба 32 minutes ago, jcxz said: Если например: PORT_ReadInputDataBit(PORTC,PORT_Pin_10) всегда возвращает !=0, то всю ветку true для: if (PORT_ReadInputDataBit(PORTC,PORT_Pin_10) == 0) компилятор имеет право выбросить, а любые попытки установки бряков внутри ветки true будет игнорировать. PS: Код написан совершенно безграмотно... Все ваши: for (i=0;i<200000;i++){}; и аналогичные, нормальный компилятор имеет полное право просто выкинуть. И никакие бряки там естественно тогда ставиться не будут. Код компилится и работает успешно, это видно по тому факту что на нажатие кнопок есть реакция. И ничего компилятор не выбрасывает for (i=0;i<200000;i++){}; стандартный способ программной задержки, да и откуда компилятору знать, что будет на входе порта PORTC? Р.S: Код не мой а тестовая программа для отладочной платы от Миландра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба 1 час назад, DevDes сказал: В цикле опроса кнопок в файле main.c т.е никак не может пролетать мимо. Обратите внимание на цвет фона левее номера строки в режиме отладки: светлый - строки выброшены из-за несущественности и поставить точку останова на эти строки не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба 20 минут назад, DevDes сказал: И ничего компилятор не выбрасывает for (i=0;i<200000;i++){}; стандартный способ программной задержки Советую вам подучить матчасть. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DevDes 0 27 июня, 2023 Опубликовано 27 июня, 2023 (изменено) · Жалоба 1 hour ago, Палыч said: Обратите внимание на цвет фона левее номера строки в режиме отладки: светлый - строки выброшены из-за несущественности и поставить точку останова на эти строки не получится. Вы конечно правы по поводу подсветки строк, но как показывает практика при запуске подпрограммы испольняются, т.е я могу на дисплее с помощью кнопок выбрать нужный тест и он запускается. А данный участок кода насколько я понял как раз является циклом опроса кнопок, и выозова подпрограмм. 1 hour ago, jcxz said: Советую вам подучить матчасть. Цикл for(i=0;i<N;i++){} это синтаксический сахар к int i = 0; while(i<N){i++;} Т.е выполняется N раз увеличение переменной i на 1 плюс сравнение с лимитом (даже если "тело" цикла пусто), и это не может быть просто выброшено. Ну и конечно это занимает время у процессора и потому является программной задержкой. Почему вы считаете что компилятор будет это "выбрасывать"? Изменено 27 июня, 2023 пользователем DevDes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба 13 минут назад, DevDes сказал: Т.е выполняется N раз увеличение переменной i на 1 плюс сравнение с лимитом (даже если "тело" цикла пусто), и это не может быть просто выброшено. может. Любая операция не дающая результата может (и должна) быть выброшена. 13 минут назад, DevDes сказал: Почему вы считаете что компилятор будет это "выбрасывать"? Потому что i - без volatile. PS: Ещё раз - учите матчасть (язык си)! 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба 34 минуты назад, DevDes сказал: Вы конечно правы по поводу подсветки строк, но как показывает практика при запуске подпрограммы испольняются, т.е я могу на дисплее с помощью кнопок выбрать нужный тест и он запускается. А данный участок кода насколько я понял как раз является циклом опроса кнопок, и выозова подпрограмм На рисунке выше - Ваша программа. Как видно, на примерно 50℅ строк нельзя поставить точку останова из-за того, что этим строкам в полученном исполняемом коде не соответствует ни одна команда. Насчёт пустого цикла... В данном случае - оптимизация выключена и цикл с пустыл телом тупо транслируется в соответствующие команды МК. Однако, при включëнной оптимизации на это расчитывать не стоит. Цикл может быть заменён эквивалентом i= N; или даже выброшен совсем. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба 12 hours ago, DevDes said: Почему вы считаете что компилятор будет это "выбрасывать"? Подтверждаю. Компилятор этот цикл имеет полное право удалить из исполняемого кода. Т.к. с точки зрения компилятора такой цикл не имеет смысла. Это для Вас, как для программиста, он занимает процессорное время, а следовательно является эрзац-задержкой. Почему эрзац? Да потому, что на архитектуре ARM команды могут выполняться за различное количество циклов по вине конвейера. И правильнее использовать аппаратный таймер в этом случае. Хотя, если нужна задержка "плюс/минус калач", то можно и в цикле. Но сам компилятор ничего не знает об аппаратном обеспечении кроме системы команд. Компилятору неведомы "задержки", "порты ввода/вывода", переходные процессы электрических сигналов и т.д. и т.п. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DevDes 0 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба Короче точки останова не ставятся независимо от подстветки, точнее в режиме отладки все подсвечено серым. Установка точек возможна только в окне дизассемблера. Задержки в циклах никуда не выбрасываются, это видно по частоте мигания светодиодов, да компиляторы могут оптимизировать, но так сказать не тот случай ( нет у меня оптимизации такой). При выборе на отладочной плате с помощью кнопок какого - либо теста отвал связи... Короче говоря вероятно это какие-то аппаратные недоработки от Миландра, или мой девайс пак с гитхаба неподходит (в режиме отладки нет возможности посмотреть регистры переферии). Пак от миландра для данной версии МК на сайте Миландра сейчас отсутствует. Еще раз напомню код не мой, а от Миландра. Тема закрыта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться