OSDN Git Service

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