www.pudn.com > hos-v4_os.rar > intstk.cpp


// --------------------------------------------------------------------------- 
//  Hyper Operating System V4  コンフィギュレーター                            
//    HOS_INT_STK API の処理                                                   
//                                                                             
//                                    Copyright (C) 1998-2002 by Project HOS   
//                                    http://sourceforge.jp/projects/hos/      
// --------------------------------------------------------------------------- 
 
 
#include  
#include  
#include  
#include "defercd.h" 
#include "intstk.h" 
#include "analyze.h" 
 
 
#define INTSTK_STKSZ		0 
#define INTSTK_STK			1 
 
 
// コンストラクタ 
CApiIntStack::CApiIntStack() 
{ 
	// パラメーター構文設定 
	m_iParamSyntax[0] = 0;		// 単独パラメーター 
	m_iParams = 2; 
 
	// スタックポインタ 
	m_szStackPointer[0] = '\0'; 
} 
 
 
// デストラクタ 
CApiIntStack::~CApiIntStack() 
{ 
} 
 
 
// 自動ID番号割り当て 
int CApiIntStack::AutoId(void) 
{ 
	return CFG_ERR_OK; 
} 
 
 
// APIの解析 
int CApiIntStack::AnalyzeApi(const char* pszApiName, const char* pszParams) 
{ 
	static bool blEx = false; 
  
	if ( strcmp(pszApiName, "HOS_INT_STK") == 0 ) 
	{ 
		if ( blEx == true ) 
		{ 
			return CFG_ERR_MULTIDEF; 
		} 
		blEx = true; 
		return AddParams(pszParams); 
	} 
	else if ( strcmp(pszApiName, "HOS_INT_SP") == 0 ) 
	{ 
		if ( blEx == true ) 
		{ 
			return CFG_ERR_MULTIDEF; 
		} 
		blEx = true; 
		strcpy(m_szStackPointer, pszParams); 
		return CFG_ERR_OK; 
	} 
 
	return CFG_ERR_NOPROC; 
} 
 
 
// cfgファイル定義部書き出し 
void  CApiIntStack::WriteCfgDef(FILE* fp) 
{ 
	const char* pszSize; 
	const char* pszStack; 
 
	// パラメータ読み出し 
	if ( m_iObjs <= 0 && m_szStackPointer[0] == '\0' ) 
	{ 
		return ; 
	} 
 
	// コメント出力 
	fputs( 
		"\n\n\n" 
		"/* ------------------------------------------ */\n" 
		"/*             interrupt stack                */\n" 
		"/* ------------------------------------------ */\n\n" 
		, fp); 
 
	// 割り込み用スタックポインタ出力 
	if ( m_szStackPointer[0] != '\0' ) 
	{ 
		fprintf( 
			fp, 
			"const VP kernel_int_sp = (VP)(%s);\t/* interrupt stack pointer */\n", 
			m_szStackPointer); 
	} 
	else 
	{ 
		pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ); 
		pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK); 
 
		if ( strcmp(pszStack, "NULL") == 0 ) 
		{ 
			fprintf( 
				fp, 
				"VP         kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\t/* interrupt stack block*/\n" 
				"const VP   kernel_int_sp  = &kernel_int_stkblk[sizeof(kernel_int_stkblk) / sizeof(VP)];\t/* interrupt stack pointer */\n", 
				pszSize); 
		} 
		else 
		{ 
			fprintf( 
				fp, 
				"const VP kernel_int_sp = (VP)((UB *)(%s) + (%s));\t/* interrupt stack pointer */\n", 
				pszStack, pszSize); 
		} 
	} 
} 
 
 
// --------------------------------------------------------------------------- 
//  Copyright (C) 1998-2002 by Project HOS                                     
// ---------------------------------------------------------------------------