kos_er_id_t kos_cre_dtq(const kos_cdtq_t *pk_cdtq) { kos_dtq_cb_t *cb; int empty_index; kos_er_id_t er_id; kos_lock; #ifdef KOS_CFG_ENA_ACRE_CONST_TIME_ID_SEARCH { kos_id_t last_id = g_kos_last_dtqid; if(last_id < g_kos_max_dtq) { empty_index = last_id; g_kos_last_dtqid = last_id + 1; } else { if(kos_list_empty(&g_kos_dtq_cb_unused_list)) { er_id = KOS_E_NOID; goto end; } else { kos_dtq_cb_t *unused_cb = (kos_dtq_cb_t *)g_kos_dtq_cb_unused_list.next; empty_index = CB_TO_INDEX(unused_cb); kos_list_remove((kos_list_t *)unused_cb); } } } #else empty_index = kos_find_null((void **)g_kos_dtq_cb, g_kos_max_dtq); if(empty_index < 0) { er_id = KOS_E_NOID; goto end; } #endif cb = &g_kos_dtq_cb_inst[empty_index]; g_kos_dtq_cb[empty_index] = cb; cb->cdtq = *pk_cdtq; cb->dtq_rp = 0; cb->dtq_wp = 0; cb->sdtqcnt = 0; kos_list_init(&cb->r_wait_tsk_list); kos_list_init(&cb->s_wait_tsk_list); er_id = empty_index + 1; end: kos_unlock; return er_id; }
static void kos_init_vars(void) { int i; g_kos_dsp = KOS_TRUE; g_kos_pend_dsp = KOS_FALSE; g_kos_systim = 0; kos_list_init(&g_kos_tmo_wait_list); for(i = 0; i < g_kos_max_pri; i++) { kos_list_init(&g_kos_rdy_que[i]); } kos_init_cyc(); /* init idle task */ { kos_tcb_t *idle_tcb = &g_kos_idle_tcb_inst; idle_tcb->id = KOS_TSK_NONE; idle_tcb->st.tskstat = KOS_TTS_RUN; idle_tcb->st.tskpri = g_kos_max_pri; idle_tcb->st.tskwait = 0; idle_tcb->st.wobjid = 0; idle_tcb->st.lefttmo = 0; idle_tcb->st.actcnt = 0; idle_tcb->st.wupcnt = 0; idle_tcb->st.suscnt = 0; g_kos_cur_tcb = idle_tcb; } #ifdef KOS_CFG_STKCHK memset(g_kos_isr_stk, 0xCC, g_kos_isr_stksz); #endif #ifdef KOS_CFG_ENA_ACRE_CONST_TIME_ID_SEARCH kos_list_init(&g_kos_tcb_unused_list); g_kos_last_tskid = 0; #ifdef KOS_CFG_SPT_SEM kos_list_init(&g_kos_sem_cb_unused_list); g_kos_last_semid = 0; #endif #ifdef KOS_CFG_SPT_FLG kos_list_init(&g_kos_flg_cb_unused_list); g_kos_last_flgid = 0; #endif #ifdef KOS_CFG_SPT_DTQ kos_list_init(&g_kos_dtq_cb_unused_list); g_kos_last_dtqid = 0; #endif #ifdef KOS_CFG_SPT_CYC kos_list_init(&g_kos_cyc_cb_unused_list); g_kos_last_cycid = 0; #endif #endif #ifdef KOS_CFG_FAST_IRQ g_kos_dly_svc_fifo_cnt = 0; g_kos_dly_svc_fifo_wp = 0; g_kos_dly_svc_fifo_rp = 0; #endif }