QUOTE (inventor @ Nov 30 2015, 13:16)
как сделать задержку ДО инициализации в системе xPortSysTickHandler
Я так понимаю это делается где то в функции vTaskStartScheduler() в конце main()
Зачем вообще что-то делать ДО инициализации системы? Инициализируете систему по минимуму, хоть просто одна IdleTask, и уже в этой Idle поднимаете все, что угодно. После чего заменяете IdleTask на штатное. Я инициализирую в минимуме к Idle еще консольную задачу и потом уже подъем остального идет уже под контролем с диагностическими распечатками.
Системая задержка, правда, в штатной реализации FreeRTOS в IdleTask не работает, но это легко лечится.
CODE
//------------------------------------------------------------
//
//------------------------------------------------------------
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
}
}
QUOTE (aaarrr @ Nov 30 2015, 13:32)
Я так понимаю, что стоит цель написать универсальную функцию задержки, которая будет работать и в контексте ОС, и до её запуска?
Самый простой способ - проверять в начале функции, запущен ли SysTick, и ветвиться на vTaskDelay() или циклическую задержку по результатам.
Для универсальности тогда нужно еще и IdleTask определять. Но на самом деле, как писал выше, не вижу никакой необходимости в задержках до старта системы.