juvf 17 23 января, 2016 Опубликовано 23 января, 2016 · Жалоба часто валиться hf. иногда указывает LR и PC на одно и тоже место.... но иногда на 0х0. Как отловить HF с LR и PC равным нулю? [Hard fault handler] R0 = 0x20003d28 R1 = 0x20003db8 R2 = 0x20006230 R3 = 0x20006230 R12 = 0xa5a5a5a5 LR = 0x0 PC = 0x0 PSR = 0x4000000e Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 23 января, 2016 Опубликовано 23 января, 2016 (изменено) · Жалоба Что видно: - регистры R0..R3 указывают на память, довольно глубоко, туда, где либо стэк, либо куча лежать могут. - R12 содержит что-то похожее на ключ, например, доступа во флэш. Из опыта: - слеты часто проявляются при недостатке кучи или стэка. - если писать из программы во флэш, можно случайно записать в область, откуда как раз программа исполняется - слет гарантирован. Поэтому: - попробуйте увеличить кучу и/или стэк. Это верно как для самописной системы, так и для осей с локальными стеками задач. - если таки есть запись во флэш, проверить, куда запись идет. Изменено 23 января, 2016 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 51 23 января, 2016 Опубликовано 23 января, 2016 · Жалоба Поставте нормальный обработчик HF и посмотрите подробнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба Поставте нормальный обработчик HF и посмотрите подробнее.Что есть нормальный обработчик? Где его взять? Есть пример? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба Есть Fault регистры, по ним можно понять причину сбоя. В отладчике можно найти команду, на которой улетает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARMSTM 0 24 января, 2016 Опубликовано 24 января, 2016 · Жалоба Всем привет. У меня тоже самое на stm32f103zet6. На обыкновенной команде Line_Config для экрана летит в hardfault. Сегодня целый день мучился,думаю завтра получится, сообщу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба Что есть нормальный обработчик? Где его взять? Есть пример? Вот к примеру http://forum.easyelectronics.ru/viewtopic....p;view=previous Дальше его можно творчески расширить, чтобы он читал CFSR, HFSR и т.п. Но судя по вашему первоначальному посту, у вас уже что-то такое есть :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба Но судя по вашему первоначальному посту, у вас уже что-то такое есть :)Да, именно такой. Но х893 предлагает не такой, как у меня, а нормальный. Вот я и спрашиваю - что значит нормальный? Проблему решил. Есть связка.... во внешнюю периферию по SPI+DMA пишу данные.... в один момент в регистре дма с адресом памяти ОЗУ было не то значение. По DMA из SPI писалось куда-то не туда, происходил HF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 51 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба Например 1 2 3 и еще 100500 описаний хэндлера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
romas2010 1 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба часто валиться hf. иногда указывает LR и PC на одно и тоже место.... но иногда на 0х0. Как отловить HF с LR и PC равным нулю? [Hard fault handler] ....... LR = 0x0 PC = 0x0 PSR = 0x4000000e Здесь немного более сложный случай...очень вероятно,что исключение возникло в результате команды pop {Rx-Ry,pc} компилятор генерирует эту команду при возврате из подпрограммы,т.е return..в стеке на смешении "PC" почему-то оказался ноль..... попробуйте локализовать место так 1) объявляем глобальную переменную например int __pc; 2) в теле каждой написанной вами функции первым оператором делаем __pc=__current_pc(); 3) возникло исключение-во вкладе disassemble переходим на адрес,хранящейся в этой переменной __pc и по семантике узнаем,в теле какой функции произошло исключение ну и далее анализируем код..на вскидку-как можно реже пользуйтесь кейловскими(иаровскими) библиотечными функциями..как максимум-только malloc/free,все остальное заменяйте собственными реализациями Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Quasar 20 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба Еще топикстартеру надо сверить ревизии, а то мало ли, как в моем случае окажется... http://electronix.ru/forum/index.php?showt...=121871&hl= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба на вскидку-как можно реже пользуйтесь кейловскими(иаровскими) библиотечными функциями..как максимум-только malloc/free,все остальное заменяйте собственными реализациями это действительно обоснованный практикой совет или просто по-пугать? Честно интересуюсь, без стёба. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alechek 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба Видимо, речь идет про конкретный случай. Меня писать свой printf как-то не климатит... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба на вскидку-как можно реже пользуйтесь кейловскими(иаровскими) библиотечными функциями..как максимум-только malloc/free,все остальное заменяйте собственными реализациями Какой ужас. Рубрика "Вредные советы" :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба это действительно обоснованный практикой совет или просто по-пугать? Честно интересуюсь, без стёба. Да нет особого стёба. Я написал свой printf. Точнее просто сделал п/п вывода чисел различных. В том числе с плавучкой. Вы же должны понимать как стандартный работает. Там через список передаются параметры и шаблон вывода. Получается, что при обработке тратится значительное количество памяти на стеке. Но проблема, если честно, не в самом объёме а в том, что это достаточно сильно меняющееся число. Ну и когда у вас несколько задач используют printf, то при анализе размеров стека понимаешь, что его надо увеличивать. В зависимости от сложности выводимой информации, народ указывает размеры до 2к. Вот и получается, что использование printf в трёх задачах - 6к озу. Применение своих п/п вывода экономит эту память. В моём случае скорости особой не требовалось, так как это происходило при выводе на дисплей, принтер, ну и в HTTP задаче. Никто не призывает отказываться от стандартных п/п. Просто надо знать инструмент, который применяешь. В случае с printf, надо автоматически увеличивать объём стека ну и убедится что вы выделили его достаточно. В частности FreeRTOS это позволяет делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться