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

📄 system.c

📁 日本著名的的嵌入式实时操作系统T-Kernel的源码及用户手册。
💻 C
字号:
/* *---------------------------------------------------------------------- *    T-Kernel * *    Copyright (C) 2004 by Ken Sakamura. All rights reserved. *    T-Kernel is distributed under the T-License. *---------------------------------------------------------------------- * *    Version:   1.01.00 *    Released by T-Engine Forum(http://www.t-engine.org) at 2004/6/28. * *---------------------------------------------------------------------- *//* *	system.c (T-Kernel/SM) *	System Information Management Function *	System Memory Management Function */#include "sysmgr.h"#include "syslog.h"#include <sys/imalloc.h>#include <sys/commarea.h>#include <sys/svc/ifsysmgr.h>#include <sys/sysinfo.h>#define	SYSCONF		( SCInfo.sysconf )#define	DEVCONF		( SCInfo.devconf )/* ------------------------------------------------------------------------ *//* *	System information management function *//* * Search 'name' information *	If it is not found, return NULL. */LOCAL UB* search_conf( UB *cp, UB *name ){	INT	len = strlen(name);	UB	*p;	while ( *cp != '\0' ) {		if ( *cp == name[0] ) {			for ( p = cp; *p > ' ' && *p != '#'; ++p );			if ( p - cp == len && memcmp(cp, name, len) == 0 ) {				return cp; /* Found */			}		}		/* Next */		while ( *cp != '\0' && *cp++ != '\n' );	}	return NULL;}/* * Skip to the next word *	If it is the end, return NULL. */LOCAL UB* skip_next( UB *p ){	UB	c;	/* Skip reading current word */	while ( (c = *p) > ' ' && c != '#' ) ++p;	/* Skip reading word separators */	while ( (c = *p) != '\0' ) {		if ( c == '\n' || c == '#' ) break;		if ( c > ' ' ) return p;		p++;	}	return NULL;}/* * Get numeric value information */LOCAL INT getcfn( UB *conf, UB *name, INT *val, INT max ){	UB	*p;	INT	v, n;	p = search_conf(conf, name);	if ( p == NULL ) return E_NOEXS; /* Not found */	n = 0;	while ( (p = skip_next(p)) != NULL ) {		v = strtol((char*)p, (char**)&p, 0);		if ( max-- > 0 ) *val++ = v;		n++;	}	return n;}/* * Get string information */LOCAL INT getcfs( UB *conf, UB *name, UB *bp, INT max ){	UB	*p, *sp, c;	p = search_conf(conf, name);	if ( p == NULL ) return E_NOEXS; /* Not found */	sp = skip_next(p);	if ( sp == NULL ) return 0; /* Date is not defined */	for ( p = sp; (c = *p) != '\0'; ++p ) {		if ( c == '\n' || c == '#' ) break;		if ( max-- > 0 ) *bp++ = c;	}	if ( max > 0 ) *bp = '\0';	return p - sp;}/* * Get system information (numeric values) *	Call directly from T-Kernel/OS. *	Do not call system call and extension SVC because  *	they are also called during starting system. */EXPORT INT _tk_get_cfn( UB *name, INT *val, INT max ){	INT	n;	n = getcfn(SYSCONF, name, val, max);	if ( n < 0 ) {		n = getcfn(DEVCONF, name, val, max);	}	if ( n < 0 ) goto err_ret;	return n;err_ret:	BMS_DEBUG_PRINT(("_tk_get_cfn err = %d\n", n));	return n;}/* * Get system information (numeric values) */LOCAL INT __tk_get_cfn( UB *name, INT *val, INT max ){	ER	err;	err = ChkSpaceBstrR(name, 0);	if ( err < E_OK ) goto err_ret;	err = ChkSpaceRW(val, sizeof(INT) * max);	if ( err < E_OK ) goto err_ret;	err = _tk_get_cfn(name, val, max);	if ( err < E_OK ) goto err_ret;	return err;err_ret:	DEBUG_PRINT(("__tk_get_cfn err = %d\n", err));	return err;}/* * Get system information (strings) *	Call directly from T-Kernel/OS. *	Do not call system call and extension SVC because  *	they are also called during starting system. */EXPORT INT _tk_get_cfs( UB *name, UB *buf, INT max ){	INT	n;	n = getcfs(SYSCONF, name, buf, max);	if ( n < 0 ) {		n = getcfs(DEVCONF, name, buf, max);	}	if ( n < 0 ) goto err_ret;	return n;err_ret:	BMS_DEBUG_PRINT(("_tk_get_cfs err = %d\n", n));	return n;}/* * Get system information (strings) */LOCAL INT __tk_get_cfs( UB *name, UB *buf, INT max ){	ER	err;	err = ChkSpaceBstrR(name, 0);	if ( err < E_OK ) goto err_ret;	err = ChkSpaceRW(buf, max);	if ( err < E_OK ) goto err_ret;	err = _tk_get_cfs(name, buf, max);	if ( err < E_OK ) goto err_ret;	return err;err_ret:	DEBUG_PRINT(("__tk_get_cfs err = %d\n", err));	return err;}/* ------------------------------------------------------------------------ *//* *	System memory management function * *	Only the extension SVC entry part is processed. Real memory  *	management function is in virtual storage system and real storage *	system respectively. *	In virtual storage system, execute by the upper memory management  *	function. *	Real storage system has the memory management function in  *	T-Kernel/SM. */#define	VALID_MEMATR	(TA_RNG3 | TA_NORESIDENT | TA_NOCACHE)/* * Get system memory */LOCAL ER _tk_get_smb( VP *addr, INT nblk, UINT attr ){	ER	err;	if ( (attr & ~VALID_MEMATR) != 0 ) { err = E_PAR; goto err_ret; }	err = ChkSpaceRW(addr, sizeof(VP));	if ( err < E_OK ) goto err_ret;	*addr = GetSysMemBlk(nblk, attr);	if ( *addr == NULL ) { err = E_NOMEM; goto err_ret; }	return E_OK;err_ret:	DEBUG_PRINT(("_tk_get_smb err = %d\n", err));	return err;}/* * Free system memory */LOCAL ER _tk_rel_smb( VP addr ){	ER	err;	err = RelSysMemBlk(addr);	if ( err < E_OK ) goto err_ret;	return E_OK;err_ret:	DEBUG_PRINT(("_tk_rel_smb err = %d\n", err));	return err;}/* * Get system memory information */LOCAL ER _tk_ref_smb( T_RSMB *pk_rsmb ){	ER	err;	err = ChkSpaceRW(pk_rsmb, sizeof(T_RSMB));	if ( err < E_OK ) goto err_ret;	err = RefSysMemInfo(pk_rsmb);	if ( err < E_OK ) goto err_ret;	return E_OK;err_ret:	DEBUG_PRINT(("_tk_ref_smb err = %d\n", err));	return err;}/* ------------------------------------------------------------------------ *//* *	Kernel shared data */LOCAL	CommArea	_CommArea;	/* Kernel shared data area */IMPORT	CommArea	*__CommArea;	/* libtk *//* * Get Kernel shared data */LOCAL ER __GetKernelCommonArea( CommArea **area ){	*area = &_CommArea;	return E_OK;}/* * Kernel shared data initial setting */LOCAL void initKernelCommonArea( void ){	INT	n, val;	__CommArea = &_CommArea;	n = _tk_get_cfn("TEV_FFLock", &val, 1);	_CommArea.tev_fflock = ( n > 0 )? val: 0;}/* ------------------------------------------------------------------------ *//* * Extension SVC entry  */LOCAL INT sysmgr_svcentry( VP pk_para, FN fncd ){	ER	err;	switch ( fncd ) {		/* Ignore protection level */	  case SYSTEM_TK_GET_CFN_FN:	  case SYSTEM_TK_GET_CFS_FN:	  case SYSTEM__SYSLOG_SEND_FN:		break;	  default:		/* Test call protection level */		err = ChkCallPLevel();		if ( err < E_OK ) goto err_ret;	}	switch ( fncd ) {	  case SYSTEM_TK_GET_CFN_FN:		{ SYSTEM_TK_GET_CFN_PARA *p = pk_para;		return __tk_get_cfn(p->name, p->val, p->max); }	  case SYSTEM_TK_GET_CFS_FN:		{ SYSTEM_TK_GET_CFS_PARA *p = pk_para;		return __tk_get_cfs(p->name, p->buf, p->max); }	  case SYSTEM_TK_GET_SMB_FN:		{ SYSTEM_TK_GET_SMB_PARA *p = pk_para;		return _tk_get_smb(p->addr, p->nblk, p->attr); }	  case SYSTEM_TK_REL_SMB_FN:		{ SYSTEM_TK_REL_SMB_PARA *p = pk_para;		return _tk_rel_smb(p->addr); }	  case SYSTEM_TK_REF_SMB_FN:		{ SYSTEM_TK_REF_SMB_PARA *p = pk_para;		return _tk_ref_smb(p->pk_rsmb); }	  case SYSTEM__GETKERNELCOMMONAREA_FN:		{ SYSTEM__GETKERNELCOMMONAREA_PARA *p = pk_para;		return __GetKernelCommonArea(p->area); }	  case SYSTEM__SYSLOG_SEND_FN:		{ SYSTEM__SYSLOG_SEND_PARA *p = pk_para;		return __syslog_send(p->string, p->len); }	}	err = E_RSFN;err_ret:	DEBUG_PRINT(("sysmgr_svcentry err = %d\n", err));	return err;}/* * Initialization of system management */EXPORT ER initialize_sysmgr( void ){	T_DSSY	dssy;	ER	err;	/* Kernel shared data area setting */	initKernelCommonArea();	/* syslog initialization sequence */	err = initialize_syslog();	if ( err < E_OK ) goto err_ret;	/* subsystem registration */	dssy.ssyatr    = TA_NULL;	dssy.ssypri    = SYSTEM_PRI;	dssy.svchdr    = (FP)&sysmgr_svcentry;	dssy.breakfn   = NULL;	dssy.startupfn = NULL;	dssy.cleanupfn = NULL;	dssy.eventfn   = NULL;	dssy.resblksz  = 0;	err = tk_def_ssy(SYSTEM_SVC, &dssy);	if ( err < E_OK ) goto err_ret;	return E_OK;err_ret:	DEBUG_PRINT(("initialize_sysmgr err = %d\n", err));	return err;}/* * Finalization sequence of system management  */EXPORT ER finish_sysmgr( void ){	ER	err, error = E_OK;	/* Unregister subsystem */	err = tk_def_ssy(SYSTEM_SVC, NULL);	if ( err < E_OK ) error = err;	/* syslog finalization sequence */	err = finish_syslog();	if ( err < E_OK ) error = err;#ifdef DEBUG	if ( error < E_OK ) DEBUG_PRINT(("finish_sysmgr err = %d\n", error));#endif	return error;}

⌨️ 快捷键说明

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