tonyk_av 45 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба Коллеги! Программа работала, но в какой-то момент перестала и постоянно вылетает в hard fault. Ассемблер для ARM не знаю, поэтому понять по скриншоту причину не могу. Не понимаю, почему исполнение обработчика прерывания уходит куда-то не туда. Растолкуйте, пожалуйста, и подскажите причины, по которым такое может происходить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба Это форум телепатов ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба Ассемблер не знаете, но мануал читать умеете? В мануале описаны регистры с информацией об HF. Прочитайте их. По ним часто можно определить и причину и место. А какое отношение имеют выложенные скриншоты к HF - вообще непонятно... ЗЫ: И вообще - в нормальном проекте должен быть встроен обработчик HF, дешифрующий инфу из тех регистров и выводящий в отладочный поток в удобной для разработчика форме. Это Вам для справки.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба 14 minutes ago, jcxz said: В мануале описаны регистры с информацией об HF Ессно, прочитал. Не понимаю, почему HF происходит при переключении задачи. Есть идеи? 15 minutes ago, jcxz said: По ним часто можно определить и причину и место В этот раз место и причина не определяются. 15 minutes ago, jcxz said: в нормальном проекте должен быть встроен обработчик HF, дешифрующий инфу из тех регистров и выводящий Смысла в нём не вижу. Он покажет то же самое, что и Куб: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sverchok 1 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба У меня обычно такое происходит, когда портится стек задачи. 1. Попробуйте включить проверку на переполнение стека в FreeRTOS, если еще не включили. Данный способ работает, но не всегда. 2. Увеличите размер стека всех задач. Если заработает, но методом исключения ищите, ту которая все портит. 3. Если где-то в коде есть обработка больших массивов, следует внимательно посмотреть не выходят ли они за границы раздела. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 18 октября, 2022 Опубликовано 18 октября, 2022 (изменено) · Жалоба 30 minutes ago, Sverchok said: У меня обычно такое происходит, когда портится стек задачи. 320К ОЗУ позволяют тупо включить большие размеры стэка и хипов, чем я грязно воспользовался. 1. Проверку стэка не включил, тупо воткнул 160К. Хотя есть есть смысл включить, видимо. Можно ссылку на шпаргалку как это сделать, если есть под рукой? Я в Кубе пока ни разу такого не делал, хотя там есть встроенные инструменты для мониторинга FreeRTOS. 2. Стэки задач увеличил до неприличия. Задачу, которая спотыкается на portYEILD() нашёл, остальные выключил. Всё равно падает. 3. А вот массивы есть. Щас прогуляюсь за молоком для кофе и ещё раз буду перепроверять. Изменено 18 октября, 2022 пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба 1 час назад, tonyk_av сказал: Ессно, прочитал. Не понимаю, почему HF происходит при переключении задачи. Есть идеи? Если асм изучать не хотите, вникать в регистры описывающие HF - тоже, а надеетесь только на мурзилки типа всяких кубов, то остаётся только гадать и пинать колёса. Телепатов тут нет - искать баги удалённо в вашем коде. Увеличиение стеков, включение их проверок - это пинание колёс наугад.... А если бы открыли мануал, узнали бы что "INVSTATE" это "Attempting to use an instruction set other than the Thumb instruction set or returns to a non load/store-multiple instruction with ICI continuation" и "When this bit is set to 1, the PC value stacked for the exception return points to the instruction that attempted the illegal use of the EPSR". А дальше остаётся только найти адрес.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба Я такое ловил во FreeRTOS, и не раз тут писал - проверьте установку приоритетов прерываний. Что-то типа такого в начало main: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба 3 minutes ago, jcxz said: не хотите, вникать в регистры описывающие HF - тож Я этого не говорил, не надо придумывать. 3 minutes ago, jcxz said: надеетесь только на мурзилки типа всяких кубов Раньше у меня было написано вытаскивание состояние процессора в HardFault_Handler() для поиска точки сбоя, то сейчас не делаю этого, потому что Куб показывает то же самое. 5 minutes ago, jcxz said: "INVSTATE" это "Attempting to use an instruction set other than the Thumb instruction set or returns to a non load/store-multiple instruction with ICI continuation" и "When this bit is set to 1, the PC value stacked for the exception return points to the instruction that attempted the illegal use of the EPSR". А дальше остаётся только найти адрес.... А вот это дело. Щас поковыряю в эту сторону. 3 minutes ago, adnega said: Что-то типа такого в начало main: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); Есть такое. Сама FreeRTOS, вроде, такое даже вызывает. 12 minutes ago, jcxz said: "INVSTATE" это "Attempting to use an instruction set other than the Thumb instruction set or returns to a non load/store-multiple instruction with ICI continuation" и "When this bit is set to 1, the PC value stacked for the exception return points to the instruction that attempted the illegal use of the EPSR". А дальше остаётся только найти адрес.... Кстати, читал это на сайте STM. Вот место сбоя: Мне пока не понятно, что из этого я могу извлечь для поиска ошибки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба 57 минут назад, tonyk_av сказал: 2. Стэки задач увеличил до неприличия. Задачу, которая спотыкается на portYEILD() нашёл, остальные выключил. Всё равно падает. Порча стеков задач может происходить не только из-за их переполнения, но и например потому, что другая задача или ISR туда что-то записала. Т.е. - баг находится совсем не в том месте, где происходит fault. Потому всякие "проверки стеков в ОС" и их увеличения хоть до гигабайтов - малопользительны. В таких случаях может помочь например MPU: разрешать доступ к стеку конкретной задачи (или вообще - ко всем локальным переменным задачи) только из контекста задачи, а при вытеснении задачи - блокировать доступ к стеку через MPU. Ну или - искать методом исключения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 18 октября, 2022 Опубликовано 18 октября, 2022 · Жалоба В 18.10.2022 в 20:48, tonyk_av сказал: Есть такое. Сама FreeRTOS, вроде, такое даже вызывает. Во FreeRTOS не нашел такого вызова. Можете показать? В F767 в HAL_Init() есть HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4), который все размотает в __NVIC_SetPriorityGrouping(). Поэтому с именами у меня сомнения, которые можно развеять значением SCB->AIRCR перед местом фейла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 19 октября, 2022 Опубликовано 19 октября, 2022 · Жалоба 9 hours ago, adnega said: Во FreeRTOS не нашел такого вызова. Можете показать? Не смогу. Раньше, помниться, был макрос, а сейчас нет. Поэтому я сам это всё настраиваю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 19 октября, 2022 Опубликовано 19 октября, 2022 (изменено) · Жалоба После выгребания ошибок получился такой результат. Есть две пары таймеров ведущий-ведомый в виде TIM3-TIM2 и TIM4-TIM5. Первая пара работает как ожидается, а вот вторая ведёт не понятным мне образом. Запускаю пару TIM4-TIM5. Жду изменения состояния поля stat, которое должно измениться в обработчике прерывания TIM5. Есть запрос у TIM5 от CCR1 которое разрешено у таймера и, теоретически в NVIC вызовом NVIC_EnableIRQ(). Но вызова прерывания от TIM5 не происходит. Пока делаю в отладчике шаг (F11 в Кубе), то кручусь в цикле while(), но стоит снять точку останова 1 и запустить выполнение (F5 в Кубе), то вместо точки 2 получаю hard fault. Есть идеи куда рыть? Изменено 19 октября, 2022 пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 19 октября, 2022 Опубликовано 19 октября, 2022 · Жалоба Нашёл ошибку. Таблица векторов была с ошибкой, поэтому при возникновении прерывания от TIM5 происходил переход на адрес 0. Занавес. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться