1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-29 14:52:12 +01:00

Restore the original Revolution FreeRTOSConfig and make the osx simulation

scheduler not start high priority tasks when they are created because I can't
reliably get the starting task to stop (because currently in a swapping mutex I
think).
This commit is contained in:
James Cotton 2012-03-14 17:37:50 -05:00
parent 6df9691609
commit 09ce6e1ab4
2 changed files with 28 additions and 7 deletions

View File

@ -399,6 +399,9 @@ xParams *pxThisThreadParams = pvPortMalloc( sizeof( xParams ) );
/* Wait until the task suspends. */ /* Wait until the task suspends. */
while ( xSentinel == 0 ); while ( xSentinel == 0 );
//printf( "Task suspended detected for %i\r\n", lIndexOfLastAddedTask);
vPortExitCritical(); vPortExitCritical();
return pxTopOfStack; return pxTopOfStack;
@ -415,6 +418,7 @@ void vPortStartFirstTask( void )
/* Start the first task. */ /* Start the first task. */
xInterruptsEnabled = pdTRUE; xInterruptsEnabled = pdTRUE;
xRunning = 1; xRunning = 1;
unmaskSuspend();
resumeThread( xTaskGetCurrentTaskHandle() ); resumeThread( xTaskGetCurrentTaskHandle() );
} }
@ -820,13 +824,30 @@ void * pParams = pxParams->pvParams;
pxThreads[lIndex].name = (char *) ((tskTCB *) hTask)->pcTaskName; pxThreads[lIndex].name = (char *) ((tskTCB *) hTask)->pcTaskName;
xInterruptsEnabled = pdTRUE; xInterruptsEnabled = pdTRUE;
if(prvGetTaskHandle(pthread_self()) != xTaskGetCurrentTaskHandle()) { if(1 || prvGetTaskHandle(pthread_self()) != xTaskGetCurrentTaskHandle()) {
pauseSelf(); pauseSelf();
claimRunningSemaphore(7); claimRunningSemaphore(7);
unmaskSuspend(); unmaskSuspend();
} }
else { else {
//fprintf(stdout, "New thread wants to run right away %s\r\n", threadToName(pthread_self())); fprintf(stdout, "New thread wants to run right away %s\r\n", threadToName(pthread_self()));
assert(pthread_mutex_trylock( &xSwappingThreadMutex )!= EBUSY);
// Find the previously running thread. xTaskGetCurrentHandle no longer reflects current state
portLONG lIndex;
for ( lIndex = 0; lIndex < MAX_NUMBER_OF_TASKS && pxThreads[ lIndex ].hTask != hTask; lIndex++ )
if(pxThreads[ lIndex ].status == RUNNING)
break;
pthread_mutex_unlock( &xSwappingThreadMutex );
assert(pxThreads[ lIndex ].hTask != NULL); // Should find a thread that is running
if( pxThreads[lIndex].hThread != pthread_self())
assert(pauseOtherThread(pxThreads[ lIndex ].hTask) == 0);
prvSetThreadStatus(pthread_self(), RUNNING); prvSetThreadStatus(pthread_self(), RUNNING);
claimRunningSemaphore(6); claimRunningSemaphore(6);
} }
@ -1232,10 +1253,10 @@ void pauseSelf()
xInterruptsEnabled = pdTRUE; xInterruptsEnabled = pdTRUE;
prvSetThreadStatus( pthread_self(), RUNNING ); prvSetThreadStatus( pthread_self(), RUNNING );
//if (xResult == 0) // if (xResult == 0)
// fprintf(stdout, "Thread resumed from signal %s\r\n", threadToName( pthread_self() )); // fprintf(stdout, "Thread resumed from signal %s\r\n", threadToName( pthread_self() ));
//else // else
// fprintf(stdout, "Thread resumed from timeout %s\r\n", threadToName( pthread_self() )); // fprintf(stdout, "Thread resumed from timeout %s\r\n", threadToName( pthread_self() ));
} }

View File

@ -43,7 +43,7 @@
#define configCHECK_FOR_STACK_OVERFLOW 2 #define configCHECK_FOR_STACK_OVERFLOW 2
#define configQUEUE_REGISTRY_SIZE 10 #define configQUEUE_REGISTRY_SIZE 10
#define configUSE_TIMERS 0 #define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 1) /* run timers at max priority */ #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 1) /* run timers at max priority */
#define configTIMER_QUEUE_LENGTH 10 #define configTIMER_QUEUE_LENGTH 10
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE