www.pudn.com > hos-v4_os.rar > attisr.cpp, change:2002-08-31,size:4540b
// --------------------------------------------------------------------------- // Hyper Operating System V4 コンフィギュレーター // ATT_ISR API の処理 // // Copyright (C) 1998-2002 by Project HOS // http://sourceforge.jp/projects/hos/ // --------------------------------------------------------------------------- #include#include #include #include "defercd.h" #include "attisr.h" #include "analyze.h" #define ATTISR_ISRATR 0 #define ATTISR_EXINF 1 #define ATTISR_INTNO 2 #define ATTISR_ISR 3 // コンストラクタ CApiAttIsr::CApiAttIsr() { // パラメーター構文設定 m_iParamSyntax[0] = 4; // 4つのパラメーターブロック m_iParams = 1; m_iMaxIntNo = 0; m_iMinIntNo = 0; m_iMaxIsrId = 0; } // デストラクタ CApiAttIsr::~CApiAttIsr() { } // 自動ID番号割り当て int CApiAttIsr::AutoId(void) { return CFG_ERR_OK; } // APIの解析 int CApiAttIsr::AnalyzeApi(const char* pszApiName, const char* pszParams) { static bool blExMax = false; static bool blExMin = false; static bool blExMid = false; if ( strcmp(pszApiName, "ATT_ISR") == 0 ) { return AddParams(pszParams); } else if ( strcmp(pszApiName, "HOS_MAX_INTNO") == 0 ) { int iIntNo; if ( blExMax == true ) { return CFG_ERR_MULTIDEF; } blExMax = true; if ( (iIntNo = atoi(pszParams)) < 0 ) { return CFG_ERR_PARAM; } if ( iIntNo > m_iMaxIntNo ) { m_iMaxIntNo = iIntNo; } return CFG_ERR_OK; } else if ( strcmp(pszApiName, "HOS_MIN_INTNO") == 0 ) { int iIntNo; if ( blExMin == true ) { return CFG_ERR_MULTIDEF; } blExMin = true; if ( (iIntNo = atoi(pszParams)) < 0 ) { return CFG_ERR_PARAM; } if ( iIntNo < m_iMinIntNo ) { m_iMinIntNo = iIntNo; } return CFG_ERR_OK; } else if ( strcmp(pszApiName, "HOS_MAX_ISRID") == 0 ) { int iId; if ( blExMid == true ) { return CFG_ERR_MULTIDEF; } blExMid = true; if ( (iId = atoi(pszParams)) < 0 ) { return CFG_ERR_PARAM; } if ( iId > m_iMaxIsrId ) { m_iMaxIsrId = iId; } return CFG_ERR_OK; } return CFG_ERR_NOPROC; } // cfgファイル定義部書き出し void CApiAttIsr::WriteCfgDef(FILE* fp) { // コメント出力 fputs( "\n\n\n" "/* ------------------------------------------ */\n" "/* interrupt control objects */\n" "/* ------------------------------------------ */\n" , fp); // 割り込み管理テーブル生成 fprintf( fp, "\n" "/* interrupt control */\n" "T_KERNEL_INTCB kernel_intcb_tbl[%d];\t\t/* interrupt control block table */\n" "const INT kernel_intcb_cnt = %d;\t\t/* interrupt control block count */\n" "const INTNO kernel_min_intno = %d;\t\t/* minimum intrrupt number */\n", m_iMaxIntNo - m_iMinIntNo + 1, m_iMaxIntNo - m_iMinIntNo + 1, m_iMinIntNo); // ISRコントロールテーブル生成 if ( m_iMaxIsrId > 0 ) { fprintf( fp, "\n" "/* interrupt service routine control */\n" "T_KERNEL_ISRCB kernel_isrcb_tbl[%d];\t\t/* ISR control block table */\n" "const INT kernel_isrcb_cnt = %d;\t\t/* ISR control block count */\n", m_iMaxIsrId, m_iMaxIsrId); } else { fprintf( fp, "\n" "/* interrupt service routine control */\n" "const INT kernel_isrcb_cnt = %d;\t\t/* ISR control block count */\n", m_iMaxIsrId); } } // cfgファイル初期化部書き出し void CApiAttIsr::WriteCfgIni(FILE* fp) { int i; // オブジェクト存在チェック if ( m_iObjs == 0 ) { return; } // コメント出力 fputs("\n\t/* initialize interrupt table */\n", fp); // 初期化部出力 for ( i = 0; i < m_iObjs; i++ ) { fprintf( fp, "\tkernel_intcb_tbl[%s].exinf = (VP_INT)(%s);\n" "\tkernel_intcb_tbl[%s].isr = (FP)(%s);\n", m_pParamPacks[i]->GetParam(ATTISR_INTNO), m_pParamPacks[i]->GetParam(ATTISR_EXINF), m_pParamPacks[i]->GetParam(ATTISR_INTNO), m_pParamPacks[i]->GetParam(ATTISR_ISR)); } } // --------------------------------------------------------------------------- // Copyright (C) 1998-2002 by Project HOS // ---------------------------------------------------------------------------