Юрий48 0 Thursday at 08:57 PM Posted Thursday at 08:57 PM (edited) · Report post Есть программа, с которой довольно много работал. В какой то момент стала зависать при определённых действиях с кнопочным интерфейсом. Собственно вопрос озвучен в заголовке. Edited Friday at 01:14 AM by haker_fox Для Keil есть свой раздел. Quote Share this post Link to post Share on other sites More sharing options...
HardEgor 30 Thursday at 09:28 PM Posted Thursday at 09:28 PM · Report post 26 минут назад, Юрий48 сказал: Есть программа, с которой довольно много работал. В какой то момент стала зависать при определённых действиях с кнопочным интерфейсом. Собственно вопрос озвучен в заголовке. Что подразумевается под словом "зависать"? Каких "определенных действиях"? И причем здесь Keil? Вы не знаете где там кнопка "пауза"? Quote Share this post Link to post Share on other sites More sharing options...
Юрий48 0 Thursday at 09:56 PM Posted Thursday at 09:56 PM · Report post В 26.05.2023 в 00:28, HardEgor сказал: Что подразумевается под словом "зависать"? Картинка на дисплее замирает, перестаёт реагировать на внешнии воздействия, но выходы от таймеров работают. В 26.05.2023 в 00:28, HardEgor сказал: Каких "определенных действиях"? Имеется куча настроек для пользователя, выбираемых кнопками. Зависание происходит при выборе определённой настройки. В 26.05.2023 в 00:28, HardEgor сказал: И причем здесь Keil? Вы не знаете где там кнопка "пауза"? Программирую с помощью Кейла. Где кнопка "Пауза" не знаю, как и то, что это за кнопка. Отсюда можно сделать вывод какой мой уровень познаний в Кейле. Поэтому то и вопрос о методике. С ситуацией зависания сталкиваюсь в первые. Quote Share this post Link to post Share on other sites More sharing options...
x893 6 Thursday at 09:59 PM Posted Thursday at 09:59 PM · Report post HALT Quote Share this post Link to post Share on other sites More sharing options...
Юрий48 0 Thursday at 10:11 PM Posted Thursday at 10:11 PM · Report post В 26.05.2023 в 00:59, x893 сказал: HALT А что это? Quote Share this post Link to post Share on other sites More sharing options...
V_G 8 Thursday at 10:12 PM Posted Thursday at 10:12 PM · Report post Кнопка - красненький кружок с крестиком, активизируется при пуске программы на выполнение. Еще можно в софте поставить точку остановки в том месте, где обрабатывается ваша секретная комбинация клавиш. Если программа остановится на этой точке, дальше по шагам до входа в "зависание" Quote Share this post Link to post Share on other sites More sharing options...
Юрий48 0 Thursday at 10:32 PM Posted Thursday at 10:32 PM · Report post В 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 */ } } С чем может быть это связано, ведь раньше такого не наблюдалось. Quote Share this post Link to post Share on other sites More sharing options...
HardEgor 30 Thursday at 11:12 PM Posted Thursday at 11:12 PM · Report post 32 минуты назад, Юрий48 сказал: С чем может быть это связано, ведь раньше такого не наблюдалось. Это неопределенная ошибка, либо переполнение буфера где-то, либо еще чего-то сломалось в программе. В сессии отладки можно посмотреть причины вызова, меню Peripherals, и там отдельное окно Hardfault Quote Share this post Link to post Share on other sites More sharing options...
V_G 8 Friday at 01:37 AM Posted Friday at 01:37 AM · Report post Часто это обращение к памяти по некорректному адресу. Например, функция требует 32-разрядного аргумента, а ей дают невыровненный по 32-битной границе адрес. Смотрите внимательно, если у вас 8-битные буферы (например у UART), а вы пытаетесь достать оттуда 32-битную переменную, и она неудачно попадает в левый адрес (а это для 8-битного буфера и 32-битной переменной случится в 3 случаях из 4). Если этого не избежать, лучше вместо прямого присваивания использовать memmove Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 11 Friday at 03:05 AM Posted Friday at 03:05 AM · Report post В Кубе есть фишка: обнаружив попадание в hard fault, в диагностике показывается вся доступная диагностическая информация. В принципе, это всё можно вычитать их регистров и стека. Думаю, в Кейле должно быть что-то подобное. Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 11 Friday at 03:29 AM Posted Friday at 03:29 AM · Report post Почитай тут. Quote Share this post Link to post Share on other sites More sharing options...
HardEgor 30 Friday at 05:09 AM Posted Friday at 05:09 AM · Report post 1 час назад, tonyk_av сказал: Почитай тут. Нет смысла. Автор даже не удосужился прочитать какую-нибудь статью как работает отладка Keil, а вы предлагаете ему сразу перескочить на более глубокий уровень... Quote Share this post Link to post Share on other sites More sharing options...
uriy 1 Friday at 06:24 AM Posted Friday at 06:24 AM · Report post Откройте окно call stack увидите откуда попали в hard fault https://www.keil.com/support/man/docs/uv4cl/uv4cl_db_dbg_callstack.htm Quote Share this post Link to post Share on other sites More sharing options...
x893 6 Friday at 06:36 AM Posted Friday at 06:36 AM · Report post 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 (там анализатор встроен). Quote Share this post Link to post Share on other sites More sharing options...
Юрий48 0 Friday at 12:28 PM Posted Friday at 12:28 PM · Report post Спасибо всем, выявить причину удалось без влезания в глубины. А зависание вызывает добавление в программу статической переменной (картинки) размером в 644 байта. Расклад по памяти получается такой "Program Size: Code=43816 RO-data=3524 RW-data=10164 ZI-data=10268". Камень STM32F103C8T6. Так понимаю, что в ОЗУ не влезаю. Картинок в интерфейсе много. Можно ли что то в этом случае предпринять? Quote Share this post Link to post Share on other sites More sharing options...