Exemple #1
0
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;
}
Exemple #2
0
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
}