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 );
}
Другие вопросы по тегам