сарматъ
Sep 10 2013, 11:28
добрый день собственно макетка зависает раз в неделю да так что кнопочка ресет не помогает, как думаете в чем может быть проблема?
С такой постановкой вопроса ждите экстрасенсов. В сентябре как раз должны выйти из отпуска. =)
сарматъ
Sep 10 2013, 12:46
что, зависания такие что ресетом не поднять - обычное дело для этой платки, что без экстрасенсов никак?
kolobok0
Sep 10 2013, 13:49
Цитата(сарматъ @ Sep 10 2013, 15:28)

..собственно макетка зависает раз в неделю..
если не понятна проблема - то возможно для начала сделайте так чтоб всё работало = найдите самый простой код(какое нить мигание светодиодиками), загрузите и оставте на столе на указанный вами срок. если виснет - смотрите железо. если не виснет - смотрите предыдущий софт...
я не телепат, если что
сарматъ
Sep 10 2013, 13:55
да видимо придется вторую макетку собирать чтоб ее поставить - одна нужна для продолжения работы над прошивкой, думал кто то сталкивался с подобным, ресет же должен контроллер оживлять то по любому?
adnega
Sep 10 2013, 14:05
Цитата(сарматъ @ Sep 10 2013, 17:55)

да видимо придется вторую макетку собирать чтоб ее поставить - одна нужна для продолжения работы над прошивкой, думал кто то сталкивался с подобным, ресет же должен контроллер оживлять то по любому?
А как Вы его сейчас оживляете? Передергиванием питания?
сарматъ
Sep 10 2013, 14:11
да снимаю питание и подключаю заново
adnega
Sep 10 2013, 14:25
Цитата(сарматъ @ Sep 10 2013, 18:11)

да снимаю питание и подключаю заново
"Раз в неделю" - это насколько точно и повторяемо? Ровно через 600 тыс. секунд?
После передергивания питания стартует сразу?
Перемычки на заводской плате трогали (reset, xtal)?
Что за программа, какими ресурсами оперирует?
сарматъ
Sep 10 2013, 14:45
относительно повторяемости два раза я откладывал разработку прошивки в сторону и занимался прочими вещами, оба раза дня через три-четыре платка висла
после передергивания аномалий старта не наблюдается
перемычки не трогал
программка - удп ответ по езернету типа пинга
пока грешу на встроенный программатор возможно он переводит микроконтроллер в режим отладки и останавливает его, когда так делаешь в отладчике контроллер тоже не реагирует на кнопку ресета, ну и надеялся что кто-то с таким уже сталкивался
да питание по юсби по которому произвожу отладку, оба раза просто выключал отладчик непередергивая питания оставляя платку в рабочем режиме
adnega
Sep 10 2013, 16:45
Цитата(сарматъ @ Sep 10 2013, 18:45)

относительно повторяемости два раза я откладывал разработку прошивки в сторону и занимался прочими вещами, оба раза дня через три-четыре платка висла
после передергивания аномалий старта не наблюдается
перемычки не трогал
программка - удп ответ по езернету типа пинга
пока грешу на встроенный программатор возможно он переводит микроконтроллер в режим отладки и останавливает его, когда так делаешь в отладчике контроллер тоже не реагирует на кнопку ресета, ну и надеялся что кто-то с таким уже сталкивался
да питание по юсби по которому произвожу отладку, оба раза просто выключал отладчик непередергивая питания оставляя платку в рабочем режиме
По самим STM32F407V вопросов никогда не было за исключением:
вроде... в ревизии А если неправильно "обойтись" с 99 (или 100) ножкой (вроде PDR), то плохо стартует при подаче питания, но начинает работать по RESETу.
Сама плата STM32F4-discovery сделана мягко говоря "не очень". Стабильно зависает если тронуть в районе U6 (ключ USB под кнопкой RESET).
Обратите внимание, что тактирование происходит от программатора-отладчика частотой 8МГц. Может, с отладчиком комп что-то делает (с недельным аптаймом),
что выходная частота сбивается и срабатывает CSS. Как вариант запаять кварц и снять перемычку (вроде R68).
AHTOXA
Sep 10 2013, 18:21
Цитата(сарматъ @ Sep 10 2013, 17:28)

добрый день собственно макетка зависает раз в неделю да так что кнопочка ресет не помогает, как думаете в чем может быть проблема?
А пока не зависнет, если нажать кнопку "резет" - нормально перезапускается?
Это я к тому, что какие-то регистры могут иметь различное значение при POR и резете кнопкой, и неаккуратно написанная процедура инициализации может нормально работать при включении, но виснуть при сбросе.
Но это рассуждение на тему "почему не срабатывает резет". Что касаемо причины зависания, то можно попробовать отключить набортный StLink, вдруг это он дурит. (Там две перемычки надо снять).
сарматъ
Sep 10 2013, 18:24
аднега, спасибо буду думать, посмотрел сейчас на платку там два кварца стоят
антоха, пока не зависнет ресет работает нормально, попробую отключить стлинк как соберу вторую макетку
KnightIgor
Sep 11 2013, 20:07
Цитата(сарматъ @ Sep 10 2013, 19:24)

аднега, спасибо буду думать, посмотрел сейчас на платку там два кварца стоят
антоха, пока не зависнет ресет работает нормально, попробую отключить стлинк как соберу вторую макетку
Может опять извечная тема с BOOT0 и BOOT1 ногами? Например, надломился SMD резистор, который BOOTx на куда-то там тянет. А чтобы исключить внешний кварц, запустите программу от HSI.
hd44780
Sep 12 2013, 08:07
Читал-читал, так и не нашёл, от чего питается плата? От USB программатора или от чего-то внешнего?
Если от программатора, то отключите плату от компа и запитайте от отдельного БП +5в. Заодно и проверите идею антохи про "набортный StLink, вдруг это он дурит".
сарматъ
Sep 12 2013, 09:42
"питание по юсби по которому произвожу отладку, оба раза просто выключал отладчик непередергивая питания оставляя платку в рабочем режиме"
"попробую отключить стлинк как соберу вторую макетку"
сарматъ
Sep 16 2013, 18:33
в очередной раз упал зверек, но поднялся от ресета, сейчас отключил стлинк и опять поставил теститься
а какие методики вообще существуют отлова программных причин таких падений? если скажем поставить в режиме отладки работать то отладчик отвалится через несколько часов работы...
Golikov A.
Sep 16 2013, 19:26
протоколирование только.
попадая в секцию кидает данные на порт - флэш или куда там.
потом смотрите лог, получив имя последней секции можно более детально начать уточнять вход - выход, середина, и так далее...
больше никак...
vlad_new
Sep 16 2013, 22:30
Цитата(сарматъ @ Sep 16 2013, 22:33)

в очередной раз упал зверек, но поднялся от ресета, сейчас отключил стлинк и опять поставил теститься
а какие методики вообще существуют отлова программных причин таких падений? если скажем поставить в режиме отладки работать то отладчик отвалится через несколько часов работы...
Ну хотя бы поставить включение светодиода на обработчик исключительных ситуаций. Это сразу определит програмная ли это ошибка или статика в раскоряку чип ставит.
Да, тут только лог.Лучше по юарт и очень простой, чтобы он сам не вносил изменений в работу.
сарматъ
Sep 17 2013, 04:41
Цитата(adnega @ Sep 10 2013, 20:45)

Обратите внимание, что тактирование происходит от программатора-отладчика частотой 8МГц. Может, с отладчиком комп что-то делает (с недельным аптаймом),
что выходная частота сбивается и срабатывает CSS. Как вариант запаять кварц и снять перемычку (вроде R68).
более внимательно платку рассмотрел, на ней и резистор r68(тактирование от стлинка) r25(тактирование от отдельного кварца) установлены одновременно... вроде взаимоисключающие вещи?
смело можно р68 удалить?
собственно удалил пока работает, а что такое css?
adnega
Sep 17 2013, 06:16
Цитата(сарматъ @ Sep 17 2013, 08:41)

а что такое css?
Модуль, который следит за исправностью HSE. Если будет сбой HSE,
то он (HSE) автоматически отключается и вызывается исключение NMI.
CSS включается битиком в соответствующем регистра.
Цитата
Clock security system (CSS)
The clock security system can be activated by software. In this case, the clock detector is
enabled after the HSE oscillator startup delay, and disabled when this oscillator is stopped.
If a failure is detected on the HSE clock, this oscillator is automatically disabled, a clock
failure event is sent to the break inputs of advanced-control timers TIM1 and TIM8, and an
interrupt is generated to inform the software about the failure (clock security system interrupt
CSSI), allowing the MCU to perform rescue operations. The CSSI is linked to the Cortex™-
M4F NMI (non-maskable interrupt) exception vector.
Note: When the CSS is enabled, if the HSE clock happens to fail, the CSS generates an interrupt,
which causes the automatic generation of an NMI. The NMI is executed indefinitely unless
the CSS interrupt pending bit is cleared. As a consequence, the application has to clear the
CSS interrupt in the NMI ISR by setting the CSSC bit in the Clock interrupt register
(RCC_CIR).
If the HSE oscillator is used directly or indirectly as the system clock (indirectly meaning that
it is directly used as PLL input clock, and that PLL clock is the system clock) and a failure is
detected, then the system clock switches to the HSI oscillator and the HSE oscillator is
disabled.
If the HSE oscillator clock was the clock source of PLL used as the system clock when the
failure occurred, PLL is also disabled. In this case, if the PLLI2S was enabled, it is also
disabled when the HSE fails.
сарматъ
Sep 18 2013, 11:30
пока платка тестится собрал вторую макетку подключил ее в тот же сегмент сети и начались новые чудеса
выставляю на новой макетке другой айпи и другой мак, запускаю и вижу что роутер начинает путать эти две макетки, во второй макетке дебаггером проверяю что он не отвечает на арп запросы для первой макетки, но роутер их путает - направляет все запросы либо к одному либо ко второму телу... если одно из тел отключить второе работат как положено , вместе трудиться не желают
кто либо сталкивался с таким?
adnega
Sep 18 2013, 12:06
Цитата(сарматъ @ Sep 18 2013, 15:30)

кто либо сталкивался с таким?
Только когда MAC-и одинаковые, если нет ошибок в софте.
сарматъ
Sep 18 2013, 12:29
да tcpdump говорит что они имеют одинаковый мак 32:00:00:00:00:00(((
что то я сломал у себя в проге буду разбираться
да, во время очередной переделки в код вкралась ошибка исправил, теперь две макетки живут совместно
Golikov A.
Sep 18 2013, 13:06
может быть еще путаница с кешем арп запросов.
а еще есть фигня что некоторые мак адреса - широковещательные, если случайно дать устройству мак адрес с признаком что он широковещательный, то будут такие чудеса в сети что - ужас. Это по моему старшие байты мак адреса определяют это.
сарматъ
Sep 18 2013, 13:08
широковещательный вроде только всеединички?
Golikov A.
Sep 18 2013, 13:11
нет там вроде 1 в старшем бите старшего байта, или 2 единицы. И так все остальные байты начинают определять какие то группы... как маска что ли или как то так...
сарматъ
Sep 24 2013, 08:49
а механизмом xFSR регистров кто нибудь пользовался при отладке?
mad_mouse
Sep 24 2013, 11:29
посмотрите переполнение каких либо переменных. если вы говорите что зависание периодические, то то скорее всего дело в этом.
сарматъ
Sep 24 2013, 18:28
все что ни делал не помогло все равно виснет, буду пытаться выводить xFSR через уарт, в связи с этим вопрос чем смотреть результат вывода? сейчас пытаюсь использовать миником, но не получается управлять положением курсора в миникоме
printf ("aaa\n"); приводит к тому что в миникоме такая картина
CODE
ааа
ааа
ааа
а
а
а
как в начало строки то курсор перевести будьте добры подскажите
adnega
Sep 24 2013, 19:07
Попробуйте printf ("aaa\r\n");
сарматъ
Sep 24 2013, 19:13
о, спасибо, заработало
а вы с xFSR не сталкивались?
пока поставил в обработчик исключения
printf ("AFSR %u CFSR %u DFSR %u HFSR %u MMFAR %u BFAR %u\r\n",SCB->AFSR,SCB->CFSR,SCB->DFSR,SCB->HFSR,SCB->MMFAR,SCB->BFAR);
если кто уточнит как правильно надо сделать буду благодарен
adnega
Sep 24 2013, 21:20
Цитата(сарматъ @ Sep 24 2013, 23:13)

если кто уточнит как правильно надо сделать буду благодарен
Джозефа Ю читали?
Недавно проскакивал тут на русском языке. Там есть кое-какие подробности.
сарматъ
Sep 24 2013, 21:26
да как раз оттуда эти регистры откопал
adnega
Sep 24 2013, 21:36
Цитата(сарматъ @ Sep 25 2013, 01:26)

да как раз оттуда эти регистры откопал
Там, вроде, написано, мол, не утяжеляйте обработчик исключительной ситуации.
А Вы printf...
Со стеком очень аккуратно - сначала нужно убедиться, что указатель исправный.
SVC нельзя использовать (или очень аккуратно).
Скорее всего, блокировка по причине разрушенного стека - я бы не надеялся, что CPU выйдет из HardFault.
сарматъ
Sep 25 2013, 05:46
мне хотя бы место и причину найти для начала
а стек изза чего разрушается обычно?
Golikov A.
Sep 25 2013, 05:51
думаю 95% случаев - переполнение.
остальное это обращение в локальные переменные через указатель и вылет за пределы переменной...
сарматъ
Sep 25 2013, 10:09
а ведь если стек рухнул printf работать не будет верно?
выходит в обработчике голый ассемблерный код должен быть безо всяких вызовов функций??
точнее если и си то без функций?
Golikov A.
Sep 25 2013, 10:19
принтф - это вообще жесткая функция, она же с декодировкой параметров, и прочей байдой...
голый ассемблер вам конечно не нужен, его компилятор сам сделает, а вот вызов каких-то больших функций и прочее лучше избежать
надо понимать что найденная ошибка стека не означает что он перестал работать физически, то есть переменные будут создаваться, и в пределах одной функции они будут работать корректно. ( ну за исключением очень редкой ситуации когда указатель стека попал точно на вашу функцию, но при работе из флэш это невозможно)
для того чтобы отправить данные по УАРТу вам всего навсего надо положить их в DR регистр нужной периферии, ну так и сделайте это без принтф
просто циклом ожидайте готовность регистра и пихайте данные. Пусть они идут бинарем а не текстом.
char *Pointer = (char *)&RegData;
UART->DR = *Pointer++;
чтобы на компьютере удобно было читать используйте COMTerminal, это один файлик terminal.exe, самый удобный ком порт терминал что я встречал, показывает и текст и бинарь...
сарматъ
Sep 25 2013, 10:40
да наверное переделаю на просто уарт
а кстати почему джозеф пишет что в си не получить значение указателя стека и нужен ассемблер?
разве этот указатель не хранится в R13?
Сергей Борщ
Sep 25 2013, 12:08
QUOTE (сарматъ @ Sep 25 2013, 12:40)

разве этот указатель не хранится в R13?
Как в си получить доступ к R13? И если бы это было возможно (например, регистры были бы отражены на память как в AVR), какой указатель был бы вычитан из R13 - PSP или MSP?
сарматъ
Sep 25 2013, 12:58
что то мне казалось что я видел обращение к регистрам как к памяти в чьем то коде то ли в антохином то ли в вашем, сейчас найти не получается
а PSP или MSP какая разница? главное чтоб из стека вытянуть адрес команды на которой произошла поломка
Golikov A.
Sep 25 2013, 13:31
в лпц есть макросы обращения к регистрам, думаю в СТМ тоже должны быть. Вроде там ассемблер спрятанный в дефайны...
ну чтобы понять на какой команде вам счетчик команд нужен, а не указатель стека тогда получается...
сарматъ
Sep 25 2013, 13:33
счетчик в стеке спрятан по адресу sp-24
а лпц это кто?
можете сюда эти макросы кинуть?
mdmitry
Sep 25 2013, 15:32
Цитата(сарматъ @ Sep 25 2013, 17:33)

а лпц это кто?
LPC микроконтроллеры ARM от NXP (
lpc).
Golikov A., возможно, имел ввиду файл
core_cmFunc.h из CMSIS от NXP.
Сергей Борщ
Sep 25 2013, 16:08
QUOTE (сарматъ @ Sep 25 2013, 14:58)

а PSP или MSP какая разница? главное чтоб из стека вытянуть адрес команды на которой произошла поломка
Угу. вот только для складывания на стек используется текущий на момент возникновения указатель, а внутри обработчика исключения используется (и на R13 отражен) MSP.
QUOTE (Golikov A. @ Sep 25 2013, 15:31)

Вроде там ассемблер спрятанный в дефайны...
Вот именно. На голом Си, без ассемблера - никак. О чем собственно и писал Джозеф.
сарматъ
Sep 25 2013, 16:36
ясно
то есть надо в самом начале обработчика сохранить на асемблере все регистры в какое нибудь укромное место памяти, а потом в цикле эту память слать по уарту?
Golikov A.
Sep 25 2013, 17:30
Цитата(mdmitry @ Sep 25 2013, 19:32)

LPC микроконтроллеры ARM от NXP (
lpc).
Golikov A., возможно, имел ввиду файл
core_cmFunc.h из CMSIS от NXP.
Да, думаю этот файл я и имел ввиду.
А еще помниться то-ли ИАР то-ли Кеил давал как-то к спец регистрам обращаться по спец зарезервированным словам, но может я путаю с другими процессорами.
Цитата(сарматъ @ Sep 25 2013, 20:36)

ясно
то есть надо в самом начале обработчика сохранить на асемблере все регистры в какое нибудь укромное место памяти, а потом в цикле эту память слать по уарту?
похоже на правду.
сарматъ
Sep 26 2013, 08:05
можно ли делать инлайн вставками вот так
CODE
void Default_Handler(void)
{
asm volatile (
"TST LR, #0x4;Test EXC_RETURN number in LR bit 2\n"
"ITTEE EQ;if zero (equal) then\n"
"MRSEQ R0, MSP;Main Stack was used, put MSP in R0\n"
"LDREQ R0,[R0,#24];Get stacked PC from stack.\n"
"MRSNE R0, PSP;else, Process Stack was used, put PSP in R0\n"
"LDRNE R0,[R0,#24];Get stacked PC from stack.\n"
или "asm volatile (" будет рассматриваться как вызов функции и запутает стек и обработчик Default_Handler(void) надо делать на чистом ассемблере?
Сергей Борщ
Sep 26 2013, 09:51
QUOTE (сарматъ @ Sep 26 2013, 10:05)

можно ли делать инлайн вставками вот так
Можно, не запутает. Но надо сказать компилятору, что вы используете R0 и объявить эту функцию как naked и noreturn, чтобы компилятор не вставил в начало код резервирования стека, сохранения адреса возврата и прочее. И уже из нее можно вызывать нормальную функцию собственно обработчика, в которой компилятор может выделять стек:
CODE
__attribute__((noreturn))
void handler();
__attribute__((noreturn, naked))
void Default_Handler(void)
{
asm volatile (
"TST LR, #0x4 \r\n" // Test EXC_RETURN number in LR bit 2"
"ITTEE EQ \r\n" // if zero (equal) then
"MRSEQ R0, MSP \r\n" // Main Stack was used, put MSP in R0
"LDREQ R0,[R0,#24] \r\n" // Get stacked PC from stack
"MRSNE R0, PSP \r\n" // else, Process Stack was used, put PSP in R0
"LDRNE R0,[R0,#24] \r\n" // Get stacked PC from stack
:
:
:"r0"
);
handler();
}
Кроме того, вы же захотите использовать полученное вами значение? Значит компилятору надо сообщить, в какой регистр вы его положили. Точнее, надо дать ему самому возможность выбрать подходящий регистр:
CODE
__attribute__((noreturn))
void handler(void * stack_frame);
__attribute__((noreturn, naked))
void Default_Handler(void)
{
void * Return_addr;
asm volatile (
"TST LR, #0x4 \r\n" // Test EXC_RETURN number in LR bit 2"
"ITE EQ \r\n" // if zero (equal) then
"MRSEQ %[Reg], MSP \r\n" // Main Stack was used, put MSP in R0
"MRSNE %[Reg], PSP \r\n" // else, Process Stack was used, put PSP in R0
"LDR %[Reg],[%[Reg],#24] \r\n" // Get stacked PC from stack
:[Reg]"=r"(Return_addr)
:
:
);
handler(Return_addr);
}
Также вы, вероятно, захотите узнать не только точку возникновения исключения, но и содержимое остальных сложенных на стек регистров. Значит, в обработчик удобнее передавать указатель на стековый кадр:
CODE
#include <stdint.h>
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;
__attribute__((noreturn))
void handler(stack_frame const *);
__attribute__((noreturn, naked))
void Default_Handler(void)
{
stack_frame const * pStack_frame;
asm volatile (
"TST LR, #0x4 \r\n" // Test EXC_RETURN number in LR bit 2"
"ITE EQ \r\n" // if zero (equal) then
"MRSEQ %[Reg], MSP \r\n" // Main Stack was used, put MSP in R0
"MRSNE %[Reg], PSP \r\n" // else, Process Stack was used, put PSP in R0
:[Reg]"=r"(pStack_frame)
:
:
);
handler(pStack_frame);
}
Как-то так (не уверен, что в последних двух примерах правильно написал IT-блок, проверьте)...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.