1 // ---------------------------------------------------------------------------
2 // Hyper Operating System V4 Advance configurator
5 // Copyright (C) 1998-2006 by Project HOS
6 // http://sourceforge.jp/projects/hos/
7 // ---------------------------------------------------------------------------
19 #define CRESEM_SEMID 0
20 #define CRESEM_SEMATR 1
21 #define CRESEM_SEMCNT 2
22 #define CRESEM_MAXSEM 3
27 CApiCreSem::CApiCreSem()
30 m_iDefaultMaxId = _KERNEL_TMAX_SEMID;
33 m_iParamSyntax[0] = 0; // %jp{単独パラメーター}
34 m_iParamSyntax[1] = 3; // %jp{3パラメーターのブロック}
39 CApiCreSem::~CApiCreSem()
45 int CApiCreSem::AnalyzeApi(const char* pszApiName, const char* pszParams)
47 if ( strcmp(pszApiName, "CRE_SEM") == 0 )
49 return AddParams(pszParams);
51 else if ( strcmp(pszApiName, "KERNEL_MAX_SEMID") == 0 )
57 return CFG_ERR_MULTIDEF;
62 return CFG_ERR_DEF_CONFLICT;
65 if ( (iId = atoi(pszParams)) <= 0 )
74 else if ( strcmp(pszApiName, "KERNEL_RSV_SEMID") == 0 )
80 return CFG_ERR_DEF_CONFLICT;
83 if ( (iId = atoi(pszParams)) <= 0 )
93 return CFG_ERR_NOPROC;
98 void CApiCreSem::WriteId(FILE* fp)
103 fputs("\n\n/* Semaphore object ID definetion */\n\n", fp);
107 for ( i = 0; i < m_iObjs; i++ )
109 if ( atoi(m_pParamPacks[i]->GetParam(CRESEM_SEMID)) == 0 )
113 "#define %s\t\t%d\n",
114 m_pParamPacks[i]->GetParam(CRESEM_SEMID),
122 "#ifdef TMAX_SEMID\n"
123 "#undef TMAX_SEMID\n"
126 "#define TMAX_SEMID\t\t%d\n\n", m_iMaxId );
131 void CApiCreSem::WriteCfgDef(FILE* fp)
138 "/* ------------------------------------------ */\n"
139 "/* create semaphore objects */\n"
140 "/* ------------------------------------------ */\n"
145 #if _KERNEL_SEMCB_ALGORITHM == _KERNEL_SEMCB_ALG_BLKARRAY
146 #if _KERNEL_SEMCB_SPLIT_RO
150 fprintf(fp, "\n_KERNEL_T_SEMCB _kernel_semcb_tbl[%d] =\n\t{\n", m_iMaxId);
151 for ( i = 1; i <= m_iMaxId; i++ )
153 int iObjNum = IdToObjNum(i);
156 fprintf(fp, "\t\t{");
157 WriteSemcbRam(fp, iObjNum);
162 fprintf(fp, "\t\t{0},\n");
165 fprintf(fp, "\t};\n");
168 fprintf(fp, "\nconst _KERNEL_T_SEMCB_RO _kernel_semcb_ro_tbl[%d] =\n\t{\n", m_iMaxId);
169 for ( i = 1; i <= m_iMaxId; i++ )
171 int iObjNum = IdToObjNum(i);
174 fprintf(fp, "\t\t{");
175 WriteSemcbRom(fp, iObjNum);
180 fprintf(fp, "\t\t{0},\n");
183 fprintf(fp, "\t};\n\n");
186 // %jp{ブロック配列&統合SEMCB}
189 fprintf(fp, "\n_KERNEL_T_SEMCB _kernel_semcb_tbl[%d] =\n\t{\n", m_iMaxId);
190 for ( i = 1; i <= m_iMaxId; i++ )
192 int iObjNum = IdToObjNum(i);
195 fprintf(fp, "\t\t{");
196 WriteSemcbRam(fp, iObjNum);
197 WriteSemcbRom(fp, iObjNum);
202 fprintf(fp, "\t\t{{0}, },\n");
205 fprintf(fp, "\t};\n");
208 #elif _KERNEL_SEMCB_ALGORITHM == _KERNEL_SEMCB_ALG_PTRARRAY
209 #if _KERNEL_SEMCB_SPLIT_RO
213 for ( i = 0; i < m_iObjs; i++ )
215 fprintf(fp, "const _KERNEL_T_SEMCB_RO _kernel_semcb_ro_blk_%d = {", m_iId[i]);
216 WriteSemcbRom(fp, i);
220 for ( i = 0; i < m_iObjs; i++ )
222 fprintf(fp, "_KERNEL_T_SEMCB _kernel_semcb_blk_%d = {", m_iId[i]);
223 WriteSemcbRam(fp, i);
227 fprintf(fp, "\n_KERNEL_T_SEMCB *_kernel_semcb_tbl[%d] =\n\t{\n", m_iMaxId);
228 for ( i = 1; i <= m_iMaxId; i++ )
230 int iObjNum = IdToObjNum(i);
233 fprintf(fp, "\t\t&_kernel_semcb_blk_%d,\n", i);
237 fprintf(fp, "\t\tNULL,\n");
240 fprintf(fp, "\t};\n");
243 // %jp{ポインタ配列&統合SEMCB}
246 for ( i = 0; i < m_iObjs; i++ )
248 fprintf(fp, "_KERNEL_T_SEMCB _kernel_semcb_blk_%d = {", m_iId[i]);
249 WriteSemcbRam(fp, i);
250 WriteSemcbRom(fp, i);
254 fprintf(fp, "\n_KERNEL_T_SEMCB *_kernel_semcb_tbl[%d] =\n\t{\n", m_iMaxId);
255 for ( i = 1; i <= m_iMaxId; i++ )
257 int iObjNum = IdToObjNum(i);
260 fprintf(fp, "\t\t&_kernel_semcb_blk_%d,\n", i);
264 fprintf(fp, "\t\tNULL,\n");
267 fprintf(fp, "\t};\n");
276 "\nconst ID _kernel_max_semid = %d;\n",
281 void CApiCreSem::WriteSemcbRam(FILE *fp, int iObj)
283 #if _KERNEL_SEMCB_QUE
284 fprintf(fp, "{0}, "); /* %jp{キュー} */
287 #if _KERNEL_SEMCB_SEMCNT
288 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRESEM_SEMCNT)); /* %jp{セマフォの資源数} */
293 void CApiCreSem::WriteSemcbRom(FILE *fp, int iObj)
295 #if _KERNEL_SEMCB_SEMATR
296 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRESEM_SEMATR)); /* %jp{セマフォ属性} */
299 #if _KERNEL_SEMCB_MAXSEM
300 fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRESEM_MAXSEM)); /* %jp{セマフォの最大資源数} */
307 void CApiCreSem::WriteCfgIni(FILE* fp)
309 #if _KERNEL_SEMCB_ALGORITHM == _KERNEL_SEMCB_ALG_PTRARRAY && _KERNEL_SEMCB_SPLIT_RO
315 fprintf(fp, "\n\t/* semaphores */\n");
316 for ( int i = 0; i < m_iObjs; i++ )
318 fprintf(fp, "\t_kernel_semcb_blk_%d.semcb_ro = &_kernel_semcb_ro_blk_%d;\n", m_iId[i], m_iId[i]);
325 void CApiCreSem::WriteCfgStart(FILE* fp)
330 // ---------------------------------------------------------------------------
331 // Copyright (C) 1998-2006 by Project HOS
332 // ---------------------------------------------------------------------------