Перейти к содержанию
    

stm32f4discovery виснет раз в неделю

вроде работает но как то странно halt происходит на одном и том же месте подозрительно
Надо бы подключить gdb и посмотреть. Может это Idle task из одного пустого цикла.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да я завтра на вторую платку просто со светодиодами попробую там помню старая версия 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
		:
		:
		:
		);

 

в общем поставил в обработчик исключения такой код, сижу жду когда зависнет

Изменено пользователем сарматъ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почти неделю работает без зависаний

 

возможно что причина была в маленьких задержках при чтении флеш было заменено FLASH_ACR_LATENCY_5WS на FLASH_ACR_LATENCY_6WS, частота 168, напряжение питания 2,85

 

по мануалу не очень понимаю какую задержку надо ставить для этого случая, чисто формально 5вс, но вроде как мои условия - почти граничные для этой задержки, возможно чуть поползло напряжение и куку из флеша читается шлак при попытке ухода в обработчик исключения ошибки то же, как результат блокировка контроллера, хотя повторю это только гипотеза, но в связи с нею вопросы:

 

1. перемещение векторов прерывания и обработчиков исключений ошибок в озу стабильность системы увеличится?

 

2. кто либо пытался восстанавливать работоспособность системы из обработчиков исключений ошибок кроме как полным сбросом системы? если восстанавливали поделитесь пожалуйста опытом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. кто либо пытался восстанавливать работоспособность системы из обработчиков исключений ошибок кроме как полным сбросом системы? если восстанавливали поделитесь пожалуйста опытом

По-моему, в режиме Debug исключительные ситуации нужны для отлова багов, в режиме Release - для перезагрузки системы.

Чисто формально я делал один раз эмулятор непрерывной батарееной памяти с использванием MPU.

Т.е. создал некий регион памяти (якобы сужествующей), при доступе к которой возникало исключение.

Анализируя причины усключения (вплоть до ASM-команд), подменял данными из невыровненной батареечной памяти.

Потом отказался от этой затеи.

В этом случае я был готов к исключительной ситуации и ждал ее, знал причины возникновения исключения.

В работающей системе восстановить сбой по-моему не реально (выше я описал вроде бы тривиальный механизм,

но даже его обработка вызывает много вопросов) - главное побыстрее все важное сохранить, все силовое правильно

отключить - и бегом в перезагрузку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

возможно что причина была в маленьких задержках при чтении флеш было заменено FLASH_ACR_LATENCY_5WS на FLASH_ACR_LATENCY_6WS, частота 168, напряжение питания 2,85

 

по мануалу не очень понимаю какую задержку надо ставить для этого случая, чисто формально 5вс, но вроде как мои условия - почти граничные для этой задержки, возможно чуть поползло напряжение и куку из флеша читается шлак при попытке ухода в обработчик исключения ошибки то же, как результат блокировка контроллера, хотя повторю это только гипотеза, но в связи с нею вопросы:

Из личного опыта, при тех же 3.3В 168Мгц процессор успешно работает на 3WS, на неделю, конечно, не оставлял, но несколько часов - вполне держит. Так же все процессоры, которые пробовал - разгонялись до 250МГц при 7WS, отдельные экземпляры гнались и выше. Так что параметры задержек в доках даны с запасом. Хотя помониторить питание, конечно, стоит.

 

Если дело действительно в просадке питания, то не забываем, что в ОЗУ нужно располагать не только сами вектора, но и всю таблицу прерываний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

главное побыстрее все важное сохранить, все силовое правильно

отключить - и бегом в перезагрузку.

 

у вас я так понимаю должна быть большая статистика по отказам ваших изделий, поделитесь будьте любезны информацией изза чего возникают отказы по вашему мнению? какие типовые причины? если вы что то сохраняете то видимо память озу хранит актуальные неповрежденные данные? если вы корректно все отключаете то порты ввода вывода тоже работают? периферию надо ли перезагружать если она по видимому тоже функционирует?

 

Из личного опыта, при тех же 3.3В 168Мгц процессор успешно работает на 3WS

видимо все же это процесс веротяностный - за пару часов нормально работает за неделю вылетает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

платка опять повисла, точнее теперь уже ясно что плата не виснет и скорее всего задержки чтения флеш ни при чем - где то в алгоритмах причина, чуть позже переползу в соотв тему, тут пишу для того чтобы сказать

 

1 плата сама ни при чем она работает без зависаний, исключения ошибок не генерируются

2 метод подключения к плате отладчиком на лету предложенный Сергеем Борщем крайне полезен всем рекомендую

 

спасибо всем принявшим участие в обсуждении

Изменено пользователем сарматъ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 метод подключения к плате отладчиком на лету
Кстати, патч hla_target.c из сообщения №58 уже внесен в исходники openocd. Первый пока не собрался послать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 стоит вспомнить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    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 тоже не нужны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я использую такой обработчик 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)
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО у вас ошибка (поля структуры в обратном порядке перечислены и не хватает PC):
Пожалуй, насчет порядка я действительно ошибся. Причем сначала ошибся, потом начал исправлять (PSR и LR успел поменять) и меня, вероятно, отвелекли. PC в данном случае есть адрес, где произошло исключение, т.е я его обозвал Return_address. R12 я, действительно, забыл. Или на нем меня отвлекли и я Ctrl-x сделал, а Ctrl-v не успел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...