POSIX: как выполнить переключение контекста между потоками?
Я хочу реализовать переключение контекста между потоками, используя Xilkernel, но не существует примитивного POSIX-совместимого, который позволял бы останавливать, а затем возобновлять выполнение потока.
Есть кто-нибудь, кто может мне помочь?
1 ответ
Я делаю переключение контекста для FPGA, используя этот код C. Если вы найдете это полезным и хотите получить больше окружающего кода, просто спросите меня.
/*
* threadswitch - change thread
*
* The thread stack-pointer is supplied as a parameter.
* The old thread's stack-pointer value is saved to the array
* thread_info_array, and a new thread is selected from the array.
* The stack pointer of the new thread is returned.
*/
unsigned int * threadswitch( unsigned int * old_sp )
{
unsigned int * new_sp;
number_of_thread_switches += 1; /* Increase thread-switch counter. */
/* Print line 1 of an informational message. */
printf( "\nPerforming thread-switch number %d. The system has been running for %d ticks.\n",
number_of_thread_switches,
get_internal_globaltime() );
/* Save the stack pointer of the old thread. */
thread_info_array[ currently_running_thread ].thread_sp = old_sp;
/* Print part 1 of a message saying which threads are involved this time. */
printf( "Switching from thread-ID %d ",
thread_info_array[ currently_running_thread ].thread_id );
/* Perform the scheduling decision (round-robin). */
currently_running_thread += 1;
if( currently_running_thread >= current_thread_count )
{
currently_running_thread = 0;
}
/* Print part 2 of the informational message. */
printf( "to thread-ID %d.\n",
thread_info_array[ currently_running_thread ].thread_id );
/* Get the stack pointer of the new thread. */
new_sp = thread_info_array[ currently_running_thread ].thread_sp;
/* Return. */
return( new_sp );
}