⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 T-kernel 的extension源代码
💻 C
字号:
/* *---------------------------------------------------------------------- *    T-Kernel / Standard Extension * *    Copyright (C) 2006 by Ken Sakamura. All rights reserved. *    T-Kernel / Standard Extension is distributed  *      under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * *    Version:   1.00.00 *    Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* *	main.c (event) * *	Event management *	Initialize/End the manager. *	System call / Extended SVC entry */#include "evtmgr.h"#include <extension/sys/svc/ifevent.h>#include "others.h"LOCAL WER emSyscallEntry( VP para, W fn );LOCAL void emCleanupEntry( ID resid, ID pid );LOCAL ER initialize( void );LOCAL ER finish( void );#define TSD_INE_STK_2048	2048#define TSD_INE_ARR_300		300/* * Event management common information */EXPORT EmInfo	emInfo;/* ------------------------------------------------------------------------ *//* * Extended SVC entry */LOCAL WER emSyscallEntry( VP para, W fn ){	switch ( fn ) {	  case EM_GET_EVT_FN: {		EM_GET_EVT_PARA *p = para;		return _tkse_get_evt(p->t_mask, p->evt, p->opt);	  }	  case EM_PUT_EVT_FN: {		EM_PUT_EVT_PARA *p = para;		return _tkse_put_evt(p->evt, p->opt);	  }	  case EM_CLR_EVT_FN: {		EM_CLR_EVT_PARA *p = para;		return _tkse_clr_evt(p->t_mask, p->last_mask);	  }	  case EM_GET_PDP_FN: {		EM_GET_PDP_PARA *p = para;		return _tkse_get_pdp(p->pos);	  }	  case EM_GET_ETM_FN: {		EM_GET_ETM_PARA *p = para;		return _tkse_get_etm(p->time);	  }	  case EM_CHG_EMK_FN: {		EM_CHG_EMK_PARA *p = para;		return _tkse_chg_emk(p->mask);	  }	  case EM_SET_KRP_FN: {		EM_SET_KRP_PARA *p = para;		return _tkse_set_krp(p->offset, p->interval);	  }	  case EM_GET_KRP_FN: {		EM_GET_KRP_PARA *p = para;		return _tkse_get_krp(p->offset, p->interval);	  }	  case EM_SET_KRM_FN: {		EM_SET_KRM_PARA *p = para;		return _tkse_set_krm(*p->keymap);	  }	  case EM_GET_KRM_FN: {		EM_GET_KRM_PARA *p = para;		return _tkse_get_krm(*p->keymap);	  }	  case EM_REQ_EVT_FN: {		EM_REQ_EVT_PARA *p = para;		return _tkse_req_evt(p->t_mask);	  }	  case EM_LAS_EVT_FN: {		EM_LAS_EVT_PARA *p = para;		return _tkse_las_evt(p->t_mask);	  }	  default: {		/* nothing to do */		break;	  }	}	return E_RSFN;}/* * Cleanup service entry. */LOCAL void emCleanupEntry( ID resid, ID pid ){	/* Delete the event message request. */	(void)emRegistEvtMsg(EM_NULL, pid);}/* ------------------------------------------------------------------------ *//* * Initialize the manager. */LOCAL ER initialize( void ){	/* Clear the event management common information. */	memset(&emInfo, 0, (size_t)sizeof(emInfo));	/* Initialize the automatic repeat key.  */	memset(emInfo.repeatKeymap, 0xff, (size_t)sizeof(KeyMap));	/* Obtain the system configuration information. */	{	W	w[L_SYSCONF_VAL];		W	n;		/* Obtain the task priority. */		n = GetSysConf((UB*)"EmTskPri", w);		if ( n != 1 ) {			DEBUG_PRINT(("init: get EmTskPri error\n"));			return E_SYS;		}		emInfo.evtRcvTskPri = w[0];		/* Obtain the event queue size. */		n = GetSysConf((UB*)"MaxEvtQ", w);		if ( n != 1 ) {			DEBUG_PRINT(("init: get MaxEvtQ error\n"));			return E_SYS;		}		emInfo.maxEvtQue = w[0];		/* Obtain the maximum number of registrations of event message request. */		n = GetSysConf((UB*)"MaxEvMsg", w);		if ( n != 1 ) {			DEBUG_PRINT(("init: get MaxEvMsg error\n"));			return E_SYS;		}		emInfo.maxEvtMsg = w[0];		/* Obtain the automatic event expiration time. */		n = GetSysConf((UB*)"EvtLife", w);		if ( n < 1 ) {			w[0] = TSD_INE_ARR_300;		}		emInfo.evtLifeTime = (UW)w[0];	}	/* Obtain the message buffer for device event receiving. */	emInfo.evtRcvMbf = GetDevEvtMbf();	/* Create the lock for exclusive access. */	{	ER	err;		err = CreateLock(&emInfo.lock, (UB*)"Evt");		if ( err < E_OK ) {			DEBUG_PRINT(("init: create lock err = %d\n", err));			return ERtoERR(err);		}	}	/* Create the event queue. */	{	ER	err;		err = emInitEvtQue();		if ( err < E_OK ) {			DEBUG_PRINT(("init: InitEvtQue err = %d\n", err));			return err;		}	}	/* Create the list for registration of event message request. */	{	EvtMsgEntry	*p;		p = (EvtMsgEntry *)Kcalloc((size_t)emInfo.maxEvtMsg, sizeof(EvtMsgEntry));		if ( p == NULL ) {			DEBUG_PRINT(("init: EvtMsgEntry E_NOMEM"));			return E_NOMEM;		}		emInfo.evtMsgEntry = p;	}	/* Generate/Start the event receiving task. */	{	ID	tskid;		T_CTSK	ctsk;		ER	er;		SetOBJNAME(ctsk.exinf, "Evt");		ctsk.task    = emEventReceiveTask;		ctsk.itskpri = emInfo.evtRcvTskPri;		ctsk.stksz   = TSD_INE_STK_2048;		ctsk.tskatr  = TA_HLNG|TA_RNG0;		er = tk_cre_tsk(&ctsk);		if ( er < E_OK ) {			DEBUG_PRINT(("init: tk_cre_tsk er = %d\n", er));			return ERtoERR(er);		}		tskid = (ID)er;		er = tk_sta_tsk(tskid, 0);		if ( er < E_OK ) {			(void)tk_del_tsk(tskid);			DEBUG_PRINT(("init: tk_sta_tsk er = %d\n", er));			return ERtoERR(er);		}		emInfo.evtRcvTskID = tskid;	}	/* Register the manager. */	{	T_DSSY	dssy;		ER	err;		dssy.ssyatr    = TA_NULL;		dssy.ssypri    = EM_PRI;		dssy.svchdr    = (FP)emSyscallEntry;		dssy.breakfn   = NULL;		dssy.startupfn = NULL;		dssy.cleanupfn = emCleanupEntry;		dssy.eventfn   = NULL;		dssy.resblksz  = 0;		err = tk_def_ssy(EM_SVC, &dssy);		if ( err < E_OK ) {			DEBUG_PRINT(("init: DefManager err = %d\n", err));			return ERtoERR(err);		}	}	return E_OK;}/* * Terminate the manager. */LOCAL ER finish( void ){	ER	error = E_OK;	/* Deregister the manager. */	{	ER	err;		err = tk_def_ssy(EM_SVC, NULL);		if ( err < E_OK ) {			DEBUG_PRINT(("finish: DefManager err = %d\n", err));			error = ERtoERR(err);		}	}	/* Delete the device event receiving task. */	if ( emInfo.evtRcvTskID != InvalidID ) {		ER	er;		er = tk_ter_tsk(emInfo.evtRcvTskID);		if ( er < E_OK ) {			DEBUG_PRINT(("finish: tk_ter_tsk er = %d\n", er));			error = ERtoERR(er);		}		er = tk_del_tsk(emInfo.evtRcvTskID);		if ( er < E_OK ) {			DEBUG_PRINT(("finish: tk_del_tsk er = %d\n", er));			error = ERtoERR(er);		}	}	/* Delete the list for registration of event message request. */	if ( emInfo.evtMsgEntry != NULL ) {		Kfree(emInfo.evtMsgEntry);	}	/* Delete the event queue. */	{	ER	err;		err = emDeleteEvtQue();		if ( err < E_OK ) {			DEBUG_PRINT(("finish: DeleteEvtQue err = %d\n", err));			error = err;		}	}	/* Delete the lock for exclusive access. */	DeleteLock(&emInfo.lock);	return error;}/* * Manager entry *	(Initialization/End processing) */EXPORT ER EventMgr( INT ac, UB *av[] ){	ER	err;	if ( ac >= 0 ) {		/* Initialization */		err = initialize();		if ( err != E_OK ) {			/* Initialization failed */			(void)finish();		}	} else {		/* End processing */		err = finish();	}	return err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -