mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-01-18 03:52:11 +01:00
Osx Simulator Not running quickly but at least it's staying up
This commit is contained in:
parent
898a595d81
commit
a2bc7b8668
@ -135,6 +135,7 @@ typedef struct THREAD_SUSPENSIONS
|
||||
portBASE_TYPE xThreadState;
|
||||
volatile enum thread_status status;
|
||||
unsigned portBASE_TYPE uxCriticalNesting;
|
||||
char * name;
|
||||
} xThreadState;
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
@ -171,7 +172,7 @@ static volatile unsigned portBASE_TYPE uxCriticalNesting;
|
||||
* when then goes into it's signal handler. It will changes it's running
|
||||
* status to stopped which this thread will wait for.
|
||||
*/
|
||||
static void pauseOtherThread(xTaskHandle hTask);
|
||||
static int pauseOtherThread(xTaskHandle hTask);
|
||||
|
||||
/**
|
||||
* Prepares a task to pause (stores critical nesting, releases running semaphore)
|
||||
@ -215,6 +216,7 @@ static pthread_cond_t * prvGetConditionHandle( xTaskHandle hTask );
|
||||
static pthread_mutex_t * prvGetMutexHandle( xTaskHandle hTask );
|
||||
static xTaskHandle prvGetTaskHandle( pthread_t hThread );
|
||||
static void prvSetThreadStatus( pthread_t hThread, enum thread_status status );
|
||||
static enum thread_status prvGetThreadStatus( pthread_t hThread );
|
||||
static portLONG prvGetFreeThreadState( void );
|
||||
static void prvSetTaskCriticalNesting( pthread_t xThreadId, unsigned portBASE_TYPE uxNesting );
|
||||
static unsigned portBASE_TYPE prvGetTaskCriticalNesting( pthread_t xThreadId );
|
||||
@ -444,10 +446,10 @@ portLONG lIndex;
|
||||
while( pdTRUE != xSchedulerEnd ) {
|
||||
usleep(portTICK_RATE_MICROSECONDS);
|
||||
vPortSystemTickHandler(SIG_TICK);
|
||||
i++;
|
||||
if (i % 1000 == 0)
|
||||
fprintf(stderr,".");
|
||||
i++;
|
||||
//if (i % 2000 == 0)
|
||||
//if (i % 200 == 0)
|
||||
// printTasks();
|
||||
}
|
||||
|
||||
@ -520,6 +522,7 @@ void vPortYield( void )
|
||||
|
||||
if(pthread_mutex_trylock( &xSwappingThreadMutex )== EBUSY) {
|
||||
// The tick handler will just pause this thread
|
||||
fprintf(stdout, "Could not get the swapping thread to yield\r\n");
|
||||
usleep(10);
|
||||
storeSelf();
|
||||
pauseSelf();
|
||||
@ -530,8 +533,8 @@ void vPortYield( void )
|
||||
// Time to sleep
|
||||
//fprintf(stdout, "Yielding from %s\r\n", threadToName(pthread_self()));
|
||||
storeSelf();
|
||||
pthread_mutex_unlock( &xSwappingThreadMutex );
|
||||
resumeThread(xTaskGetCurrentTaskHandle());
|
||||
pthread_mutex_unlock( &xSwappingThreadMutex );
|
||||
pauseSelf();
|
||||
claimRunningSemaphore(3);
|
||||
} else
|
||||
@ -621,7 +624,7 @@ void vPortSystemTickHandler( int sig )
|
||||
}
|
||||
*/
|
||||
if(pthread_mutex_trylock( &xSwappingThreadMutex )== EBUSY) {
|
||||
fprintf(stdout,"Can't get swapping lock for tick handler\r\n");
|
||||
//fprintf(stdout,"Can't get swapping lock for tick handler\r\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -632,11 +635,13 @@ void vPortSystemTickHandler( int sig )
|
||||
|
||||
//printTasks();
|
||||
|
||||
pauseOtherThread(xTaskGetCurrentTaskHandle());
|
||||
// If that thread won't pause something is going on
|
||||
if (pauseOtherThread(xTaskGetCurrentTaskHandle()) != -1) {
|
||||
claimRunningSemaphore(2);
|
||||
vTaskSwitchContext();
|
||||
releaseRunningSemaphore();
|
||||
resumeThread(xTaskGetCurrentTaskHandle());
|
||||
}
|
||||
// fprintf(stdout, "System tick done\r\n");
|
||||
}
|
||||
#endif
|
||||
@ -738,6 +743,13 @@ void * pParams = pxParams->pvParams;
|
||||
|
||||
usleep(1000);
|
||||
|
||||
xTaskHandle hTask = prvGetTaskHandle( pthread_self() );
|
||||
portLONG lIndex;
|
||||
for ( lIndex = 0; lIndex < MAX_NUMBER_OF_TASKS && pxThreads[ lIndex ].hTask != hTask; lIndex++ );
|
||||
assert(pxThreads[ lIndex ].hTask == hTask);
|
||||
|
||||
pxThreads[lIndex].name = (char *) ((tskTCB *) hTask)->pcTaskName;
|
||||
|
||||
pauseSelf();
|
||||
|
||||
sigemptyset( &xSignals );
|
||||
@ -757,10 +769,16 @@ extern volatile unsigned portBASE_TYPE uxSchedulerSuspended;
|
||||
|
||||
void prvSuspendSignalHandler(int sig)
|
||||
{
|
||||
//fprintf(stderr, "Caught suspend signal (%d): %s\r\n", sig, threadToName(pthread_self()));
|
||||
storeSelf();
|
||||
pauseSelf();
|
||||
claimRunningSemaphore(1);
|
||||
if (prvGetThreadStatus(pthread_self()) != RUNNING) {
|
||||
//fprintf(stderr, "Caught erroneous suspend signal (%d): %s\r\n", sig, threadToName(pthread_self()));
|
||||
return;
|
||||
}
|
||||
else {
|
||||
//fprintf(stderr, "Caught suspend signal (%d): %s\r\n", sig, threadToName(pthread_self()));
|
||||
storeSelf();
|
||||
pauseSelf();
|
||||
claimRunningSemaphore(1);
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
@ -852,6 +870,23 @@ static void prvSetThreadStatus( pthread_t hThread, enum thread_status status )
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
static enum thread_status prvGetThreadStatus( pthread_t hThread )
|
||||
{
|
||||
portLONG lIndex;
|
||||
|
||||
/* If not initialized yet */
|
||||
if( pxThreads == NULL ) return DESTROYED;
|
||||
|
||||
for ( lIndex = 0; lIndex < MAX_NUMBER_OF_TASKS; lIndex++ )
|
||||
{
|
||||
if ( pxThreads[ lIndex ].hThread == hThread )
|
||||
{
|
||||
return pxThreads[ lIndex ].status; }
|
||||
}
|
||||
return DESTROYED;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
pthread_cond_t * prvGetConditionHandle( xTaskHandle hTask )
|
||||
{
|
||||
@ -1073,7 +1108,7 @@ void pauseSelf()
|
||||
assert( xResult != EINVAL );
|
||||
|
||||
if (xResult == ETIMEDOUT && pthread_self() == prvGetThreadHandle(xTaskGetCurrentTaskHandle())) {
|
||||
fprintf(stdout,"Timed out should be running\r\n");
|
||||
fprintf(stdout,"Timed out should be running %s\r\n", threadToName( pthread_self() ));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1100,7 +1135,7 @@ void pauseSelf()
|
||||
* when then goes into it's signal handler. It will changes it's running
|
||||
* status to stopped which this thread will wait for.
|
||||
*/
|
||||
static void pauseOtherThread(xTaskHandle hTask)
|
||||
static int pauseOtherThread(xTaskHandle hTask)
|
||||
{
|
||||
const int MAX_TIME = 10000; // us
|
||||
const int MAX_ATTEMPTS = 5;
|
||||
@ -1109,10 +1144,16 @@ static void pauseOtherThread(xTaskHandle hTask)
|
||||
for ( lIndex = 0; lIndex < MAX_NUMBER_OF_TASKS && pxThreads[ lIndex ].hTask != hTask; lIndex++ );
|
||||
assert(pxThreads[ lIndex ].hTask == hTask);
|
||||
|
||||
if(pxThreads[ lIndex ].status != RUNNING) {
|
||||
//fprintf(stdout, "Attempted to stop thread that is not running %s by %s\r\n", threadToName(pxThreads[lIndex].hThread), threadToName(pthread_self()));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < MAX_ATTEMPTS; i++) {
|
||||
// Trigger signal handler which will call pauseSelf
|
||||
pthread_t thread_to_supend = prvGetThreadHandle( hTask );
|
||||
//fprintf(stdout, "Requesting pause of thread %s from %s.\r\n", threadToName(thread_to_supend), threadToName( pthread_self() ) );
|
||||
fprintf(stdout, "Requesting pause of thread %s from %s.\r\n", threadToName(thread_to_supend), threadToName( pthread_self() ) );
|
||||
|
||||
assert( pthread_kill( thread_to_supend, SIG_SUSPEND ) == 0);
|
||||
|
||||
@ -1120,13 +1161,15 @@ static void pauseOtherThread(xTaskHandle hTask)
|
||||
while( (clock() - start_time) < MAX_TIME ) {
|
||||
if(pxThreads[ lIndex ].status == STOPPED || pxThreads[ lIndex ].status == STORED) {
|
||||
//fprintf(stdout, "Pause detected of %s by %s\r\n", threadToName(pxThreads[lIndex].hThread), threadToName(pthread_self()));
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
//fprintf(stdout, "Sending pause signal from %s to %s: Try %d\r\n", threadToName(pthread_self()), threadToName(prvGetThreadHandle( hTask )), i);
|
||||
}
|
||||
assert(0);
|
||||
|
||||
return -2;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1137,7 +1180,7 @@ static void pauseOtherThread(xTaskHandle hTask)
|
||||
static void resumeThread(xTaskHandle hTask)
|
||||
{
|
||||
const unsigned int MAX_TIME = 10000; // us
|
||||
const int MAX_ATTEMPTS = 25;
|
||||
const int MAX_ATTEMPTS = 250;
|
||||
|
||||
portLONG lIndex;
|
||||
for ( lIndex = 0; lIndex < MAX_NUMBER_OF_TASKS && pxThreads[ lIndex ].hTask != hTask; lIndex++ );
|
||||
@ -1161,6 +1204,7 @@ static void resumeThread(xTaskHandle hTask)
|
||||
//fprintf(stdout, "Sending resume signal from %s to %s (%d): Try %d\r\n", threadToName(pthread_self()), threadToName(hTask), lIndex, i);
|
||||
|
||||
}
|
||||
fprintf(stdout, "Railed to resume from %s to %s (%d)\r\n", threadToName(pthread_self()), threadToName(hTask), lIndex);
|
||||
// Thread resumption timed out
|
||||
assert(0);
|
||||
}
|
||||
@ -1186,8 +1230,8 @@ static void claimRunningSemaphore(int source)
|
||||
*/
|
||||
static void releaseRunningSemaphore()
|
||||
{
|
||||
//fprintf(stderr,"Released the semaphore %s\r\n", threadToName(pthread_self()));
|
||||
assert( 0 == pthread_mutex_unlock( &xRunningThread ) );
|
||||
//fprintf(stderr,"Released the semaphore %s\r\n", threadToName(pthread_self()));
|
||||
}
|
||||
|
||||
|
||||
|
@ -39,7 +39,7 @@ static uint8_t LED_GPIO[PIOS_LED_NUM];
|
||||
|
||||
|
||||
static inline void PIOS_SetLED(uint32_t LED,uint8_t stat) {
|
||||
// printf("PIOS: LED %i status %i\n",LED,stat);
|
||||
//printf("PIOS: LED %i status %i\n",LED,stat);
|
||||
LED_GPIO[LED]=stat;
|
||||
}
|
||||
|
||||
|
@ -108,16 +108,13 @@ void * PIOS_TCP_RxThread(void *tcp_dev_n)
|
||||
(void) (tcp_dev->rx_in_cb)(tcp_dev->rx_in_context, &tcp_dev->rx_buffer[0], received, NULL, &rx_need_yield);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (rx_need_yield) {
|
||||
fprintf(stderr, "Not sure about this ... \n");
|
||||
}
|
||||
//fprintf(stderr, "Received %d\n", received);
|
||||
#if defined(PIOS_INCLUDE_FREERTOS)
|
||||
// Not sure about this
|
||||
if (rx_need_yield) {
|
||||
vPortYieldFromISR();
|
||||
}
|
||||
#endif /* PIOS_INCLUDE_FREERTOS */
|
||||
#endif
|
||||
} while(received > 0);
|
||||
|
||||
if (-1 == shutdown(tcp_dev->socket_connection, SHUT_RDWR))
|
||||
|
Loading…
x
Reference in New Issue
Block a user