2 * Hyper Operating System V4 Advance Configurator
5 * @brief %jp{メインルーチン}%en{main}
7 * Copyright (C) 1998-2006 by Project HOS
8 * http://sourceforge.jp/projects/hos/
43 #define DEFAULT_INPUTFILE "system.i"
44 #define DEFAULT_IDFILE "kernel_id.h"
45 #define DEFAULT_CFGFILE "kernel_cfg.c"
48 int ReadConfigFile(FILE* fpConfig); // コンフィギュレーションファイル読み込み
49 void WriteIdFile(FILE* fp); // ID 定義ヘッダファイル出力
50 void WriteCfgFile(FILE* fp); // C 言語ソース出力
51 void PrintUsage(void);
54 CApiInclude g_ApiInclude;
55 CApiKernelHeap g_ApiKernelHeap;
56 CApiDpcQue g_ApiDpcQue;
57 CApiIdleStack g_ApiIdleStack;
58 CApiMaxTpri g_ApiMaxTpri;
59 CApiIntStack g_IntStack;
60 CApiCreTsk g_ApiCreTsk;
61 CApiDefTex g_ApiDefTex;
62 CApiCreSem g_ApiCreSem;
63 CApiCreFlg g_ApiCreFlg;
64 CApiCreDtq g_ApiCreDtq;
65 CApiCreMbx g_ApiCreMbx;
66 CApiCreMtx g_ApiCreMtx;
67 CApiCreMbf g_ApiCreMbf;
68 CApiCreMpf g_ApiCreMpf;
69 CApiTimTic g_ApiTimTic;
70 CApiCreCyc g_ApiCreCyc;
71 CApiCreAlm g_ApiCreAlm;
72 CApiDefInh g_ApiDefInh;
73 CApiAttIsr g_ApiAttIsr;
74 CApiAttIni g_ApiAttIni;
75 CApiDefExc g_ApiDefExc;
77 static const char *s_szPhysicalInputFile = NULL;
78 static const char *s_szIdFile = DEFAULT_IDFILE;
79 static const char *s_szCfgFile = DEFAULT_CFGFILE;
82 static CApiDef* g_ApiList[] =
107 #define API_COUNT ((int)(sizeof(g_ApiList) / sizeof(CApiDef*))) // API個数
113 int main(int argc, char *argv[])
122 for ( i = 1; i < argc; i++ )
124 if ( strcmp(argv[i], "-c") == 0 )
129 fprintf(stderr, "option error \"-c\"\n");
133 s_szCfgFile = argv[i];
135 else if ( strcmp(argv[i], "-i") == 0 )
140 fprintf(stderr, "option error \"-i\"\n");
144 s_szIdFile = argv[i];
146 else if ( strcmp(argv[i], "-help") == 0 )
151 else if ( argv[i][0] == '-' && argv[i][1] != '\0' )
153 fprintf(stderr, "unknown option \"%s\"\n", argv[i]);
159 if ( s_szPhysicalInputFile != NULL )
161 fprintf(stderr, "too many input files\n");
165 s_szPhysicalInputFile = argv[i];
170 if ( s_szPhysicalInputFile == NULL )
172 s_szPhysicalInputFile = DEFAULT_INPUTFILE;
176 if ( strcmp(s_szPhysicalInputFile, "-") == 0) {
177 s_szPhysicalInputFile = "stdin";
180 else if ( (fpInput = fopen(s_szPhysicalInputFile, "r")) == NULL )
182 fprintf(stderr, "could not open file \"%s\"\n", s_szPhysicalInputFile);
186 // コンフィギュレーションファイル読み込み
187 iErr = ReadConfigFile(fpInput) != 0;
195 for ( i = 0; i < API_COUNT; i++ )
197 g_ApiList[i]->AutoId();
201 if ( (fpId = fopen(s_szIdFile, "w")) == NULL )
203 fprintf(stderr, "could not open file \"%s\"\n", s_szIdFile);
213 if ( (fpCfg = fopen(s_szCfgFile, "w")) == NULL )
215 fprintf(stderr, "could not open file \"%s\"\n", s_szCfgFile);
227 // コンフィギュレーションファイル読み込み
228 int ReadConfigFile(FILE* fpConfig)
230 char szState[READ_MAX_STATE];
231 char szApiName[READ_MAX_STATE];
232 char szParams[READ_MAX_STATE];
236 CRead read(fpConfig, s_szPhysicalInputFile); // 読み出しオブジェクト生成
239 while ( (iErr = read.ReadState(szState)) != CFG_ERR_COMPLETE )
242 if ( iErr != CFG_ERR_OK )
244 fprintf(stderr, "%s line(%d) : %s\n",
245 read.GetLogicalInputFile(),
246 read.GetLogicalLineNum(), GetErrMessage(iErr));
251 iErr = CAnalyze::SplitState(szApiName, szParams, szState);
252 if ( iErr != CFG_ERR_OK )
254 fprintf(stderr, "%s line(%d) : %s\n",
255 read.GetLogicalInputFile(),
256 read.GetLogicalLineNum(), GetErrMessage(iErr));
259 CAnalyze::SpaceCut(szApiName);
260 CAnalyze::SpaceCut(szParams);
263 iErr = CFG_ERR_SYNTAX;
264 for ( i = 0; i < API_COUNT; i++ )
266 iErr = g_ApiList[i]->AnalyzeApi(szApiName, szParams);
267 if ( iErr != CFG_ERR_NOPROC )
272 if ( iErr != CFG_ERR_OK )
274 if ( iErr != CFG_ERR_NOPROC )
276 fprintf(stderr, "%s line(%d) : %s\n",
277 read.GetLogicalInputFile(),
278 read.GetLogicalLineNum(), GetErrMessage(iErr));
283 fprintf(stderr, "%s line(%d) : Warning! Ignore unknown API(%s)\n",
284 read.GetLogicalInputFile(),
285 read.GetLogicalLineNum(),
296 void WriteIdFile(FILE* fp)
302 "/* ------------------------------------------------------------------------ */\n"
303 "/* HOS-V4a kernel configuration */\n"
304 "/* kernel object ID definition */\n"
306 "/* ------------------------------------------------------------------------ */\n"
308 "#ifndef __KERNEL__kernel_id_h__\n"
309 "#define __KERNEL__kernel_id_h__\n"
314 for ( i = 0; i < API_COUNT; i++ )
316 g_ApiList[i]->WriteId(fp);
322 "#endif\t/* __KERNEL__kernel_id_h__ */\n"
324 "/* ------------------------------------------------------------------------ */\n"
325 "/* End of file */\n"
326 "/* ------------------------------------------------------------------------ */\n"
332 void WriteCfgFile(FILE* fp)
339 "/* ------------------------------------------------------------------------ */\n"
340 "/* HOS-V4a kernel configuration */\n"
341 "/* kernel object create and initialize */\n"
343 "/* ------------------------------------------------------------------------ */\n"
346 fprintf(fp, "#include \"kernel.h\"\n");
347 fprintf(fp, "#include \"arch/proc/%s/procatr.h\"\n", _KERNEL_PROCATR_INC_PATH);
348 fprintf(fp, "#include \"arch/proc/%s/proc.h\"\n", _KERNEL_PROCATR_INC_PATH);
349 fprintf(fp, "#include \"arch/irc/%s/ircatr.h\"\n", _KERNEL_IRCATR_INC_PATH);
350 fprintf(fp, "#include \"arch/irc/%s/irc.h\"\n", _KERNEL_IRCATR_INC_PATH);
351 fprintf(fp, "#include \"config/cfgknl.h\"\n");
352 fprintf(fp, "#include \"parser/parsknl.h\"\n");
353 fprintf(fp, "#include \"core/objid.h\"\n");
354 fprintf(fp, "#include \"core/objhdl.h\"\n");
355 fprintf(fp, "#include \"object/tskobj.h\"\n");
356 fprintf(fp, "#include \"object/semobj.h\"\n");
357 fprintf(fp, "#include \"object/flgobj.h\"\n");
358 fprintf(fp, "#include \"object/dtqobj.h\"\n");
359 fprintf(fp, "#include \"object/mbxobj.h\"\n");
360 fprintf(fp, "#include \"object/mtxobj.h\"\n");
361 fprintf(fp, "#include \"object/mpfobj.h\"\n");
362 fprintf(fp, "#include \"object/inhobj.h\"\n");
363 fprintf(fp, "#include \"object/isrobj.h\"\n");
364 fprintf(fp, "#include \"object/cycobj.h\"\n");
366 // fprintf(fp, "#include \"%s\"\n", s_szIdFile);
367 fprintf(fp, "#include \"kernel_id.h\"\n");
371 for ( i = 0; i < API_COUNT; i++ )
373 g_ApiList[i]->WriteCfgDef(fp);
379 "/* ------------------------------------------ */\n"
380 "/* initialize functions */\n"
381 "/* ------------------------------------------ */\n",
386 "\n/* object initialize */\n"
387 "void _kernel_cfg_ini(void)\n"
390 for ( i = 0; i < API_COUNT; i++ )
392 g_ApiList[i]->WriteCfgIni(fp);
399 "void _kernel_cfg_sta(void)\n"
402 for ( i = 0; i < API_COUNT; i++ )
404 g_ApiList[i]->WriteCfgStart(fp);
411 "/* ------------------------------------------------------------------------ */\n"
412 "/* End of file */\n"
413 "/* ------------------------------------------------------------------------ */\n"
418 void PrintUsage(void)
421 "usage: hos4cfg [options] [input-file]\n"
423 " -i FILE specify auto-assginment headerfile (default: " DEFAULT_IDFILE ")\n"
424 " -c FILE specify kernel configuration file (default: " DEFAULT_CFGFILE ")\n"
425 " -help show this help\n"
427 "input-file (default: " DEFAULT_INPUTFILE ")\n");