Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2018, 14:59

Часовой пояс: 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
Сообщения: 507
Столкнулся со следующей проблемой: При отладке непонятно как найти место зависания в main(), т.к. прерывания постоянно молотят. Потыкался в Call Stack, там всё "not in scope". Можно конечно отключить прерывания, или смотреть по регистрам и стеку в памяти. Но хотелось бы найти более быстрый способ.


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

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


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

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 507
Спасибо, стало намного лучше. Много об этом раньше слышал, но что-то сам не додумался.
Теперь в 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
Сообщения: 312
Откуда: Санкт-Петербург
если честно я не совсем понял вопроса.
1. какое именно прерывание происходит ?
2. что происходит если пошагово идти с начала main ?

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


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

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 507
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
Сообщения: 507
Долго и упорно выполнял в пошаговом режиме. Нашел другую проблему:
в пошаговом режиме зависший код из 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
Сообщения: 312
Откуда: Санкт-Петербург
я хоть с HAL мало знаком, но что-то мне кажется косяк в HAL_Delay(1000);
попробуй убрать эту задержку и сделать ее временно хотя бы на цикле для тестов.

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


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

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


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

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


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

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


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

Сейчас этот форум просматривают: CheMax


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

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

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