scifi 1 10 декабря, 2018 Опубликовано 10 декабря, 2018 · Жалоба 8 minutes ago, Johnny81 said: А сам UNDEFINSTR ничего полезного не несет? В книжке написано ... С учетом того, что этот код обычно работает нормально, остается причина 2. Т.е. проц неверно читает FLASH? Это не исчерпывающий список. Кстати, по поводу питания. На всякий случай проверьте ещё Vcap. Там должно быть 1,2 В, ЕМНИП, но раз уж ищем чудеса, всё возможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 10 декабря, 2018 Опубликовано 10 декабря, 2018 · Жалоба 1 minute ago, scifi said: Это не исчерпывающий список. Кстати, по поводу питания. На всякий случай проверьте ещё Vcap. Там должно быть 1,2 В, ЕМНИП, но раз уж ищем чудеса, всё возможно. А где есть более подробная инфа? В STM32F3xxx and STM32F4xxx Cortex-M4 programming manual вообще ничего не написано, а этот список я взял из The defnitive guide to the ARM Cortex-M3 Насчет питания и остального - поглядим, спасибо. Я со схемотехникой не особо дружу, этим отдельный народ занимается. Пока они заняты, пытаюсь исключить чисто программные косяки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 декабря, 2018 Опубликовано 10 декабря, 2018 · Жалоба 2 minutes ago, Johnny81 said: А где есть более подробная инфа? В STM32F3xxx and STM32F4xxx Cortex-M4 programming manual вообще ничего не написано, а этот список я взял из The defnitive guide to the ARM Cortex-M3 Тут следует полагаться на здравый смысл, наверное. Undefined Instruction - название говорит само за себя. Если процессор и память программ исправны, значит в памяти оказалась неправильная инструкция. Ну а если что-то неисправно, возможны любые чудеса. Причины неисправности могут быть самые разные: плохое питание, бракованный чип, мощные радиопомехи, космические лучи... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 10 декабря, 2018 Опубликовано 10 декабря, 2018 · Жалоба 6 минут назад, Johnny81 сказал: Пока они заняты, пытаюсь исключить чисто программные косяки А всё-таки - ответьте на последний вопрос из https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=149961&do=findComment&comment=1598511 Ведь Ваш fault имеет PC=0x080D6626, а там portSET_INTERRUPT_MASK_FROM_ISR() Или просто протрассируйте внутрь по шагам, по ассемблерному коду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 10 декабря, 2018 Опубликовано 10 декабря, 2018 · Жалоба 16 minutes ago, jcxz said: А всё-таки - ответьте на последний вопрос из https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=149961&do=findComment&comment=1598511 Ведь Ваш fault имеет PC=0x080D6626, а там portSET_INTERRUPT_MASK_FROM_ISR() Или просто протрассируйте внутрь по шагам, по ассемблерному коду. А я отвечал выше, слилось в одно сообщение. void xPortSysTickHandler( void ) { /* If using preemption, also force a context switch. */ #if configUSE_PREEMPTION == 1 portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; #endif /* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to 1. If it is set to 0 tickless idle is not being used. If it is set to a value other than 0 or 1 then a timer other than the SysTick is being used to generate the tick interrupt. */ #if configUSE_TICKLESS_IDLE == 1 portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick; #endif ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); { vTaskIncrementTick(); } portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); } portSET_INTERRUPT_MASK_FROM_ISR раскрывается в ulPortSetInterruptMask __attribute__(( naked )) unsigned long ulPortSetInterruptMask( void ) { __asm volatile \ ( \ " mrs r0, basepri \n" \ " mov r1, %0 \n" \ " msr basepri, r1 \n" \ " bx lr \n" \ :: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "r0", "r1" \ ); /* This return will not be reached but is necessary to prevent compiler warnings. */ return 0; } portCLEAR_INTERRUPT_MASK_FROM_ISR раскрывается в vPortClearInterruptMask __attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskValue ) { __asm volatile \ ( \ " msr basepri, r0 \n" \ " bx lr \n" \ :::"r0" \ ); /* Just to avoid compiler warnings. */ ( void ) ulNewMaskValue; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 10 декабря, 2018 Опубликовано 10 декабря, 2018 · Жалоба 10 минут назад, Johnny81 сказал: А я отвечал выше, слилось в одно сообщение. Всё-таки я бы протрассировал внутрь, чтобы убедиться что там именно те самые команды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 10 декабря, 2018 Опубликовано 10 декабря, 2018 · Жалоба 1 час назад, Johnny81 сказал: спасибо, пробегусь по стекам процессов Не только по стекам процессов, но и стек прерываний следует проверить. Как видно из содержимого регистров - Вы используете раздельные стеки для MSP и PSP. Его кстати ОС думаю не контролирует. PS: В инфу, выдаваемую Вашим обработчиком HF, советую добавить инфу о состоянии PSP и MSP и содержимое верхушки активного стека. PPS: В первую очередь я бы также советовал добиться стабильного проявления бага, а не раз в час. Для этого можно попробовать: включить оптимизацию по максимуму, или поменять ещё установки; поменять частоту CPU (при возможности); добавить дополнительные задачи, со случайной вычислительной загрузкой, ... Когда добьётесь стабильного проявления бага, это состояние стоит зафиксировать и в нём будет уже легче искать баг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 10 декабря, 2018 Опубликовано 10 декабря, 2018 · Жалоба 2 часа назад, Johnny81 сказал: Генератор 25МГц, рабочая частота 168 МГц, питание 3,3. FLASH_ACR latency стоит 5, глянул даташит - вроде как норм А он у вас случайно не перегревается? Внутреннюю температуру измеряете? Всё-таки близко к максимальной частоте. Снижение частоты возможно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба Есть подвижки? Если со стеками все ок, предлагаю обсудить маловероятные причины On 12/10/2018 at 1:20 PM, Johnny81 said: - 7.4.0, старенькая, пока проблем не было - да - сон не испльзуется - контроль стека включен, уровень 1. Стеки с двукратным запасом примерно - выровнены, вроде как норм - включен, используется Вижу, Вы ответили, что сон не используется, но переспрошу, этот configUSE_TICKLESS_IDLE дефайн в единице? Если да то как я уже писал, WFI нужно обернуть в DSB и ISB, подсмотреть можно в новых версиях port.c Мало вероятно но все же, как вариант, можно выключить FPU, посмотреть изменится ли поведение. Не знаю что там в 7.4 но в более старых FreeRTOS точно были проблемы с контекстом FPU. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 1 час назад, Integro сказал: WFI нужно обернуть в DSB и ISB Вообще для WFI лучше отдельную задачу создать. Тогда никакие DSB/ISB не нужны, так как при входе/выходе в/из exception ядро Cortex-M автоматом выполняет ISB. Или на какой-то STM32 есть errata, где указано что почему-то не выполняется ISB при enter/return in/from exception? По-крайней мере - уже много лет на разных МК использую Idle-задачу с WFE без всяких ISB/DSB. Выдержка из мануала на Cortex-M4: However, memory barrier instructions are not required if the MPU setup process starts by entering an exception handler, or is followed by an exception return, because the exception entry and exception return mechanism cause memory barrier behavior. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба On 12/10/2018 at 12:46 PM, jcxz said: Сам так не делаю, так как у меня WFE только в одном месте - в отдельной Idle-задаче. 48 minutes ago, jcxz said: Вообще для WFI лучше отдельную задачу создать. Уважаемый @jcxz, я Вас услышал! Бросайте уже это привычку в обсуждении проблем ТС отступать от темы и повествовать о вашей реализации не касающейся проблемы. У ТС уже есть своя реализация и нужно чинить ее! Мы даже не знаем включен ли там TICKLESS. Если Вы хотите обсудить использование memory barriers предлагаю создать отдельную тему! Здесь мы имеем FreeRTOS где уже реализован механизм сна через TICKLESS, и если он включен и это версия 7.х то нужно делать так как я писал, иначе получим HF! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 11 минут назад, Integro сказал: Бросайте уже это привычку в обсуждении проблем ТС отступать от темы и повествовать о вашей реализации не касающейся проблемы. У ТС уже есть своя реализация и нужно чинить ее! Чинить реализацию ТС - дело самого ТС. А меня больше волнуют мои проекты. И правильность их реализации. Потому и спрашиваю - откуда такие рекомендации? Есть ссылки на какие-то доки почему так надо делать? Где почитать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться