keton333 0 22 марта, 2023 Опубликовано 22 марта, 2023 · Жалоба Здравствуйте, я новичок в программировании, такая ситуация, когда захожу в отладчик программы в Keil программа сразу вылетает в hardfault, у меня вопрос может ли быть это из-за того что я обращаюсь к регистрам незатактированной периферии? Мк-stm32f103 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 24 22 марта, 2023 Опубликовано 22 марта, 2023 · Жалоба 40 minutes ago, keton333 said: у меня вопрос может ли быть это из-за того что я обращаюсь к регистрам незатактированной периферии? В целом нет "затактируйте" ее, чтобы убедиться наверняка )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 23 марта, 2023 Опубликовано 23 марта, 2023 · Жалоба 3 hours ago, keton333 said: у меня вопрос может ли быть это из-за того что я обращаюсь к регистрам незатактированной периферии На сайте ARM и в популярных книгах Джозефа Ю приводится достаточное количество информации, чтобы расшифровать причины вызова данного исключения. В книге даже примеры есть. Сама книга легко находится на просторах сети глобальной. А умение расшифровывать причины исключения hardfault Вам пригодится неоднократно, если планируете и далее программировать микроконтроллеры данной архитектуры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 23 марта, 2023 Опубликовано 23 марта, 2023 · Жалоба Если вылетает "сразу" - вполне возможно, что вы выбрали в среде разработки модель с бОльшим количеством памяти, чем есть в вашем контроллере. Поэтому компилятор разместил стек в несуществующей памяти и первая же инструкция записи на стек приводит к исключению. Самый простой и быстрый (на мой взгляд) способ проверить это - вставить в программу вот такой обработчик исключения HardFault: void HardFault_Handler(void) { volatile int i = 0; while(!i) ; } Попав в него вы переводите отладчик в режим исполнения ассемблерных команд (не помню, как это делается в Кейле - возможно, надо открыть и сделать активным окно дизассемблера), через отладчик заносите в i любое не равное 0 значение и двигаясь по ассемблерным командам выходите из обработчика. Попадаете на следующую инструкцию после той, которая вызвала исключение. Смотрите на нее, смотрите на содержимое использованных в ней регистров, думаете, почему там появились именно эти значения и какими они должны быть для правильной работы. Если же вы попадаете куда-то за пределы памяти программ - тогда все несколько сложнее, можно и книги Ю читать или тупо несколько раз выполнить программу с самого начала по ассемблерным командам найдя ту, на которой происходит падение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться