Easyelectronics.ru

Электроника для всех
Текущее время: 21 июл 2018, 04:57

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 10:06 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 532
Столкнулся со следующей проблемой: При отладке непонятно как найти место зависания в main(), т.к. прерывания постоянно молотят. Потыкался в Call Stack, там всё "not in scope". Можно конечно отключить прерывания, или смотреть по регистрам и стеку в памяти. Но хотелось бы найти более быстрый способ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 10:17 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 733
Откуда: Украина, Харьков
Оптимизация -O0 выключена?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 11:05 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 532
Спасибо, стало намного лучше. Много об этом раньше слышал, но что-то сам не додумался.
Теперь в call stack все намного лучше, и могу перейти на код Show caller/callee code.
Но Main() там видно, только процедуры обработчиков прерываний.

Раньше на ADSP я просто смотрел место в памяти где был PC stack (program counter stack). Можно было сделать прерывание, которое раз в секунду посылало содержимое стека по COM-порту, если плата была без выводов jtag. Тут вроде бы отладчик намного удобнее, но содержимое call stack в виде списка адресов найти не смог. Хотелось бы увидеть что-то типа такого:
адрес_1 - где-то в main, где возникло прерывание и произошел push в pc stack (адрес, с которого продолжится выполнение после выхода из прерывания)
адрес_2 - адрес в прерывании, где произошло вложенное прерывание и произошел push в pc stack


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 11:38 
Старожил

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 373
Откуда: Санкт-Петербург
если честно я не совсем понял вопроса.
1. какое именно прерывание происходит ?
2. что происходит если пошагово идти с начала main ?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 11:54 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 532
1. Прерывания предположительно все работают правильно, т.к. после зависания продолжает правильно заполняться память (прерывания от LAN и внешнего АЦП).

2. После точки останова я делал пошаговое выполнение. После выхода из прерывания попадаю в новое прерывание, от другой периферии. Я так понимаю это из-за ножек EXTI, пока я пошагово пытаюсь выйти из одного прерывания, внешняя микросхема взводит другое прерывание. Посмотрел адрес по адресу R13(SP) и адрес из R14, но там не то, нужно выйти на самый верхний уровень, откуда всё это началось.

Сначала MAIN пошагово не хожу, т.к. проект работает после запуска. Я отлавливаю глюк: при перевтыкании LAN прибор перестаёт откликаться по USART. А проверка буфера USART у меня происходит в MAIN. В приемном буфере накапливаются команды, это видно в памяти. Т.е. все прерывания, DMA и прочее продолжают нормально функционировать.

Короче, я понял как укоротить вопрос: как посмотреть самый первый адрес Program Counter, который был push-ом задвинут в стек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 13:16 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 532
Долго и упорно выполнял в пошаговом режиме. Нашел другую проблему:
в пошаговом режиме зависший код из main() начинает работать. А при выполнение в MAIN не заходит.
Код:
while (1)
{
   ch=0x77;
   comSend(&ch,1);
   HAL_Delay(1000);
}


1. После запуска устройства все работает, в терминале вижу раз в секунду приходит байт 0x77.
2. Вызываю глюк. Для этого перевтыкаю LAN, либо делаю остановку в Debug-е и опять запускаю выполнение После этого в терминал перестает приходить байт 0x77.
3. Если остановить в Debug и делать пошаговое выполнение, попадаю в MAIN и в терминал отсылается 0x77. Если из пошагового выполнения продолжить выполнение без остановок, в MAIN уже не заходит.

Как так получается, что в main() попадаю только при пошаговом выполнении?
Буду искать дальше. Планирую без дебака задействовать GPIO и смотреть на временные диаграммы входа-выхода из прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 13:37 
Старожил

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 373
Откуда: Санкт-Петербург
я хоть с HAL мало знаком, но что-то мне кажется косяк в HAL_Delay(1000);
попробуй убрать эту задержку и сделать ее временно хотя бы на цикле для тестов.

P.S. в некоторых прерываниях флаги нужно вручную сбрасывать чтобы они не вызывались повторно. хотя врят ли в этом твоя проблема


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 13:56 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4586
Гм. Что показывает индикатор загрузки процессора? Случаем, не 100%?
Симптомы очень похожи на то, что какое-то прерывание обрабатывается постоянно и вытесняет main (который является фоновым процессом) - ему просто не дают время.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания мешают отладке (keil + stm32f0).
СообщениеДобавлено: 28 дек 2017, 15:36 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 532
Действительно, нашел прерывание которое всё забивает. При тормозах от LAN происходят проблемы у SPI, вызывается callback на overrun, который вроде бы обнуляет overrun и выключает прерывание spi RXNE, но оно не выключилось и видимо overrun не стерся. Ищу ошибку.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB