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

Вылетает в HARD fault

Делаю прогу FreeRTOS для STM32F103xB

сделал несколько задач - в самом начале ПЕРЕД

запуском задач подаю импульс на определенные ноги

 

/* Включение модуля */
void board_power_on(void)
{
   GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
   delay_ms(25);

   GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_SET);
   delay_ms(25);
}

 

Вылетает на первой задержке в Hard fault - почему,

не могу понять.

Есть какие нибудь соображения?

 

Задержку сделал так:

IDEF void UtilsDelay(unsigned long ulCount)
{
   __asm("    subs    r0, #1\n"
         "    bne.n   UtilsDelay\n");
}


#define delay_us(x)	UtilsDelay(8 * x)
#define delay_ms(x)	UtilsDelay(8000 * x)

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


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

Вылетает на первой задержке в Hard fault - почему,

не могу понять.

Есть какие нибудь соображения?

 

вероятно, не включили тактирование порта

 

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


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

вероятно, не включили тактирование порта

вроде разобрался

в самом начале перед вызовом

функции с задержкой

включал SysTimer (не понянятно зачем - взял из примеров)

а этот таймер вполне вероятно юзал R0

пока я задержку выполнял

 

отключил вызов SysTick_Config(SystemFrequency / 1000) - заработало

но это все равно не решение, так как эту задержку нельзя использовать

в функциях внутри OC - попробую сделать так

чтобы ОС задействовала vApplicationTickHook или IdleHook

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


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

а этот таймер вполне вероятно юзал R0

пока я задержку выполнял

Невероятно. То есть использовать-то он его использовал, конечно, но вашей задержке это никак повредить не могло.

 

Если прерывание системного таймера содержит переход на xPortSysTickHandler, и таймер был разрешен до инициализации ОС, то вылет в Hard Fault имеет все основания.

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


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

Невероятно. То есть использовать-то он его использовал, конечно, но вашей задержке это никак повредить не могло.

 

Если прерывание системного таймера содержит переход на xPortSysTickHandler, и таймер был разрешен до инициализации ОС, то вылет в Hard Fault имеет все основания.

как сделать задержку ДО инициализации в системе xPortSysTickHandler

Я так понимаю это делается где то в функции vTaskStartScheduler() в конце main()

 

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


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

как сделать задержку ДО инициализации в системе xPortSysTickHandler

Я так понимаю, что стоит цель написать универсальную функцию задержки, которая будет работать и в контексте ОС, и до её запуска?

Самый простой способ - проверять в начале функции, запущен ли SysTick, и ветвиться на vTaskDelay() или циклическую задержку по результатам.

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


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

как сделать задержку ДО инициализации в системе xPortSysTickHandler

Я так понимаю это делается где то в функции vTaskStartScheduler() в конце main()

Зачем вообще что-то делать ДО инициализации системы? Инициализируете систему по минимуму, хоть просто одна IdleTask, и уже в этой Idle поднимаете все, что угодно. После чего заменяете IdleTask на штатное. Я инициализирую в минимуме к Idle еще консольную задачу и потом уже подъем остального идет уже под контролем с диагностическими распечатками.

Системая задержка, правда, в штатной реализации FreeRTOS в IdleTask не работает, но это легко лечится.

//------------------------------------------------------------
//
//------------------------------------------------------------
void main( void )
{
....
    vSetIdleHook( init_system );
    // Start the scheduler.
    vTaskStartScheduler( SYSTIMER_INTERNAL );             
}


//------------------------------------------------------------
//
//------------------------------------------------------------
void init_system()
{
.......

    vSetIdleHook( NULL );

}


#define vSmartDelay_ms(x) vSmartDelay( (x)/configTICK_MS )

//------------------------------------------------------------
//
//------------------------------------------------------------
void vSmartDelay( portTickType xTicksToDelay )
{
    if( pxCurrentTCB->uxPriority == 0 )
        vDummyDelay( xTicksToDelay );
    else
        vTaskDelay( xTicksToDelay );
}

//------------------------------------------------------------
//  For use in IDLE Task and .....
//------------------------------------------------------------
void vDummyDelay( portTickType xTicksToDelay )
{
portTickType xTimeToWake;
    if( xTicksToDelay > ( portTickType )0 )
    {   // Calculate the time to wake - this may overflow but this is
        // not a problem.
        xTimeToWake = xTickCount + xTicksToDelay + 1;
        while( !xIsTimeout( xTimeToWake) );    // Dummy Wait
    }
}

 

 

Я так понимаю, что стоит цель написать универсальную функцию задержки, которая будет работать и в контексте ОС, и до её запуска?

Самый простой способ - проверять в начале функции, запущен ли SysTick, и ветвиться на vTaskDelay() или циклическую задержку по результатам.

Для универсальности тогда нужно еще и IdleTask определять. Но на самом деле, как писал выше, не вижу никакой необходимости в задержках до старта системы.

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


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

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

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

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

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

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

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

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

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

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