예제 #1
0
VCOSPRE_ VCOS_STATUS_T VCOSPOST_ vcos_thread_create_classic(VCOS_THREAD_T *thread,
                                                            const char *name,
                                                            void *(*entry)(void *arg),
                                                            void *arg,
                                                            void *stack,
                                                            VCOS_UNSIGNED stacksz,
                                                            VCOS_UNSIGNED priaff,
                                                            VCOS_UNSIGNED timeslice,
                                                            VCOS_UNSIGNED autostart)
{
   VCOS_THREAD_ATTR_T attrs;
   vcos_thread_attr_init(&attrs);
   vcos_thread_attr_setstacksize(&attrs, stacksz);
   vcos_thread_attr_setpriority(&attrs, priaff & ~_VCOS_AFFINITY_MASK);
   vcos_thread_attr_setaffinity(&attrs, priaff & _VCOS_AFFINITY_MASK);
   (void)timeslice;
   (void)autostart;

   if (VCOS_CAN_SET_STACK_ADDR)
   {
      vcos_thread_attr_setstack(&attrs, stack, stacksz);
   }

   return vcos_thread_create(thread, name, &attrs, entry, arg);
}
VCOS_STATUS_T vcos_thread_create_classic(VCOS_THREAD_T *thread,
                                         const char *name,
                                         void *(*entry)(void* arg),
                                         void *arg,
                                         void *stack,
                                         VCOS_UNSIGNED stacksz,
                                         VCOS_UNSIGNED priaff,
                                         VCOS_UNSIGNED timeslice,
                                         VCOS_UNSIGNED autostart)
{
   VCOS_STATUS_T status;
   VCOS_THREAD_ATTR_T attrs;
   VCOS_UNSIGNED priority = priaff & ~VCOS_AFFINITY_MASK;
   VCOS_UNSIGNED affinity = priaff & VCOS_AFFINITY_MASK;

   vcos_thread_attr_init(&attrs);
#if VCOS_CAN_SET_STACK_ADDR
   vcos_thread_attr_setstack(&attrs, stack, stacksz);
#else
   vcos_assert(stack == 0);
#endif

   vcos_assert((autostart == VCOS_START) || (autostart == VCOS_NO_START));

   vcos_thread_attr_setpriority(&attrs, priority);
   vcos_thread_attr_setaffinity(&attrs, affinity);
   vcos_thread_attr_settimeslice(&attrs, timeslice);
   vcos_thread_attr_setautostart(&attrs, autostart);

   status = vcos_thread_create(thread, name, &attrs, entry, arg);

   return status;
}
bool khrn_worker_init(void)
{
#ifndef KHRN_WORKER_USE_LLAT
   VCOS_THREAD_ATTR_T attr;
#endif
   vcos_assert(!inited);

   khrn_worker_enter_pos = 0;
   khrn_worker_exit_pos_0 = 0;
   khrn_worker_exit_pos_1 = 0;

   khrn_worker_msg.post = msgs;
   khrn_worker_msg.done_it = msgs;
   khrn_worker_msg.cleanup = msgs;

#ifdef KHRN_WORKER_USE_LLAT
   llat_i = khrn_llat_register(khrn_worker_llat_callback);
   vcos_assert(llat_i != -1);
#else
   if (vcos_event_create(&event, "khrn_worker_event") != VCOS_SUCCESS) {
      return false;
   }

   exit_thread = false;

   vcos_thread_attr_init(&attr);
   vcos_thread_attr_setpriority(&attr, THREAD_PRIORITY);
#if !defined(V3D_LEAN)
   switch (vcos_thread_get_affinity(vcos_thread_current())) {
   case VCOS_AFFINITY_CPU0: vcos_thread_attr_setaffinity(&attr, VCOS_AFFINITY_CPU1); break;
   case VCOS_AFFINITY_CPU1: vcos_thread_attr_setaffinity(&attr, VCOS_AFFINITY_CPU0); break;
   }
   vcos_thread_attr_setstacksize(&attr, THREAD_STACK_SIZE);
#endif /* V3D_LEAN */
   if (vcos_thread_create(&thread, "khrn_worker_thread", &attr, khrn_worker_main, NULL) != VCOS_SUCCESS) {
      vcos_event_delete(&event);
      return false;
   }
#endif

   inited = true;

   return true;
}