|
stm32f4discovery виснет раз в неделю |
|
|
|
 |
Ответов
(60 - 71)
|
Oct 2 2013, 19:52
|
Частый гость
 
Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463

|
да я завтра на вторую платку просто со светодиодами попробую там помню старая версия openocd там точно разные адреса выдавала а тут я посмотрел память сохраняет переменные нормально да адреса остановки меняются CODE > halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x21000000 pc: 0x080004e0 msp: 0x2001bfd0 > resume > halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x21000000 pc: 0x080004e4 msp: 0x2001bfd0 > resume > halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x21000000 pc: 0x0800051c msp: 0x2001bfd0 > resume > halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x21000000 pc: 0x08000506 msp: 0x2001bfd0
Сергей, а когда эклипсом вы подсоединяетесь на лету, в эклипсе становится возможно устанавливать точки останова? у меня он подсоединяется но толку от него ноль он не может производить отладку - не может установить точки останова( о, получилось, чтоб нормально подцепиться к работающей плате надо вначале телнетом поключиться к openocd и дать команду halt, потом можно уже подключаться эклипсом и он в этом случае может производить отладку... CODE asm volatile ( "TST LR, #0x4 \n" // Test EXC_RETURN number in LR bit 2" "ITTEE EQ \n" // if zero (equal) then "MRSEQ R4, MSP \n" // Main Stack was used, put MSP in R0 "LDREQ R0,[R4,#24] \n" // Get stacked PC from stack "MRSNE R4, PSP \n" // else, Process Stack was used, put PSP in R0 "LDRNE R0,[R4,#24] \n" // Get stacked PC from stack "MRS R1, MSP \n" "MRS R2, PSP \n" "MOV R3, LR \n" "deadend1: \n" "B deadend1 \n"// ; Infinite loop : : : ); в общем поставил в обработчик исключения такой код, сижу жду когда зависнет
Сообщение отредактировал сарматъ - Oct 3 2013, 16:16
|
|
|
|
|
Oct 10 2013, 05:40
|
Частый гость
 
Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463

|
почти неделю работает без зависаний
возможно что причина была в маленьких задержках при чтении флеш было заменено FLASH_ACR_LATENCY_5WS на FLASH_ACR_LATENCY_6WS, частота 168, напряжение питания 2,85
по мануалу не очень понимаю какую задержку надо ставить для этого случая, чисто формально 5вс, но вроде как мои условия - почти граничные для этой задержки, возможно чуть поползло напряжение и куку из флеша читается шлак при попытке ухода в обработчик исключения ошибки то же, как результат блокировка контроллера, хотя повторю это только гипотеза, но в связи с нею вопросы:
1. перемещение векторов прерывания и обработчиков исключений ошибок в озу стабильность системы увеличится?
2. кто либо пытался восстанавливать работоспособность системы из обработчиков исключений ошибок кроме как полным сбросом системы? если восстанавливали поделитесь пожалуйста опытом
|
|
|
|
|
Oct 10 2013, 07:07
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(сарматъ @ Oct 10 2013, 09:40)  2. кто либо пытался восстанавливать работоспособность системы из обработчиков исключений ошибок кроме как полным сбросом системы? если восстанавливали поделитесь пожалуйста опытом По-моему, в режиме Debug исключительные ситуации нужны для отлова багов, в режиме Release - для перезагрузки системы. Чисто формально я делал один раз эмулятор непрерывной батарееной памяти с использванием MPU. Т.е. создал некий регион памяти (якобы сужествующей), при доступе к которой возникало исключение. Анализируя причины усключения (вплоть до ASM-команд), подменял данными из невыровненной батареечной памяти. Потом отказался от этой затеи. В этом случае я был готов к исключительной ситуации и ждал ее, знал причины возникновения исключения. В работающей системе восстановить сбой по-моему не реально (выше я описал вроде бы тривиальный механизм, но даже его обработка вызывает много вопросов) - главное побыстрее все важное сохранить, все силовое правильно отключить - и бегом в перезагрузку.
|
|
|
|
|
Oct 10 2013, 08:01
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797

|
Цитата(сарматъ @ Oct 10 2013, 09:40)  возможно что причина была в маленьких задержках при чтении флеш было заменено FLASH_ACR_LATENCY_5WS на FLASH_ACR_LATENCY_6WS, частота 168, напряжение питания 2,85
по мануалу не очень понимаю какую задержку надо ставить для этого случая, чисто формально 5вс, но вроде как мои условия - почти граничные для этой задержки, возможно чуть поползло напряжение и куку из флеша читается шлак при попытке ухода в обработчик исключения ошибки то же, как результат блокировка контроллера, хотя повторю это только гипотеза, но в связи с нею вопросы: Из личного опыта, при тех же 3.3В 168Мгц процессор успешно работает на 3WS, на неделю, конечно, не оставлял, но несколько часов - вполне держит. Так же все процессоры, которые пробовал - разгонялись до 250МГц при 7WS, отдельные экземпляры гнались и выше. Так что параметры задержек в доках даны с запасом. Хотя помониторить питание, конечно, стоит. Если дело действительно в просадке питания, то не забываем, что в ОЗУ нужно располагать не только сами вектора, но и всю таблицу прерываний.
|
|
|
|
|
Oct 11 2013, 05:09
|
Частый гость
 
Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463

|
Цитата(adnega @ Oct 10 2013, 11:07)  главное побыстрее все важное сохранить, все силовое правильно отключить - и бегом в перезагрузку. у вас я так понимаю должна быть большая статистика по отказам ваших изделий, поделитесь будьте любезны информацией изза чего возникают отказы по вашему мнению? какие типовые причины? если вы что то сохраняете то видимо память озу хранит актуальные неповрежденные данные? если вы корректно все отключаете то порты ввода вывода тоже работают? периферию надо ли перезагружать если она по видимому тоже функционирует? Цитата(Flexz @ Oct 10 2013, 12:01)  Из личного опыта, при тех же 3.3В 168Мгц процессор успешно работает на 3WS видимо все же это процесс веротяностный - за пару часов нормально работает за неделю вылетает
|
|
|
|
|
Oct 18 2013, 11:25
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Сергей Борщ @ Sep 26 2013, 13:51)  Код typedef struct { void const * LR; uint32_t PSR; void const * Return_address; uint32_t R3; uint32_t R2; uint32_t R1; uint32_t R0; } stack_frame; ИМХО у вас ошибка (поля структуры в обратном порядке перечислены и не хватает PC): http://infocenter.arm.com/help/index.jsp?t...a/Babefdjc.htmlОбратите внимание на подпись к рисунку: Decreasing memory addressУ меня так сделано, правда я ещё ни разу это не применял в бою. Код typedef struct { uint32_t r0; uint32_t r1; uint32_t r2; uint32_t r3; uint32_t r12; uint32_t lr; // LR (R14) uint32_t pc; uint32_t xpsr; } stack_frame_t; Ещё наверное про -mapcs-frame для gcc стоит вспомнить.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 18 2013, 12:32
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(сарматъ @ Oct 2 2013, 23:52)  Код asm volatile ( 1 "TST LR, #0x4 \n" // Test EXC_RETURN number in LR bit 2" 2 "ITTEE EQ \n" // if zero (equal) then 3 "MRSEQ R4, MSP \n" // Main Stack was used, put MSP in R0 4 "LDREQ R0,[R4,#24] \n" // Get stacked PC from stack 5 "MRSNE R4, PSP \n" // else, Process Stack was used, put PSP in R0 6 "LDRNE R0,[R4,#24] \n" // Get stacked PC from stack 7 "MRS R1, MSP \n" 8 "MRS R2, PSP \n" 9 "MOV R3, LR \n" 10 "deadend1: \n" 11 "B deadend1 \n"//; Infinite loop 12 : 13 : 14 : ); в общем поставил в обработчик исключения такой код, сижу жду когда зависнет Очень странный код: Cточки 4 и 6 можно заменить одной и вынести за условие. Строчки 7 и 8 не нужны т.к. в R4 и так будет либо MSP либо PSP. Строчки 10 и 11 можно заменит на "b ." Строчки 12-14 тоже не нужны.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 18 2013, 13:41
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Я использую такой обработчик Hard_Fault_Handler для вывода в уарт. CODE void Hard_Fault_Handler(uint32_t stacked_reg[]) { DBGS_STR("In HardFault_Handler:"); DBGS_MSG("SCB->HFSR = 0x%08X", SCB->HFSR);
if ((SCB->HFSR & (1 << 30)) != 0) { DBGS_STR(" Forced Hard Fault"); DBGS_MSG(" SCB->CFSR= 0x%08X", SCB->CFSR ); if((SCB->CFSR & 0xFFFF0000) != 0) { uint32_t CFSRValue = SCB->CFSR >> 16; // right shift to lsb DBGS_STR(" Usage fault:"); if((CFSRValue & (1 << 9)) != 0) { DBGS_STR(" Divide by zero"); } if((CFSRValue & (1 << 8)) != 0) { DBGS_STR(" Unaligned"); } if((CFSRValue & (1 << 3)) != 0) { DBGS_STR(" NOCP"); } if((CFSRValue & (1 << 2)) != 0) { DBGS_STR(" INVPC"); } if((CFSRValue & (1 << 1)) != 0) { DBGS_STR(" INVSTATE"); } if((CFSRValue & (1 << 0)) != 0) { DBGS_STR(" UNDEFINSTR"); } } }
DBGS_MSG("R0 = 0x%08X", stacked_reg[0]); DBGS_MSG("R1 = 0x%08X", stacked_reg[1]); DBGS_MSG("R2 = 0x%08X", stacked_reg[2]); DBGS_MSG("R3 = 0x%08X", stacked_reg[3]); DBGS_MSG("R12= 0x%08X", stacked_reg[4]); DBGS_MSG("LR = 0x%08X", stacked_reg[5]); DBGS_MSG("PC = 0x%08X", stacked_reg[6]); DBGS_MSG("PSR= 0x%08X", stacked_reg[7]);
for(;;) { UART0_Put(); } }
__asm void HardFault_Handler(void) { TST lr, #4 // Test for MSP or PSP ITE EQ MRSEQ r0, MSP MRSNE r0, PSP B __cpp(Hard_Fault_Handler) }
|
|
|
|
|
Oct 18 2013, 13:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (demiurg_spb @ Oct 18 2013, 14:25)  ИМХО у вас ошибка (поля структуры в обратном порядке перечислены и не хватает PC): Пожалуй, насчет порядка я действительно ошибся. Причем сначала ошибся, потом начал исправлять (PSR и LR успел поменять) и меня, вероятно, отвелекли. PC в данном случае есть адрес, где произошло исключение, т.е я его обозвал Return_address. R12 я, действительно, забыл. Или на нем меня отвлекли и я Ctrl-x сделал, а Ctrl-v не успел.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|