LightElf (10.08.2019 14:28 - 14:31, просмотров: 452) ответил 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.
Дальше развиваем по вкусу.
Не надо делать мне как лучше, оставьте мне как хорошо