/** * * @param timer_task_stack * @param timer_task_stack_size * @param idle_task_stack * @param idle_task_stack_size * @param app_in_cb * @param cpu_int_en * @param idle_user_cb */ void TN_NORETURN tnec_start_system(TN_UWORD *timer_task_stack, TN_UWORD timer_task_stack_size, TN_UWORD *idle_task_stack, TN_UWORD idle_task_stack_size, void (*app_in_cb)(void), void (*cpu_int_en)(void), void (*idle_user_cb)(void) ) { TN_WORD i; /* ToDo - initialize the sys log (if enabled) */ for (i = 0; i < TN_NUM_PRIORITY; i++) { queue_reset(&(tn_ready_list[i])); tn_tslice_ticks[i] = NO_TIME_SLICE; } queue_reset(&tn_create_queue); tn_created_tasks_qty = 0; tn_system_state = TN_ST_STATE_NOT_RUN; tn_enable_switch_context = TN_TRUE; tn_ready_to_run_bmp = 0; tn_context_switch_request = TN_FALSE; tn_sys_context = TN_CONTEXT_TASK; tn_next_task_to_run = TN_NULL; tn_curr_run_task = TN_NULL; queue_reset(&tn_locked_mutexes_list); queue_reset(&tn_blocked_tasks_list); queue_reset(&tn_wait_timeout_list); tnec_task_create((TN_TCB_S*)&tn_timer_task, tn_timer_task_func, 0, timer_task_stack, timer_task_stack_size, TN_NULL, TN_TASK_TIMER ); tnec_task_create((TN_TCB_S*)&tn_idle_task, tn_idle_task_func, (TN_NUM_PRIORITY - 1), idle_task_stack, idle_task_stack_size, TN_NULL, TN_TASK_IDLE ); task_to_runnable(&tn_idle_task); task_to_runnable(&tn_timer_task); tn_curr_run_task = &tn_idle_task; appl_init_callback = app_in_cb; cpu_interrupt_enbl_callback = cpu_int_en; idle_user_func_callback = idle_user_cb; tn_start_exe(); for(;;); /* for (;;);*/ }
//---------------------------------------------------------------------------- // TN main function (never return) //---------------------------------------------------------------------------- void tn_start_system(void) { int i; //-- Clear/set all globals (vars, lists, etc) for(i=0;i < TN_NUM_PRIORITY;i++) { queue_reset(&(tn_ready_list[i])); tn_tslice_ticks[i] = NO_TIME_SLICE; } queue_reset(&tn_create_queue); tn_created_tasks_qty = 0; tn_system_state = TN_ST_STATE_NOT_RUN; tn_ready_to_run_bmp = 0; tn_idle_count = 0; tn_curr_performance = 0; tn_next_task_to_run = NULL; tn_curr_run_task = NULL; //-- System tasks queue_reset(&tn_wait_timeout_list); //--- Timer task tn_task_create((TN_TCB*)&tn_timer_task, //-- task TCB tn_timer_task_func, //-- task function 0, //-- task priority &(tn_timer_task_stack //-- task stack first addr in memory [TN_TIMER_STACK_SIZE-1]), TN_TIMER_STACK_SIZE, //-- task stack size (in int,not bytes) NULL, //-- task function parameter TN_TASK_TIMER); //-- Creation option //--- Idle task tn_task_create((TN_TCB*)&tn_idle_task, //-- task TCB tn_idle_task_func, //-- task function TN_NUM_PRIORITY-1, //-- task priority &(tn_idle_task_stack //-- task stack first addr in memory [TN_IDLE_STACK_SIZE-1]), TN_IDLE_STACK_SIZE, //-- task stack size (in int,not bytes) NULL, //-- task function parameter TN_TASK_IDLE); //-- Creation option //-- Activate timer & idle tasks tn_next_task_to_run = &tn_idle_task; //-- Just for the task_to_runnable() proper op task_to_runnable(&tn_idle_task); task_to_runnable(&tn_timer_task); tn_curr_run_task = &tn_idle_task; //-- otherwise it is NULL //-- Run OS - first context switch tn_start_exe(); }