Jump to content
    

Методика поиска в Keil_e проблемы зависания процессора

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

Edited by haker_fox
Для Keil есть свой раздел.

Share this post


Link to post
Share on other sites

26 минут назад, Юрий48 сказал:

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

Что подразумевается под словом "зависать"?

Каких "определенных действиях"?

И причем здесь Keil? Вы не знаете где там кнопка "пауза"?

Share this post


Link to post
Share on other sites

В 26.05.2023 в 00:28, HardEgor сказал:

Что подразумевается под словом "зависать"?

Картинка на дисплее замирает, перестаёт реагировать на внешнии воздействия, но выходы от таймеров работают.

В 26.05.2023 в 00:28, HardEgor сказал:

Каких "определенных действиях"?

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

В 26.05.2023 в 00:28, HardEgor сказал:

И причем здесь Keil? Вы не знаете где там кнопка "пауза"?

Программирую с помощью Кейла. Где кнопка "Пауза" не знаю, как и то, что это за кнопка. Отсюда можно сделать вывод какой мой уровень познаний в Кейле. Поэтому то и вопрос о методике. С ситуацией зависания сталкиваюсь в первые.  

Share this post


Link to post
Share on other sites

Кнопка - красненький кружок с крестиком, активизируется при пуске программы на выполнение. Еще можно в софте поставить точку остановки в том месте, где обрабатывается ваша секретная комбинация клавиш. Если программа остановится на этой точке, дальше по шагам до входа в "зависание" 

Share this post


Link to post
Share on other sites

В 26.05.2023 в 01:12, V_G сказал:

Еще можно в софте поставить точку остановки в том месте, где обрабатывается ваша секретная комбинация клавиш. Если программа остановится на этой точке, дальше по шагам до входа в "зависание"

С этого и начал, но без результатно. А по поводу кнопки STOP (как понимаю в интерпретации x893 это кнопка HALT), тут ну такой мой тормоз, что и глаза поднимать стыдно. В результате получается, что программа останавливается на

/**
  * @brief This function handles Hard fault interrupt.
  */
void HardFault_Handler(void)
{
  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_HardFault_IRQn 0 */
    /* USER CODE END W1_HardFault_IRQn 0 */
  }
}

С чем может быть это связано, ведь раньше такого не наблюдалось. 

Share this post


Link to post
Share on other sites

32 минуты назад, Юрий48 сказал:

С чем может быть это связано, ведь раньше такого не наблюдалось. 

Это неопределенная ошибка, либо переполнение буфера где-то, либо еще чего-то сломалось в программе.

В сессии отладки можно посмотреть причины вызова, меню Peripherals, и там отдельное окно Hardfault

Share this post


Link to post
Share on other sites

Часто это обращение к памяти по некорректному адресу. Например, функция требует 32-разрядного аргумента, а ей дают невыровненный по 32-битной границе адрес. Смотрите внимательно, если у вас 8-битные буферы (например у UART), а вы пытаетесь достать оттуда 32-битную переменную, и она неудачно попадает в левый адрес (а это для 8-битного буфера и 32-битной переменной случится в 3 случаях из 4). Если этого не избежать, лучше вместо прямого присваивания использовать memmove

Share this post


Link to post
Share on other sites

В Кубе есть фишка: обнаружив попадание в hard fault, в диагностике показывается вся доступная диагностическая информация. В принципе, это всё можно вычитать их регистров и стека. Думаю, в Кейле должно быть что-то подобное.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

10 minutes ago, uriy said:

Откройте окно call stack увидите откуда попали в hard fault https://www.keil.com/support/man/docs/uv4cl/uv4cl_db_dbg_callstack.htm

 

hardfault немного по другому устроен. Но есть готовый код и конечно можно посмотреть.

А можно взять SES (там есть готовый шаблон) или даже замахнуться на Ozone (там анализатор встроен).

Share this post


Link to post
Share on other sites

Спасибо всем, выявить причину удалось без влезания в глубины. А зависание вызывает добавление в программу статической переменной (картинки) размером в 644 байта. Расклад по памяти получается такой "Program Size: Code=43816 RO-data=3524 RW-data=10164 ZI-data=10268". Камень STM32F103C8T6. Так понимаю, что в ОЗУ не влезаю. Картинок в интерфейсе много.  Можно ли что то в этом случае предпринять?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...