ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
939469 Топик полностью
LightElf (10.08.2019 14:28 - 14:31, просмотров: 411) ответил Make_Pic на Началось все с того, что поставили в надежность на испытания, там и заметили сброс по WDT, потом его отключили для поиска петли. Выяснилось, что "на столе" виснет, но значительно реже. Вроде бы аппаратная природа зависона, но дальнейшее
Ну тады надо начать с того, что именно у вас прописано в вектора исключений и в неиспользуемые вектора прерываний. Туда часто впихивают что-то типа   void default_isr(void) { for (;;); } Вот туда программа влетает и крутится до срабатывания WDT. Что, в общем, в плане поиска проблемы нисколечко не помогает. Подобный вариант заметно лучше: #pragma pack(push,1) // кадр стека, создаваемый исключением typedef struct fault_frame_s { uint32_t stacked_R0; uint32_t stacked_R1; uint32_t stacked_R2; uint32_t stacked_R3; uint32_t stacked_R12; uint32_t stacked_LR; uint32_t stacked_PC; uint32_t stacked_xPSR; } fault_frame_t; #pragma pack(pop) // кадр исключения (для отладки) __no_init __root fault_frame_t fault_frame; __no_init __root uint32_t fault_icsr; __no_init __root uint32_t fault_flag; void default_isr(void) { if (__get_CONTROL() & 2) { memcpy(&fault_frame, __get_PSP(), sizeof(fault_frame)); } else { memcpy(&fault_frame, __get_MSP(), sizeof(fault_frame)); } fault_icsr = SCB->ICSR; fault_flag = 0xdeadbeaf; __DSB(); SCB->AIRCR = 0x05FA0004; while(1) { } } При старте проверяем fault_flag на предмет магического значения. Если присутствует - сохраняем во флеше fault_frame и fault_icsr. Обнуляем fault_flag. Дальше развиваем по вкусу.
Не надо делать мне как лучше, оставьте просто хорошо