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

8 minutes ago, Johnny81 said:

А сам UNDEFINSTR ничего полезного не несет?

В книжке написано

...

С учетом того, что этот код обычно работает нормально, остается причина 2. Т.е. проц неверно читает FLASH?

Это не исчерпывающий список.

Кстати, по поводу питания. На всякий случай проверьте ещё Vcap. Там должно быть 1,2 В, ЕМНИП, но раз уж ищем чудеса, всё возможно.

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


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

1 minute ago, scifi said:

Это не исчерпывающий список.

Кстати, по поводу питания. На всякий случай проверьте ещё Vcap. Там должно быть 1,2 В, ЕМНИП, но раз уж ищем чудеса, всё возможно.

А где есть более подробная инфа? В STM32F3xxx and STM32F4xxx Cortex-M4 programming manual вообще ничего не написано, а этот список я взял из The defnitive guide to the ARM Cortex-M3

Насчет питания и остального - поглядим, спасибо. Я со схемотехникой не особо дружу, этим отдельный народ занимается. Пока они заняты, пытаюсь исключить чисто программные косяки
 

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


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

2 minutes ago, Johnny81 said:

А где есть более подробная инфа? В STM32F3xxx and STM32F4xxx Cortex-M4 programming manual вообще ничего не написано, а этот список я взял из The defnitive guide to the ARM Cortex-M3
 

Тут следует полагаться на здравый смысл, наверное. Undefined Instruction - название говорит само за себя. Если процессор и память программ исправны, значит в памяти оказалась неправильная инструкция. Ну а если что-то неисправно, возможны любые чудеса. Причины неисправности могут быть самые разные: плохое питание, бракованный чип, мощные радиопомехи, космические лучи...

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


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

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()

Или просто протрассируйте внутрь по шагам, по ассемблерному коду.

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


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

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;
}

 

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


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

10 минут назад, Johnny81 сказал:

А я отвечал выше, слилось в одно сообщение.

Всё-таки я бы протрассировал внутрь, чтобы убедиться что там именно те самые команды.

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


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

1 час назад, Johnny81 сказал:

спасибо, пробегусь по стекам процессов

Не только по стекам процессов, но и стек прерываний следует проверить. Как видно из содержимого регистров - Вы используете раздельные стеки для MSP и PSP. Его кстати ОС думаю не контролирует.

PS: В инфу, выдаваемую Вашим обработчиком HF, советую добавить инфу о состоянии PSP и MSP и содержимое верхушки активного стека.

PPS: В первую очередь я бы также советовал добиться стабильного проявления бага, а не раз в час. Для этого можно попробовать: включить оптимизацию по максимуму, или поменять ещё установки; поменять частоту CPU (при возможности); добавить дополнительные задачи, со случайной вычислительной загрузкой, ... Когда добьётесь стабильного проявления бага, это состояние стоит зафиксировать и в нём будет уже легче искать баг.

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


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

2 часа назад, Johnny81 сказал:

Генератор 25МГц, рабочая частота 168 МГц, питание 3,3. FLASH_ACR latency стоит 5, глянул даташит - вроде как норм

А он у вас случайно не перегревается? Внутреннюю температуру измеряете?

Всё-таки близко к максимальной частоте. Снижение частоты возможно?

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


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

Есть подвижки?

Если со стеками все ок, предлагаю обсудить маловероятные причины

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.

 

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


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

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.

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


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

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!

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


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

11 минут назад, Integro сказал:

Бросайте уже это привычку в обсуждении проблем ТС отступать от темы и повествовать о вашей реализации не касающейся проблемы. У ТС уже есть своя реализация и нужно чинить ее!

Чинить реализацию ТС - дело самого ТС. А меня больше волнуют мои проекты. И правильность их реализации. Потому и спрашиваю - откуда такие рекомендации? Есть ссылки на какие-то доки почему так надо делать? Где почитать?

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


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

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

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

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

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

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

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

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

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

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