Сергей Борщ 143 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба вроде работает но как то странно halt происходит на одном и том же месте подозрительноНадо бы подключить gdb и посмотреть. Может это Idle task из одного пустого цикла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
сарматъ 0 2 октября, 2013 Опубликовано 2 октября, 2013 (изменено) · Жалоба да я завтра на вторую платку просто со светодиодами попробую там помню старая версия openocd там точно разные адреса выдавала а тут я посмотрел память сохраняет переменные нормально да адреса остановки меняются > 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, потом можно уже подключаться эклипсом и он в этом случае может производить отладку... 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 : : : ); в общем поставил в обработчик исключения такой код, сижу жду когда зависнет Изменено 3 октября, 2013 пользователем сарматъ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
сарматъ 0 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба почти неделю работает без зависаний возможно что причина была в маленьких задержках при чтении флеш было заменено FLASH_ACR_LATENCY_5WS на FLASH_ACR_LATENCY_6WS, частота 168, напряжение питания 2,85 по мануалу не очень понимаю какую задержку надо ставить для этого случая, чисто формально 5вс, но вроде как мои условия - почти граничные для этой задержки, возможно чуть поползло напряжение и куку из флеша читается шлак при попытке ухода в обработчик исключения ошибки то же, как результат блокировка контроллера, хотя повторю это только гипотеза, но в связи с нею вопросы: 1. перемещение векторов прерывания и обработчиков исключений ошибок в озу стабильность системы увеличится? 2. кто либо пытался восстанавливать работоспособность системы из обработчиков исключений ошибок кроме как полным сбросом системы? если восстанавливали поделитесь пожалуйста опытом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба 2. кто либо пытался восстанавливать работоспособность системы из обработчиков исключений ошибок кроме как полным сбросом системы? если восстанавливали поделитесь пожалуйста опытом По-моему, в режиме Debug исключительные ситуации нужны для отлова багов, в режиме Release - для перезагрузки системы. Чисто формально я делал один раз эмулятор непрерывной батарееной памяти с использванием MPU. Т.е. создал некий регион памяти (якобы сужествующей), при доступе к которой возникало исключение. Анализируя причины усключения (вплоть до ASM-команд), подменял данными из невыровненной батареечной памяти. Потом отказался от этой затеи. В этом случае я был готов к исключительной ситуации и ждал ее, знал причины возникновения исключения. В работающей системе восстановить сбой по-моему не реально (выше я описал вроде бы тривиальный механизм, но даже его обработка вызывает много вопросов) - главное побыстрее все важное сохранить, все силовое правильно отключить - и бегом в перезагрузку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба возможно что причина была в маленьких задержках при чтении флеш было заменено FLASH_ACR_LATENCY_5WS на FLASH_ACR_LATENCY_6WS, частота 168, напряжение питания 2,85 по мануалу не очень понимаю какую задержку надо ставить для этого случая, чисто формально 5вс, но вроде как мои условия - почти граничные для этой задержки, возможно чуть поползло напряжение и куку из флеша читается шлак при попытке ухода в обработчик исключения ошибки то же, как результат блокировка контроллера, хотя повторю это только гипотеза, но в связи с нею вопросы: Из личного опыта, при тех же 3.3В 168Мгц процессор успешно работает на 3WS, на неделю, конечно, не оставлял, но несколько часов - вполне держит. Так же все процессоры, которые пробовал - разгонялись до 250МГц при 7WS, отдельные экземпляры гнались и выше. Так что параметры задержек в доках даны с запасом. Хотя помониторить питание, конечно, стоит. Если дело действительно в просадке питания, то не забываем, что в ОЗУ нужно располагать не только сами вектора, но и всю таблицу прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
сарматъ 0 11 октября, 2013 Опубликовано 11 октября, 2013 · Жалоба главное побыстрее все важное сохранить, все силовое правильно отключить - и бегом в перезагрузку. у вас я так понимаю должна быть большая статистика по отказам ваших изделий, поделитесь будьте любезны информацией изза чего возникают отказы по вашему мнению? какие типовые причины? если вы что то сохраняете то видимо память озу хранит актуальные неповрежденные данные? если вы корректно все отключаете то порты ввода вывода тоже работают? периферию надо ли перезагружать если она по видимому тоже функционирует? Из личного опыта, при тех же 3.3В 168Мгц процессор успешно работает на 3WS видимо все же это процесс веротяностный - за пару часов нормально работает за неделю вылетает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
сарматъ 0 18 октября, 2013 Опубликовано 18 октября, 2013 (изменено) · Жалоба платка опять повисла, точнее теперь уже ясно что плата не виснет и скорее всего задержки чтения флеш ни при чем - где то в алгоритмах причина, чуть позже переползу в соотв тему, тут пишу для того чтобы сказать 1 плата сама ни при чем она работает без зависаний, исключения ошибок не генерируются 2 метод подключения к плате отладчиком на лету предложенный Сергеем Борщем крайне полезен всем рекомендую спасибо всем принявшим участие в обсуждении Изменено 18 октября, 2013 пользователем сарматъ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 18 октября, 2013 Опубликовано 18 октября, 2013 · Жалоба 2 метод подключения к плате отладчиком на летуКстати, патч hla_target.c из сообщения №58 уже внесен в исходники openocd. Первый пока не собрался послать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 18 октября, 2013 Опубликовано 18 октября, 2013 · Жалоба 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 стоит вспомнить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 18 октября, 2013 Опубликовано 18 октября, 2013 · Жалоба 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 тоже не нужны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ig_z 0 18 октября, 2013 Опубликовано 18 октября, 2013 · Жалоба Я использую такой обработчик Hard_Fault_Handler для вывода в уарт. 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) } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 18 октября, 2013 Опубликовано 18 октября, 2013 · Жалоба ИМХО у вас ошибка (поля структуры в обратном порядке перечислены и не хватает PC):Пожалуй, насчет порядка я действительно ошибся. Причем сначала ошибся, потом начал исправлять (PSR и LR успел поменять) и меня, вероятно, отвелекли. PC в данном случае есть адрес, где произошло исключение, т.е я его обозвал Return_address. R12 я, действительно, забыл. Или на нем меня отвлекли и я Ctrl-x сделал, а Ctrl-v не успел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться