1 // ---------------------------------------------------------------------------
2 // Hyper Operating System V4 Advance Configulator
5 // Copyright (C) 1998-2006 by Project HOS
6 // http://sourceforge.jp/projects/hos/
7 // ---------------------------------------------------------------------------
20 #define CRETSK_TSKID 0
21 #define CRETSK_TSKATR 1
22 #define CRETSK_EXINF 2
24 #define CRETSK_ITSKPRI 4
25 #define CRETSK_STKSZ 5
30 // %jp{コンストラクタ}%en{constructor}
31 CApiCreTsk::CApiCreTsk()
34 m_iParamSyntax[0] = 0; // %jp{単独パラメーター}
35 m_iParamSyntax[1] = 6; // %jp{6パラメーターのブロック}
40 // %jp{デストラクタ}%en{destructor}
41 CApiCreTsk::~CApiCreTsk()
47 int CApiCreTsk::AnalyzeApi(const char* pszApiName, const char* pszParams)
49 if ( strcmp(pszApiName, "CRE_TSK") == 0 )
51 return AddParams(pszParams); // %jp{APIとしてパラメータ分解を行う}
53 else if ( strcmp(pszApiName, "KERNEL_MAX_TSKID") == 0 )
57 return CFG_ERR_MULTIDEF;
61 if ( (iId = atoi(pszParams)) <= 0 )
71 return CFG_ERR_NOPROC;
76 int CApiCreTsk::AutoId(void)
80 m_iMaxId = _KERNEL_TMAX_TSKID;
83 return CApiDef::AutoId();
89 void CApiCreTsk::WriteId(FILE* fp)
94 fputs("\n\n/* Task object ID definetion */\n\n", fp);
97 for ( i = 0; i < m_iObjs; i++ )
99 if ( atoi(m_pParamPacks[i]->GetParam(CRETSK_TSKID)) == 0 )
103 "#define %s\t\t%d\n",
104 m_pParamPacks[i]->GetParam(CRETSK_TSKID),
112 "#ifdef TMAX_TSKID\n"
113 "#undef TMAX_TSKID\n"
116 "#define TMAX_TSKID\t\t%d\n\n", m_iMaxId );
121 // %jp{cfgファイル定義部書き出し}
122 void CApiCreTsk::WriteCfgDef(FILE* fp)
124 const char* pszParam;
130 "/* ------------------------------------------ */\n"
131 "/* create task objects */\n"
132 "/* ------------------------------------------ */\n\n"
137 for ( i = 0; i < m_iObjs; i++ )
139 pszParam = m_pParamPacks[i]->GetParam(CRETSK_STK);
140 if ( strcmp(pszParam, "NULL") == 0 )
144 "static VP _kernel_tsk%d_stk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n",
146 m_pParamPacks[i]->GetParam(CRETSK_STKSZ));
151 #if _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_BLKARRAY
152 #if _KERNEL_TCB_SPLIT_RO
156 fprintf(fp, "\n_KERNEL_T_TCB _kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
157 for ( i = 1; i <= m_iMaxId; i++ )
159 int iObjNum = IdToObjNum(i);
162 fprintf(fp, "\t\t{");
163 WriteTcbRam(fp, iObjNum);
168 fprintf(fp, "\t\t{{0}, },\n");
171 fprintf(fp, "\t};\n");
174 fprintf(fp, "\nconst _KERNEL_T_TCB_RO _kernel_tcb_ro_tbl[%d] =\n\t{\n", m_iMaxId);
175 for ( i = 1; i <= m_iMaxId; i++ )
177 int iObjNum = IdToObjNum(i);
180 fprintf(fp, "\t\t{");
181 WriteTcbRom(fp, iObjNum);
186 fprintf(fp, "\t\t{0},\n");
189 fprintf(fp, "\t};\n\n");
195 fprintf(fp, "\n_KERNEL_T_TCB _kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
196 for ( i = 1; i <= m_iMaxId; i++ )
198 int iObjNum = IdToObjNum(i);
201 fprintf(fp, "\t\t{");
202 WriteTcbRam(fp, iObjNum);
203 WriteTcbRom(fp, iObjNum);
208 fprintf(fp, "\t\t{{0}, },\n");
211 fprintf(fp, "\t};\n");
214 #elif _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_PTRARRAY
215 #if _KERNEL_TCB_SPLIT_RO
219 for ( i = 0; i < m_iObjs; i++ )
221 fprintf(fp, "const _KERNEL_T_TCB_RO _kernel_tcb_ro_blk_%d = {", m_iId[i]);
226 for ( i = 0; i < m_iObjs; i++ )
228 fprintf(fp, "_KERNEL_T_TCB _kernel_tcb_blk_%d = {", m_iId[i]);
233 fprintf(fp, "\n_KERNEL_T_TCB *_kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
234 for ( i = 1; i <= m_iMaxId; i++ )
236 int iObjNum = IdToObjNum(i);
239 fprintf(fp, "\t\t&_kernel_tcb_blk_%d,\n", i);
243 fprintf(fp, "\t\tNULL,\n");
246 fprintf(fp, "\t};\n");
252 for ( i = 0; i < m_iObjs; i++ )
254 fprintf(fp, "_KERNEL_T_TCB _kernel_tcb_blk_%d = {", m_iId[i]);
260 fprintf(fp, "\n_KERNEL_T_TCB *_kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
261 for ( i = 1; i <= m_iMaxId; i++ )
263 int iObjNum = IdToObjNum(i);
266 fprintf(fp, "\t\t&_kernel_tcb_blk_%d,\n", i);
270 fprintf(fp, "\t\tNULL,\n");
273 fprintf(fp, "\t};\n");
281 "\nconst ID _kernel_max_tskid = %d;\n",
287 void CApiCreTsk::WriteTcbRam(FILE *fp, int iObj)
289 #if _KERNEL_TCB_CTXCB
290 fprintf(fp, "{0}, "); /* %jp{タスクのコンテキスト} */
294 fprintf(fp, "NULL, "); /* %jp{属しているキュー} */
297 #if _KERNEL_TCB_QUEOBJ
298 #if _KERNEL_QUE_ALGORITHM == _KERNEL_QUE_ALG_ONEWAYLIST
299 fprintf(fp, "0, "); /* %jp{キューに接続する為のオブジェクト} */
300 #elif _KERNEL_QUE_ALGORITHM == _KERNEL_QUE_ALG_TWOWAYLIST
301 fprintf(fp, "0, 0, "); /* %jp{キューに接続する為のオブジェクト} */
305 #if _KERNEL_TCB_TOQOBJ
306 fprintf(fp, "0, 0, 0, "); /* %jp{タイムアウトキュー} */
309 #if _KERNEL_TCB_TSKSTAT
310 fprintf(fp, "0, "); /* %jp{タスク状態} */
313 #if _KERNEL_TCB_TSKPRI
314 fprintf(fp, "0, "); /* %jp{タスクの現在優先度} */
317 #if _KERNEL_TCB_TSKBPRI
318 fprintf(fp, "0, "); /* %jp{タスクのベース優先度} */
321 #if _KERNEL_TCB_TSKWAIT
322 fprintf(fp, "0, "); /* %jp{待ち要因} */
325 #if _KERNEL_TCB_WOBJID
326 fprintf(fp, "0, "); /* %jp{待ち対象のオブジェクトのID番号} */
329 #if _KERNEL_TCB_ACTCNT
330 fprintf(fp, "0, "); /* %jp{起動要求キューイング回数} */
333 #if _KERNEL_TCB_WUPCNT
334 fprintf(fp, "0, "); /* %jp{起床要求キューイング回数} */
337 #if _KERNEL_TCB_SUSCNT
338 fprintf(fp, "0, "); /* %jp{強制待ち要求ネスト回数} */
342 fprintf(fp, "0, "); /* ercd */
346 fprintf(fp, "0, "); /* data */
349 #if _KERNEL_TCB_TSKID
350 fprintf(fp, "0, "); /* tskid */
355 void CApiCreTsk::WriteTcbRom(FILE *fp, int iObj)
357 #if _KERNEL_TCB_TSKATR
358 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_TSKATR)); /**< %jp{タスク属性} */
361 #if _KERNEL_TCB_EXINF /* exinf */
362 fprintf(fp, "(_KERNEL_TSK_T_EXINF)(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_EXINF)); /* %jp{タスクの拡張情報} */
366 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_TASK)); /* %jp{タスクの起動番地} */
369 #if _KERNEL_TCB_ITSKPRI
370 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_ITSKPRI)); /* %jp{タスクの起動時優先度} */
373 #if _KERNEL_TCB_STKSZ
374 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_STKSZ)); /* %jp{タスクのスタックのサイズ(バイト数)} */
378 if ( strcmp(m_pParamPacks[iObj]->GetParam(CRETSK_STK), "NULL") == 0 )
380 fprintf(fp, "_kernel_tsk%d_stk, ", m_iId[iObj];
384 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_STK)); /* %jp{タスクのスタック領域の先頭番地} */
389 if ( strcmp(m_pParamPacks[iObj]->GetParam(CRETSK_STK), "NULL") == 0 )
391 fprintf(fp, "((VB*)_kernel_tsk%d_stk + sizeof(_kernel_tsk%d_stk)), ", m_iId[iObj], m_iId[iObj]);
395 fprintf(fp, "(VP)((VB *)(%s) + (SIZE)(%s)), ", m_pParamPacks[iObj]->GetParam(CRETSK_STK), m_pParamPacks[iObj]->GetParam(CRETSK_STKSZ));
403 void CApiCreTsk::WriteCfgIni(FILE* fp)
405 #if _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_PTRARRAY && _KERNEL_TCB_SPLIT_RO
411 fprintf(fp, "\n\t/* Tasks */\n");
412 for ( int i = 0; i < m_iObjs; i++ )
414 fprintf(fp, "\t_kernel_tcb_blk_%d.tcb_ro = &_kernel_tcb_ro_blk_%d;\n", m_iId[i], m_iId[i]);
421 void CApiCreTsk::WriteCfgStart(FILE* fp)
425 for ( i = 0; i < m_iObjs; i++ )
427 if ( strstr(m_pParamPacks[i]->GetParam(CRETSK_TSKATR), "TA_ACT") != NULL )
431 m_pParamPacks[i]->GetParam(CRETSK_TSKID));
438 // ---------------------------------------------------------------------------
439 // Copyright (C) 1998-2006 by Project HOS
440 // ---------------------------------------------------------------------------