1 // ---------------------------------------------------------------------------
2 // Hyper Operating System V4 Advance Configulator
5 // Copyright (C) 1998-2006 by Project HOS
6 // http://sourceforge.jp/projects/hos/
7 // ---------------------------------------------------------------------------
19 #define CRETSK_TSKID 0
20 #define CRETSK_TSKATR 1
21 #define CRETSK_EXINF 2
23 #define CRETSK_ITSKPRI 4
24 #define CRETSK_STKSZ 5
29 // %jp{コンストラクタ}%en{constructor}
30 CApiCreTsk::CApiCreTsk()
33 m_iDefaultMaxId = _KERNEL_TMAX_TSKID;
36 m_iParamSyntax[0] = 0; // %jp{単独パラメーター}
37 m_iParamSyntax[1] = 6; // %jp{6パラメーターのブロック}
42 // %jp{デストラクタ}%en{destructor}
43 CApiCreTsk::~CApiCreTsk()
49 int CApiCreTsk::AnalyzeApi(const char* pszApiName, const char* pszParams)
51 if ( strcmp(pszApiName, "CRE_TSK") == 0 )
53 return AddParams(pszParams); // %jp{APIとしてパラメータ分解を行う}
55 else if ( strcmp(pszApiName, "KERNEL_MAX_TSKID") == 0 )
61 return CFG_ERR_MULTIDEF;
66 return CFG_ERR_DEF_CONFLICT;
69 if ( (iId = atoi(pszParams)) <= 0 )
78 else if ( strcmp(pszApiName, "KERNEL_RSV_TSKID") == 0 )
84 return CFG_ERR_DEF_CONFLICT;
87 if ( (iId = atoi(pszParams)) <= 0 )
97 return CFG_ERR_NOPROC;
101 // %jp{ID 定義ファイル書き出し}
102 void CApiCreTsk::WriteId(FILE* fp)
107 fputs("\n\n/* Task object ID definetion */\n\n", fp);
110 for ( i = 0; i < m_iObjs; i++ )
112 if ( atoi(m_pParamPacks[i]->GetParam(CRETSK_TSKID)) == 0 )
116 "#define %s\t\t%d\n",
117 m_pParamPacks[i]->GetParam(CRETSK_TSKID),
125 "#ifdef TMAX_TSKID\n"
126 "#undef TMAX_TSKID\n"
129 "#define TMAX_TSKID\t\t%d\n\n", m_iMaxId );
134 // %jp{cfgファイル定義部書き出し}
135 void CApiCreTsk::WriteCfgDef(FILE* fp)
137 const char* pszParam;
143 "/* ------------------------------------------ */\n"
144 "/* create task objects */\n"
145 "/* ------------------------------------------ */\n\n"
150 for ( i = 0; i < m_iObjs; i++ )
152 pszParam = m_pParamPacks[i]->GetParam(CRETSK_STK);
153 if ( strcmp(pszParam, "NULL") == 0 )
157 "static VP _kernel_tsk%d_stk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n",
159 m_pParamPacks[i]->GetParam(CRETSK_STKSZ));
164 #if _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_BLKARRAY
165 #if _KERNEL_TCB_SPLIT_RO
169 fprintf(fp, "\n_KERNEL_T_TCB _kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
170 for ( i = 1; i <= m_iMaxId; i++ )
172 int iObjNum = IdToObjNum(i);
175 fprintf(fp, "\t\t{");
176 WriteTcbRam(fp, iObjNum);
181 fprintf(fp, "\t\t{{0}, },\n");
184 fprintf(fp, "\t};\n");
187 fprintf(fp, "\nconst _KERNEL_T_TCB_RO _kernel_tcb_ro_tbl[%d] =\n\t{\n", m_iMaxId);
188 for ( i = 1; i <= m_iMaxId; i++ )
190 int iObjNum = IdToObjNum(i);
193 fprintf(fp, "\t\t{");
194 WriteTcbRom(fp, iObjNum);
199 fprintf(fp, "\t\t{0},\n");
202 fprintf(fp, "\t};\n\n");
208 fprintf(fp, "\n_KERNEL_T_TCB _kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
209 for ( i = 1; i <= m_iMaxId; i++ )
211 int iObjNum = IdToObjNum(i);
214 fprintf(fp, "\t\t{");
215 WriteTcbRam(fp, iObjNum);
216 WriteTcbRom(fp, iObjNum);
221 fprintf(fp, "\t\t{{0}, },\n");
224 fprintf(fp, "\t};\n");
227 #elif _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_PTRARRAY
228 #if _KERNEL_TCB_SPLIT_RO
232 for ( i = 0; i < m_iObjs; i++ )
234 fprintf(fp, "const _KERNEL_T_TCB_RO _kernel_tcb_ro_blk_%d = {", m_iId[i]);
239 for ( i = 0; i < m_iObjs; i++ )
241 fprintf(fp, "_KERNEL_T_TCB _kernel_tcb_blk_%d = {", m_iId[i]);
246 fprintf(fp, "\n_KERNEL_T_TCB *_kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
247 for ( i = 1; i <= m_iMaxId; i++ )
249 int iObjNum = IdToObjNum(i);
252 fprintf(fp, "\t\t&_kernel_tcb_blk_%d,\n", i);
256 fprintf(fp, "\t\tNULL,\n");
259 fprintf(fp, "\t};\n");
265 for ( i = 0; i < m_iObjs; i++ )
267 fprintf(fp, "_KERNEL_T_TCB _kernel_tcb_blk_%d = {", m_iId[i]);
273 fprintf(fp, "\n_KERNEL_T_TCB *_kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
274 for ( i = 1; i <= m_iMaxId; i++ )
276 int iObjNum = IdToObjNum(i);
279 fprintf(fp, "\t\t&_kernel_tcb_blk_%d,\n", i);
283 fprintf(fp, "\t\tNULL,\n");
286 fprintf(fp, "\t};\n");
294 "\nconst ID _kernel_max_tskid = %d;\n",
300 void CApiCreTsk::WriteTcbRam(FILE *fp, int iObj)
302 #if _KERNEL_TCB_CTXCB
303 fprintf(fp, "{0}, "); /* %jp{タスクのコンテキスト} */
307 fprintf(fp, "NULL, "); /* %jp{属しているキュー} */
310 #if _KERNEL_TCB_QUEOBJ
311 #if _KERNEL_QUE_ALGORITHM == _KERNEL_QUE_ALG_ONEWAYLIST
312 fprintf(fp, "0, "); /* %jp{キューに接続する為のオブジェクト} */
313 #elif _KERNEL_QUE_ALGORITHM == _KERNEL_QUE_ALG_TWOWAYLIST
314 fprintf(fp, "0, 0, "); /* %jp{キューに接続する為のオブジェクト} */
318 #if _KERNEL_TCB_TOQOBJ
319 fprintf(fp, "0, 0, 0, "); /* %jp{タイムアウトキュー} */
322 #if _KERNEL_TCB_TSKSTAT
323 fprintf(fp, "0, "); /* %jp{タスク状態} */
326 #if _KERNEL_TCB_TSKPRI
327 fprintf(fp, "0, "); /* %jp{タスクの現在優先度} */
330 #if _KERNEL_TCB_TSKBPRI
331 fprintf(fp, "0, "); /* %jp{タスクのベース優先度} */
334 #if _KERNEL_TCB_TSKWAIT
335 fprintf(fp, "0, "); /* %jp{待ち要因} */
338 #if _KERNEL_TCB_WOBJID
339 fprintf(fp, "0, "); /* %jp{待ち対象のオブジェクトのID番号} */
342 #if _KERNEL_TCB_ACTCNT
343 fprintf(fp, "0, "); /* %jp{起動要求キューイング回数} */
346 #if _KERNEL_TCB_WUPCNT
347 fprintf(fp, "0, "); /* %jp{起床要求キューイング回数} */
350 #if _KERNEL_TCB_SUSCNT
351 fprintf(fp, "0, "); /* %jp{強制待ち要求ネスト回数} */
354 #if _KERNEL_TCB_MTXHDL
355 fprintf(fp, "0, "); /* %jp{所有するミューテックスのリスト} */
359 fprintf(fp, "0, "); /* ercd */
363 fprintf(fp, "0, "); /* data */
366 #if _KERNEL_TCB_TSKID
367 fprintf(fp, "0, "); /* tskid */
370 #if _KERNEL_TCB_TEXSTAT
371 fprintf(fp, "0, "); /* texstat %jp{タスク例外処理状態} */
374 #if _KERNEL_TCB_RASPTN
375 fprintf(fp, "0, "); /**< rasptn %jp{タスク例外処理要因} */
380 void CApiCreTsk::WriteTcbRom(FILE *fp, int iObj)
382 #if _KERNEL_TCB_TSKATR
383 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_TSKATR)); /**< %jp{タスク属性} */
386 #if _KERNEL_TCB_EXINF /* exinf */
387 fprintf(fp, "(_KERNEL_TSK_T_EXINF)(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_EXINF)); /* %jp{タスクの拡張情報} */
391 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_TASK)); /* %jp{タスクの起動番地} */
394 #if _KERNEL_TCB_ITSKPRI
395 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_ITSKPRI)); /* %jp{タスクの起動時優先度} */
398 #if _KERNEL_TCB_STKSZ
399 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_STKSZ)); /* %jp{タスクのスタックのサイズ(バイト数)} */
403 if ( strcmp(m_pParamPacks[iObj]->GetParam(CRETSK_STK), "NULL") == 0 )
405 fprintf(fp, "_kernel_tsk%d_stk, ", m_iId[iObj];
409 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_STK)); /* %jp{タスクのスタック領域の先頭番地} */
414 if ( strcmp(m_pParamPacks[iObj]->GetParam(CRETSK_STK), "NULL") == 0 )
416 fprintf(fp, "((VB*)_kernel_tsk%d_stk + sizeof(_kernel_tsk%d_stk)), ", m_iId[iObj], m_iId[iObj]);
420 fprintf(fp, "(VP)((VB *)(%s) + (SIZE)(%s)), ", m_pParamPacks[iObj]->GetParam(CRETSK_STK), m_pParamPacks[iObj]->GetParam(CRETSK_STKSZ));
424 #if _KERNEL_TCB_TEXATR
425 fprintf(fp, "0, "); /**< texatr %jp{タスク例外処理ルーチン属性} */
428 #if _KERNEL_TCB_TEXRTN
429 fprintf(fp, "0, "); /**< texrtn %jp{タスク例外処理ルーチンの起動番地} */
436 void CApiCreTsk::WriteCfgIni(FILE* fp)
438 #if _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_PTRARRAY && _KERNEL_TCB_SPLIT_RO
444 fprintf(fp, "\n\t/* Tasks */\n");
445 for ( int i = 0; i < m_iObjs; i++ )
447 fprintf(fp, "\t_kernel_tcb_blk_%d.tcb_ro = &_kernel_tcb_ro_blk_%d;\n", m_iId[i], m_iId[i]);
454 void CApiCreTsk::WriteCfgStart(FILE* fp)
458 for ( i = 0; i < m_iObjs; i++ )
460 if ( strstr(m_pParamPacks[i]->GetParam(CRETSK_TSKATR), "TA_ACT") != NULL )
464 m_pParamPacks[i]->GetParam(CRETSK_TSKID));
471 // ---------------------------------------------------------------------------
472 // Copyright (C) 1998-2006 by Project HOS
473 // ---------------------------------------------------------------------------