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

📄 multsk.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 C
字号:
/*
 *  asixos/fs/multsk.c
 *
 *  Copyright (C) 2002 Asic Center
 *	
 *	2002-08-21	Created by Pessia
 */

/*
 * 'multsk.c' is the file of multi-task operation in AsixOS file system.
 * It contains 
 */

#include <kernel\ros33\ros33.h>
#include <..\syssrc\kernel\ros33\drball\internal.h>


/*
 * Get current task's read/write pointer of the file according to the
 * flag 'fp'.
 * Return value: 
 *		>0: curp
 *		0 : failed
 */
unsigned int get_curp( unsigned int fp ){	
	register T_FSCB_ITEM *p;
	unsigned int curp;
	register int i;
	UH psr;
	
	curp = 0;
	
	psr = ent_cri();
	
	p = (T_FSCB_ITEM *)(g_pCurTsk->fscb.items);
	for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
		if ( fp == p->fp ){
			curp = p->curp;
			break;
		}
	}
	
	ret_cri(psr);
	return curp;
}

/*
 * Set current task's read/write pointer of the file according to the
 * flag 'fp'.
 * Return value: 
 *		>0: curp
 *		0 : failed
 */
unsigned int set_curp( unsigned int fp, unsigned int curp ){
	register T_FSCB_ITEM *p;
	register int i;
	UH psr;
	
	psr = ent_cri();
	
	p = (T_FSCB_ITEM *)(g_pCurTsk->fscb.items);
	for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
		if ( fp == p->fp ){
			p->curp = curp;
			break;
		}
	}
	
	ret_cri(psr);
	return curp;
}

/*
 * Init 'T_FSCB'.
 * It is only called during system initial, so it needn't 
 * critical section.
 */
void init_fscb( T_FSCB *pfscb ){
	register int i;
	register T_FSCB_ITEM *p;
	
	p = (T_FSCB_ITEM *)(pfscb->items);
	for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
		p->fp = 0;
		p->curp = 0;
	}
	
	pfscb->opened_num = 0;
}


/*
 * Check whether current task can open a new file or not.
 *		0  : Yes
 * 		-1 : No
 */
int check_opened_file_num( void ){
	register T_FSCB *pfscb;
	
	pfscb = &g_pCurTsk->fscb;
	if ( pfscb->opened_num < MAX_OPENED_FILE_NUM_PER_TASK )
		return 0;
	else
		return -1;
}


/*
 * Get an item from current task's 'T_FSCB'.
 *		0  : succes
 * 		-1 : fail
 */
int get_fscb_item( unsigned int fp ){
	register T_FSCB_ITEM *p;
	register T_FSCB *pfscb;
	register int i;
	UH psr;
	
	psr = ent_cri();
	
	pfscb = &g_pCurTsk->fscb;
	if ( pfscb->opened_num <= MAX_OPENED_FILE_NUM_PER_TASK ){
		p = (T_FSCB_ITEM *)(pfscb->items);
		for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
			if ( p->fp == fp ){
				ret_cri(psr);
				return 0;
			}
		}
		p = (T_FSCB_ITEM *)(pfscb->items);
		for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
			if ( p->fp == 0 ){
				p->fp = fp;
				p->curp = 0;
				pfscb->opened_num++;
				ret_cri(psr);
				return 0;
			}
		}
	}
	
	ret_cri(psr);
	return (-1);
}


/*
 * Remove an item from current task's 'T_FSCB'.
 *		0  : succes
 * 		-1 : fail
 */
int remove_fscb_item( unsigned int fp ){
	register T_FSCB_ITEM *p;
	register T_FSCB *pfscb;
	register int i;
	UH psr;
	
	psr = ent_cri();
	
	pfscb = &g_pCurTsk->fscb;
	if ( pfscb->opened_num ){
		p = (T_FSCB_ITEM *)(pfscb->items);
		for ( i=0; i<MAX_OPENED_FILE_NUM_PER_TASK; i++, p++ ){
			if ( p->fp == fp ){
				p->fp = 0;
				p->curp = 0;
				pfscb->opened_num--;
				ret_cri(psr);
				return 0;
			}
		}
	}
	
	ret_cri(psr);
	return (-1);
}

⌨️ 快捷键说明

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