コード例 #1
0
ファイル: kos.c プロジェクト: puchinya/kos
void kos_process_tmo(void)
{
	kos_bool_t do_dsp;
	kos_list_t *l, *end, *next;

	do_dsp = KOS_FALSE;

	end = &g_kos_tmo_wait_list;
	for(l = end->next; l != end; ) {
		kos_tcb_t *tcb;
		next = l->next;
		
		tcb = (kos_tcb_t *)((uint8_t *)l - offsetof(kos_tcb_t, tmo_list));
		if(--tcb->st.lefttmo == 0) {
			/* 割り込みをマスクして待ち解除を行う */
			kos_ilock;
			kos_cancel_wait_nolock(tcb, KOS_E_TMOUT);
			kos_iunlock;
			do_dsp = KOS_TRUE;
		}
		l = next;
	}

	/* 1つ以上の待ちを解除したらディスパッチを行う */
	if(do_dsp) {
		kos_itsk_dsp();
	}
}
コード例 #2
0
kos_er_t kos_ipsnd_dtq(kos_id_t dtqid, kos_vp_int_t data)
{
	kos_dtq_cb_t *cb;
	kos_er_t er;
	
#ifdef KOS_CFG_ENA_PAR_CHK
	if(dtqid > g_kos_max_dtq || dtqid == 0)
		return KOS_E_ID;
#endif
	
	er = KOS_E_OK;
	
	kos_ilock;
	
	cb = kos_get_dtq_cb(dtqid);
	if(cb == KOS_NULL) {
		er = KOS_E_NOEXS;
		goto end;
	}
	
	if(!kos_list_empty(&cb->r_wait_tsk_list)) {
		/* 受信待ちのタスクがいればデータを渡して終わり */
		kos_tcb_t *tcb;
		
		tcb = (kos_tcb_t *)cb->r_wait_tsk_list.next;
		*((kos_vp_int_t *)tcb->wait_exinf) = data;
		
		kos_cancel_wait_nolock(tcb, KOS_E_OK);
		kos_itsk_dsp();
		
	} else {
		if(cb->sdtqcnt == cb->cdtq.dtqcnt) {
			/* 空きがない場合 */
			er = KOS_E_TMOUT;
			goto end;
		} else {
			/* 空きがあればキューにデータを追加 */
			kos_uint_t wp;
			
			wp = cb->dtq_wp;
			
			((kos_vp_int_t *)cb->cdtq.dtq)[wp] = data;
			
			wp++;
			if(wp >= cb->cdtq.dtqcnt) wp = 0;
			cb->dtq_wp = wp;
			cb->sdtqcnt++;
			
			if(!kos_list_empty(&cb->r_wait_tsk_list)) {
				kos_tcb_t *tcb = (kos_tcb_t *)cb->r_wait_tsk_list.next;
				
				kos_cancel_wait_nolock(tcb, KOS_E_OK);
				kos_itsk_dsp();
			}
		}
	}
end:
	kos_iunlock;
	
	return er;
}