void tt_console_run(IN tt_cons_ev_handler_t ev_handler, IN void *param, IN tt_bool_t local) { TT_ASSERT(ev_handler != NULL); if (!TT_OK(tt_atomic_s32_cas(&tt_s_console_running, 0, 1))) { TT_ERROR("console is already running"); return; } tt_s_console_ev_handler = ev_handler; tt_s_console_param = param; if (local) { __console_run(); } else { tt_thread_attr_t attr; tt_thread_attr_default(&attr); attr.detached = TT_TRUE; if (tt_thread_create(__console_thread, NULL, &attr) == NULL) { TT_ERROR("fail to craete console thread"); } } }
static void tt_create_thread_nop (void) { TT_THREAD_T *thread = tt_thread_create ("__tt_nop", 0, g_thread_nop_buffer, sizeof (g_thread_nop_buffer), tt_thread_nop_entry, NULL); listDetach (&thread->list_schedule); thread->wait_parent = NULL; //sysSafePrintf("%d\n", sizeof (g_thread_nop_buffer)); }
int main() { int i; /* The clock frequency of systick may be changed by user's application. Please change the value of SYSTICK_CLOCK according to real situration */ #define TT_SYSTICK_CLOCK 22118400 /* Initialize TinyThread */ tt_init(TT_SYSTICK_CLOCK); /* Open LED GPIO for testing */ DrvGPIO_Open(LED_GPIO_GREEN_GRP, LED_GPIO_GREEN_BIT, E_IO_OUTPUT); DrvGPIO_Open(LED_GPIO_RED_GRP, LED_GPIO_RED_BIT, E_IO_OUTPUT); DrvGPIO_Open(LED_GPIO_ISP_GRP, LED_GPIO_ISP_BIT, E_IO_OUTPUT); DrvGPIO_Open(LED_GPIO_ICE_GRP, LED_GPIO_ICE_BIT, E_IO_OUTPUT); /* Create and run thread */ arg[0].gpio_group = LED_GPIO_RED_GRP; arg[1].gpio_group = LED_GPIO_ISP_GRP; arg[2].gpio_group = LED_GPIO_ICE_GRP; arg[0].gpio_bit = LED_GPIO_RED_BIT; arg[1].gpio_bit = LED_GPIO_ISP_BIT; arg[2].gpio_bit = LED_GPIO_ICE_BIT; for (i = 0; i < THREAD_NUM; ++i) { tt_sem_init (&join_sem[i], 0); arg[i].join_sem = &join_sem[i]; thread[i] = tt_thread_create("thread", /* thread Name */ 0, /* thread priority */ stack[i], /* stack pointer */ sizeof(stack[i]), /* stack size */ thread_entry, /* thread entry function */ (void *)&arg[i] /* argument for thread entry function */ ); } /* Join threads. * TinyThread does not support build-in tt_thread_join() * since it is easy to emulate by a semaphore. */ for (i = 0; i < THREAD_NUM; ++i) tt_sem_down (&join_sem[i]); /* Set LED to indicate that run to here */ DrvGPIO_SetBit(LED_GPIO_RED_GRP, LED_GPIO_RED_BIT); /* OFF */ DrvGPIO_SetBit(LED_GPIO_ISP_GRP, LED_GPIO_ISP_BIT); /* OFF */ DrvGPIO_SetBit(LED_GPIO_ISP_GRP, LED_GPIO_ISP_BIT); /* OFF */ DrvGPIO_ClrBit(LED_GPIO_GREEN_GRP, LED_GPIO_GREEN_BIT); /* ON */ while(1); }
int main() { int i; THREAD_ARG_T arg[THREAD_NUM]; MY_SEM_T sem; /* The clock frequency of systick may be changed by user's application. Please change the value of SYSTICK_CLOCK according to real situration */ #define TT_SYSTICK_CLOCK 22118400 /* Initialize TinyThread */ tt_init(TT_SYSTICK_CLOCK); /* Open LED GPIO for testing */ DrvGPIO_Open(LED_GPIO_GREEN_GRP, LED_GPIO_GREEN_BIT, E_IO_OUTPUT); DrvGPIO_Open(LED_GPIO_RED_GRP, LED_GPIO_RED_BIT, E_IO_OUTPUT); DrvGPIO_Open(LED_GPIO_ISP_GRP, LED_GPIO_ISP_BIT, E_IO_OUTPUT); DrvGPIO_Open(LED_GPIO_ICE_GRP, LED_GPIO_ICE_BIT, E_IO_OUTPUT); /* Set semaphore value to 3, so that always 3 threads' LED is blinking */ my_sem_init (&sem, 3); /* Create and run thread */ arg[0].gpio_group = LED_GPIO_RED_GRP; arg[1].gpio_group = LED_GPIO_ISP_GRP; arg[2].gpio_group = LED_GPIO_ICE_GRP; arg[3].gpio_group = LED_GPIO_GREEN_GRP; arg[0].gpio_bit = LED_GPIO_RED_BIT; arg[1].gpio_bit = LED_GPIO_ISP_BIT; arg[2].gpio_bit = LED_GPIO_ICE_BIT; arg[3].gpio_bit = LED_GPIO_GREEN_BIT; for (i = 0; i < THREAD_NUM; ++i) { arg[i].sem = &sem; thread[i] = tt_thread_create("thread", /* thread Name */ 0, /* thread priority */ stack[i], /* stack pointer */ sizeof(stack[i]), /* stack size */ thread_entry, /* thread entry function */ (void *)&arg[i] /* argument for thread entry function */ ); } tt_thread_exit (); return 0; }
int main() { int i; /* The clock frequency of systick may be changed by user's application. Please change the value of SYSTICK_CLOCK according to real situration */ #define TT_SYSTICK_CLOCK 22118400 /* Initialize TinyThread */ tt_init(TT_SYSTICK_CLOCK); /* Open LED GPIO for testing */ _GPIO_SET_PIN_MODE(LED0_GPIO_GRP, LED0_GPIO_BIT, GPIO_PMD_OUTPUT); _GPIO_SET_PIN_MODE(LED1_GPIO_GRP, LED1_GPIO_BIT, GPIO_PMD_OUTPUT); _GPIO_SET_PIN_MODE(LED2_GPIO_GRP, LED2_GPIO_BIT, GPIO_PMD_OUTPUT); _GPIO_SET_PIN_MODE(LED3_GPIO_GRP, LED3_GPIO_BIT, GPIO_PMD_OUTPUT); /* Test threads lock by value[] the element in value should be the same, if not, there must be an error */ tt_rmutex_init(&mutex); for(i = 0; i < THREAD_NUM; ++i) value[i] = 0; arg[0].gpio_group = LED0_GPIO_GRP; arg[1].gpio_group = LED1_GPIO_GRP; arg[2].gpio_group = LED2_GPIO_GRP; arg[0].gpio_bit = LED0_GPIO_BIT; arg[1].gpio_bit = LED1_GPIO_BIT; arg[2].gpio_bit = LED2_GPIO_BIT; for(i = THREAD_NUM; i-- != 0; ) { arg[i].value = value; arg[i].mutex = &mutex; thread[i] = tt_thread_create("th", 0, stack[i], sizeof(stack[i]), thread_entry, (void *)&arg[i]); } tt_sleep(1024); while(1); return 0; }
tt_result_t tt_io_worker_create(IN tt_io_worker_t *w, IN tt_iowg_t *wg, IN OPT tt_io_worker_attr_t *attr) { tt_io_worker_attr_t __attr; TT_ASSERT(w != NULL); if (attr == NULL) { tt_io_worker_attr_default(&__attr); attr = &__attr; } w->wg = wg; w->thread = tt_thread_create(__io_worker_routine, w, &attr->thread_attr); if (w->thread == NULL) { TT_ERROR("fail to create w thread"); return TT_FAIL; } return TT_SUCCESS; }