OSDN Git Service

(none)
[hos/hos-v4a.git] / cfgrtr / source / cretsk.cpp
1 // ---------------------------------------------------------------------------
2 //  Hyper Operating System V4 Advance Configulator                          
3 //    CRE_TSK API                                                      
4 //                                                                            
5 //                                    Copyright (C) 1998-2006 by Project HOS  
6 //                                    http://sourceforge.jp/projects/hos/     
7 // ---------------------------------------------------------------------------
8
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include "defercd.h"
14 #include "cretsk.h"
15 #include "analyze.h"
16 #include "readcfg.h"
17
18 // parameter
19 #define CRETSK_TSKID            0
20 #define CRETSK_TSKATR           1
21 #define CRETSK_EXINF            2
22 #define CRETSK_TASK                     3
23 #define CRETSK_ITSKPRI          4
24 #define CRETSK_STKSZ            5
25 #define CRETSK_STK                      6
26
27
28
29 // %jp{コンストラクタ}%en{constructor}
30 CApiCreTsk::CApiCreTsk()
31 {
32         // %jp{デフォルトの最大ID設定}
33         m_iDefaultMaxId = _KERNEL_TMAX_TSKID;
34
35         // %jp{パラメーター構文設定}
36         m_iParamSyntax[0] = 0;          // %jp{単独パラメーター}
37         m_iParamSyntax[1] = 6;          // %jp{6パラメーターのブロック}
38         m_iParams = 2;
39 }
40
41
42 // %jp{デストラクタ}%en{destructor}
43 CApiCreTsk::~CApiCreTsk()
44 {
45 }
46
47
48 // %jp{APIの解析}
49 int CApiCreTsk::AnalyzeApi(const char* pszApiName, const char* pszParams)
50 {
51         if ( strcmp(pszApiName, "CRE_TSK") == 0 )
52         {
53                 return AddParams(pszParams);                            // %jp{APIとしてパラメータ分解を行う}
54         }
55         else if ( strcmp(pszApiName, "KERNEL_MAX_TSKID") == 0 )
56         {
57                 int iId;
58
59                 if ( m_iMaxId > 0 )
60                 {
61                         return CFG_ERR_MULTIDEF;
62                 }
63
64                 if ( m_iResObj > 0 )
65                 {
66                         return CFG_ERR_DEF_CONFLICT;
67                 }
68                 
69                 if ( (iId = atoi(pszParams)) <= 0 )
70                 {
71                         return CFG_ERR_PARAM;
72                 }
73                 
74                 m_iMaxId = iId;
75                 
76                 return CFG_ERR_OK;
77         }
78         else if ( strcmp(pszApiName, "KERNEL_RSV_TSKID") == 0 )
79         {
80                 int iId;
81
82                 if ( m_iMaxId > 0 )
83                 {
84                         return CFG_ERR_DEF_CONFLICT;
85                 }
86
87                 if ( (iId = atoi(pszParams)) <= 0 )
88                 {
89                         return CFG_ERR_PARAM;
90                 }
91
92                 m_iResObj += iId;
93
94                 return CFG_ERR_OK;
95         }
96         
97         return CFG_ERR_NOPROC;
98 }
99
100
101 // %jp{ID 定義ファイル書き出し}
102 void CApiCreTsk::WriteId(FILE* fp)
103 {
104         int i;
105         
106         // %jp{コメントを出力}
107         fputs("\n\n/* Task object ID definetion */\n\n", fp);
108
109         // %jp{ID定義を出力}
110         for ( i = 0; i < m_iObjs; i++ )
111         {
112                 if ( atoi(m_pParamPacks[i]->GetParam(CRETSK_TSKID)) == 0 )
113                 {
114                         fprintf(
115                                 fp,
116                                 "#define %s\t\t%d\n",
117                                 m_pParamPacks[i]->GetParam(CRETSK_TSKID),
118                                 m_iId[i]);
119                 }
120         }
121         
122         // %jp{ID最大値定義を出力}
123         fprintf( fp,
124                 "\n"
125                 "#ifdef  TMAX_TSKID\n"
126                 "#undef  TMAX_TSKID\n"
127                 "#endif\n"
128                 "\n"
129                 "#define TMAX_TSKID\t\t%d\n\n", m_iMaxId );
130 }
131
132
133
134 // %jp{cfgファイル定義部書き出し}
135 void CApiCreTsk::WriteCfgDef(FILE* fp)
136 {
137         const char* pszParam;
138         int         i;
139         
140         // %jp{コメント出力}
141         fputs(
142                 "\n\n\n"
143                 "/* ------------------------------------------ */\n"
144                 "/*          create task objects               */\n"
145                 "/* ------------------------------------------ */\n\n"
146                 , fp);
147         
148         
149         // %jp{スタック領域出力}
150         for ( i = 0; i < m_iObjs; i++ )
151         {
152                 pszParam = m_pParamPacks[i]->GetParam(CRETSK_STK);
153                 if ( strcmp(pszParam, "NULL") == 0 )
154                 {
155                         fprintf(
156                                 fp,
157                                 "static VP _kernel_tsk%d_stk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n",
158                                 m_iId[i],
159                                 m_pParamPacks[i]->GetParam(CRETSK_STKSZ));
160                 }
161         }
162         
163
164 #if _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_BLKARRAY
165 #if _KERNEL_TCB_SPLIT_RO
166         // %jp{ブロック配列&ROM分離}
167         {
168                 // %jp{RAM部出力}
169                 fprintf(fp, "\n_KERNEL_T_TCB _kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
170                 for ( i = 1; i <= m_iMaxId; i++ )
171                 {
172                         int iObjNum = IdToObjNum(i);
173                         if ( iObjNum >= 0 )
174                         {
175                                 fprintf(fp, "\t\t{");
176                                 WriteTcbRam(fp, iObjNum);
177                                 fprintf(fp, "},\n");
178                         }
179                         else
180                         {
181                                 fprintf(fp, "\t\t{{0}, },\n");
182                         }
183                 }
184                 fprintf(fp, "\t};\n");
185
186                 // %jp{ROM部出力}
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++ )
189                 {
190                         int iObjNum = IdToObjNum(i);
191                         if ( iObjNum >= 0 )
192                         {
193                                 fprintf(fp, "\t\t{");
194                                 WriteTcbRom(fp, iObjNum);
195                                 fprintf(fp, "},\n");
196                         }
197                         else
198                         {
199                                 fprintf(fp, "\t\t{0},\n");
200                         }
201                 }
202                 fprintf(fp, "\t};\n\n");
203         }
204 #else
205         // ブロック配列&統合TCB
206         {
207                 // %jp{RAM部出力}
208                 fprintf(fp, "\n_KERNEL_T_TCB _kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
209                 for ( i = 1; i <= m_iMaxId; i++ )
210                 {
211                         int iObjNum = IdToObjNum(i);
212                         if ( iObjNum >= 0 )
213                         {
214                                 fprintf(fp, "\t\t{");
215                                 WriteTcbRam(fp, iObjNum);
216                                 WriteTcbRom(fp, iObjNum);
217                                 fprintf(fp, "},\n");
218                         }
219                         else
220                         {
221                                 fprintf(fp, "\t\t{{0}, },\n");
222                         }
223                 }
224                 fprintf(fp, "\t};\n");
225         }
226 #endif
227 #elif _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_PTRARRAY
228 #if _KERNEL_TCB_SPLIT_RO
229         // ポインタ配列&ROM分離
230         {
231                 fprintf(fp, "\n");
232                 for ( i = 0; i < m_iObjs; i++ )
233                 {
234                         fprintf(fp, "const _KERNEL_T_TCB_RO _kernel_tcb_ro_blk_%d = {", m_iId[i]);
235                         WriteTcbRom(fp, i);
236                         fprintf(fp, "};\n");
237                 }
238                 fprintf(fp, "\n");
239                 for ( i = 0; i < m_iObjs; i++ )
240                 {
241                         fprintf(fp, "_KERNEL_T_TCB _kernel_tcb_blk_%d = {", m_iId[i]);
242                         WriteTcbRam(fp, i);
243                         fprintf(fp, "};\n");
244                 }
245                 fprintf(fp, "\n");
246                 fprintf(fp, "\n_KERNEL_T_TCB *_kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
247                 for ( i = 1; i <= m_iMaxId; i++ )
248                 {
249                         int iObjNum = IdToObjNum(i);
250                         if ( iObjNum >= 0 )
251                         {
252                                 fprintf(fp, "\t\t&_kernel_tcb_blk_%d,\n", i);
253                         }
254                         else
255                         {
256                                 fprintf(fp, "\t\tNULL,\n");
257                         }
258                 }
259                 fprintf(fp, "\t};\n");          
260         }
261 #else
262         // ポインタ配列&統合TCB
263         {
264                 fprintf(fp, "\n");
265                 for ( i = 0; i < m_iObjs; i++ )
266                 {
267                         fprintf(fp, "_KERNEL_T_TCB _kernel_tcb_blk_%d = {", m_iId[i]);
268                         WriteTcbRam(fp, i);
269                         WriteTcbRom(fp, i);
270                         fprintf(fp, "};\n");
271                 }
272                 fprintf(fp, "\n");
273                 fprintf(fp, "\n_KERNEL_T_TCB *_kernel_tcb_tbl[%d] =\n\t{\n", m_iMaxId);
274                 for ( i = 1; i <= m_iMaxId; i++ )
275                 {
276                         int iObjNum = IdToObjNum(i);
277                         if ( iObjNum >= 0 )
278                         {
279                                 fprintf(fp, "\t\t&_kernel_tcb_blk_%d,\n", i);
280                         }
281                         else
282                         {
283                                 fprintf(fp, "\t\tNULL,\n");
284                         }
285                 }
286                 fprintf(fp, "\t};\n");          
287         }
288 #endif
289 #endif
290         
291         // %jp{タスク情報出力}
292         fprintf(
293                 fp,
294                 "\nconst ID     _kernel_max_tskid = %d;\n",
295                 m_iMaxId);
296 }
297
298
299
300 void CApiCreTsk::WriteTcbRam(FILE *fp, int iObj)
301 {
302 #if _KERNEL_TCB_CTXCB
303         fprintf(fp, "{0}, ");                           /* %jp{タスクのコンテキスト} */
304 #endif
305
306 #if _KERNEL_TCB_QUE
307         fprintf(fp, "NULL, ");                          /* %jp{属しているキュー} */
308 #endif
309
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{キューに接続する為のオブジェクト} */
315 #endif
316 #endif
317         
318 #if _KERNEL_TCB_TOQOBJ
319         fprintf(fp, "0, 0, 0, ");                       /* %jp{タイムアウトキュー} */
320 #endif
321
322 #if _KERNEL_TCB_TSKSTAT
323         fprintf(fp, "0, ");                                     /* %jp{タスク状態} */
324 #endif
325
326 #if _KERNEL_TCB_TSKPRI
327         fprintf(fp, "0, ");                                     /* %jp{タスクの現在優先度} */
328 #endif
329
330 #if _KERNEL_TCB_TSKBPRI
331         fprintf(fp, "0, ");                                     /* %jp{タスクのベース優先度} */
332 #endif
333
334 #if _KERNEL_TCB_TSKWAIT
335         fprintf(fp, "0, ");                                     /* %jp{待ち要因} */
336 #endif
337
338 #if _KERNEL_TCB_WOBJID
339         fprintf(fp, "0, ");                                     /* %jp{待ち対象のオブジェクトのID番号} */
340 #endif
341
342 #if _KERNEL_TCB_ACTCNT
343         fprintf(fp, "0, ");                                     /* %jp{起動要求キューイング回数} */
344 #endif
345
346 #if _KERNEL_TCB_WUPCNT
347         fprintf(fp, "0, ");                                     /* %jp{起床要求キューイング回数} */
348 #endif
349
350 #if _KERNEL_TCB_SUSCNT
351         fprintf(fp, "0, ");                                     /* %jp{強制待ち要求ネスト回数} */
352 #endif
353
354 #if _KERNEL_TCB_MTXHDL
355         fprintf(fp, "0, ");                                     /* %jp{所有するミューテックスのリスト} */        
356 #endif
357
358 #if _KERNEL_TCB_ERCD
359         fprintf(fp, "0, ");                                     /* ercd */
360 #endif
361
362 #if _KERNEL_TCB_DATA
363         fprintf(fp, "0, ");                                     /* data */
364 #endif
365
366 #if _KERNEL_TCB_TSKID
367         fprintf(fp, "0, ");                                     /* tskid */
368 #endif
369
370 #if _KERNEL_TCB_TEXSTAT
371         fprintf(fp, "0, ");                                     /* texstat %jp{タスク例外処理状態} */
372 #endif
373
374 #if _KERNEL_TCB_RASPTN
375         fprintf(fp, "0, ");                                     /**< rasptn %jp{タスク例外処理要因} */
376 #endif
377 }
378
379
380 void CApiCreTsk::WriteTcbRom(FILE *fp, int iObj)
381 {
382 #if _KERNEL_TCB_TSKATR
383         fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_TSKATR));    /**< %jp{タスク属性} */
384 #endif
385
386 #if _KERNEL_TCB_EXINF   /* exinf */
387         fprintf(fp, "(_KERNEL_TSK_T_EXINF)(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_EXINF));                /* %jp{タスクの拡張情報} */
388 #endif
389
390 #if _KERNEL_TCB_TASK
391         fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_TASK));              /* %jp{タスクの起動番地} */
392 #endif
393
394 #if _KERNEL_TCB_ITSKPRI
395         fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_ITSKPRI));   /* %jp{タスクの起動時優先度} */
396 #endif
397
398 #if _KERNEL_TCB_STKSZ
399         fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_STKSZ));             /* %jp{タスクのスタックのサイズ(バイト数)} */
400 #endif
401
402 #if _KERNEL_TCB_STK
403         if ( strcmp(m_pParamPacks[iObj]->GetParam(CRETSK_STK), "NULL") == 0 )
404         {
405                 fprintf(fp, "_kernel_tsk%d_stk, ", m_iId[iObj];
406         }
407         else
408         {
409                 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRETSK_STK));       /* %jp{タスクのスタック領域の先頭番地} */
410         }
411 #endif
412
413 #if _KERNEL_TCB_ISP
414         if ( strcmp(m_pParamPacks[iObj]->GetParam(CRETSK_STK), "NULL") == 0 )
415         {
416                 fprintf(fp, "((VB*)_kernel_tsk%d_stk + sizeof(_kernel_tsk%d_stk)), ", m_iId[iObj], m_iId[iObj]);
417         }
418         else
419         {
420                 fprintf(fp, "(VP)((VB *)(%s) + (SIZE)(%s)), ", m_pParamPacks[iObj]->GetParam(CRETSK_STK), m_pParamPacks[iObj]->GetParam(CRETSK_STKSZ));
421         }
422 #endif
423
424 #if _KERNEL_TCB_TEXATR
425         fprintf(fp, "0, ");                                     /**< texatr %jp{タスク例外処理ルーチン属性} */
426 #endif
427
428 #if _KERNEL_TCB_TEXRTN
429         fprintf(fp, "0, ");                                     /**< texrtn %jp{タスク例外処理ルーチンの起動番地} */
430 #endif
431 }
432
433
434
435 // cfgファイル初期化部書き出し
436 void  CApiCreTsk::WriteCfgIni(FILE* fp)
437 {
438 #if _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_PTRARRAY && _KERNEL_TCB_SPLIT_RO
439         if ( m_iObjs <= 0 )
440         {
441                 return;
442         }
443
444         fprintf(fp, "\n\t/* Tasks */\n");
445         for ( int i = 0; i < m_iObjs; i++ )
446         {
447                 fprintf(fp, "\t_kernel_tcb_blk_%d.tcb_ro = &_kernel_tcb_ro_blk_%d;\n", m_iId[i], m_iId[i]);
448         }       
449 #endif
450 }
451
452
453 // cfgファイル起動部書き出し
454 void  CApiCreTsk::WriteCfgStart(FILE* fp)
455 {
456         int i;
457
458         for ( i = 0; i < m_iObjs; i++ )
459         {
460                 if ( strstr(m_pParamPacks[i]->GetParam(CRETSK_TSKATR), "TA_ACT") != NULL )
461                 {
462                         fprintf(fp,
463                                 "\tact_tsk(%s);\n",
464                                 m_pParamPacks[i]->GetParam(CRETSK_TSKID));
465                 }
466         }
467 }
468
469
470
471 // ---------------------------------------------------------------------------
472 //  Copyright (C) 1998-2006 by Project HOS                                    
473 // ---------------------------------------------------------------------------