Перейти к содержанию
    

Освоение МК Миландр

53 minutes ago, Палыч said:

Если Вы для отладки используете ULINK, то в опциях отладки нужно его и выбрать. В выложенном Вами проекте выбран JLINK...

Это случайность, т.е пробовал и с ULINK-ом потом случайно переключил на JLINK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 24.06.2023 в 11:02, DevDes сказал:

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

Укажите место (файл, строку) в которое ставите брекпоинты. Обычно они недоступны в местах, которые были выкинуты из проекта из-за ненадобности. Например, в подпрограмме, которую некто не вызывает. или в присваивании переменной, которую никто не использует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/26/2023 at 12:01 PM, jcxz said:

Есть или нет отладочная информация - это никак не должно влиять на возможность установки и работу бряков в окне дизассемблера.

И именно там и нужно проверять работу этих бряков. Надеюсь ТС именно в окне дизасма и ставит бряки?

Отсутствие отладочной инфы влияет только на работу бряков в окне исходного кода. Как впрочем и высокие уровни оптимизации могут приводить к проблемам с бряками в окне исходного кода. Поэтому: сперва проверить работу бряков в окне дизасма, а затем (если всё ок) - поставить оптимизацию на минимум (или вообще выключить) и проверить работу бряков в окне исходного кода.

PS: И ULink я бы заменил на что-то более вменяемое...

В окне дизассембера бряки ставить удалось, а вот что в исходном коде - никак. Можете указать точнее где и как добавить отладочную информацию (сам какие то галки ставил но это не помогло).

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

6 hours ago, Палыч said:

Укажите место (файл, строку) в которое ставите брекпоинты. Обычно они недоступны в местах, которые были выкинуты из проекта из-за ненадобности. Например, в подпрограмме, которую некто не вызывает. или в присваивании переменной, которую никто не использует.

В цикле опроса кнопок в файле main.c  т.е никак не может пролетать мимо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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: Код написан совершенно безграмотно... :punish: Все ваши:

for (i=0;i<200000;i++){};

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, jcxz said:

Если например:

PORT_ReadInputDataBit(PORTC,PORT_Pin_10)

всегда возвращает !=0, то всю ветку true для:

if (PORT_ReadInputDataBit(PORTC,PORT_Pin_10) == 0)

компилятор имеет право выбросить, а любые попытки установки бряков внутри ветки true будет игнорировать.

 

PS: Код написан совершенно безграмотно... :punish: Все ваши:

for (i=0;i<200000;i++){};

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

Код компилится и работает успешно, это видно по тому факту что на нажатие кнопок есть реакция. И ничего компилятор не выбрасывает for (i=0;i<200000;i++){}; стандартный способ программной задержки, да и откуда компилятору знать, что будет на входе порта PORTC?

Р.S: Код не мой а тестовая программа для отладочной платы от Миландра.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

В цикле опроса кнопок в файле main.c  т.е никак не может пролетать мимо.

Обратите внимание на цвет фона левее номера строки в режиме отладки: светлый - строки выброшены из-за несущественности и поставить точку останова на эти строки не получится.

2.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, DevDes сказал:

И ничего компилятор не выбрасывает for (i=0;i<200000;i++){}; стандартный способ программной задержки

Советую вам подучить матчасть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Палыч said:

Обратите внимание на цвет фона левее номера строки в режиме отладки: светлый - строки выброшены из-за несущественности и поставить точку останова на эти строки не получится.

2.png

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

1 hour ago, jcxz said:

Советую вам подучить матчасть.

Цикл for(i=0;i<N;i++){} это синтаксический сахар к int i = 0; while(i<N){i++;} Т.е выполняется N раз увеличение переменной i на 1 плюс сравнение с лимитом (даже если "тело" цикла пусто), и это не может быть просто выброшено. Ну и конечно это занимает время у процессора и потому является программной задержкой. Почему вы считаете что компилятор будет это "выбрасывать"?

Изменено пользователем DevDes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, DevDes сказал:

Т.е выполняется N раз увеличение переменной i на 1 плюс сравнение с лимитом (даже если "тело" цикла пусто), и это не может быть просто выброшено.

может. Любая операция не дающая результата может (и должна) быть выброшена.

13 минут назад, DevDes сказал:

Почему вы считаете что компилятор будет это "выбрасывать"?

Потому что i - без volatile.

PS: Ещё раз - учите матчасть (язык си)!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, DevDes сказал:

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

На рисунке выше -  Ваша программа. Как видно, на примерно 50℅ строк нельзя поставить точку останова из-за того, что этим строкам в полученном исполняемом коде не соответствует ни одна команда.

Насчёт пустого цикла...

В данном случае - оптимизация выключена и цикл с пустыл телом тупо транслируется в соответствующие команды МК. Однако, при включëнной оптимизации на это расчитывать не стоит. Цикл может быть заменён эквивалентом i= N; или даже выброшен совсем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, DevDes said:

Почему вы считаете что компилятор будет это "выбрасывать"?

Подтверждаю. Компилятор этот цикл имеет полное право удалить из исполняемого кода. Т.к. с точки зрения компилятора такой цикл не имеет смысла. Это для Вас, как для программиста, он занимает процессорное время, а следовательно является эрзац-задержкой. Почему эрзац? Да потому, что на архитектуре ARM команды могут выполняться за различное количество циклов по вине конвейера. И правильнее использовать аппаратный таймер в этом случае. Хотя, если нужна задержка "плюс/минус калач", то можно и в цикле. Но сам компилятор ничего не знает об аппаратном обеспечении кроме системы команд. Компилятору неведомы "задержки", "порты ввода/вывода", переходные процессы электрических сигналов и т.д. и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Короче  точки останова не ставятся независимо от подстветки, точнее в режиме отладки все подсвечено серым. Установка точек возможна только в окне дизассемблера. Задержки в циклах никуда не выбрасываются, это видно по частоте мигания светодиодов, да компиляторы могут оптимизировать, но так сказать не тот случай ( нет  у меня оптимизации такой).  При выборе на отладочной плате с помощью кнопок какого - либо теста отвал связи... Короче говоря вероятно это какие-то аппаратные недоработки от Миландра, или мой девайс пак с гитхаба неподходит (в режиме отладки нет возможности посмотреть регистры переферии). Пак от миландра для данной версии МК на сайте Миландра сейчас отсутствует. 

Еще раз напомню код не мой, а от Миландра.

 

Тема закрыта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...