📄 hcfgh8h.c
字号:
/* ------------------------------------------------------------------------- */
/* HOS-H8 梡 僐儞僼傿僊儏儗乕僞乕 */
/* */
/* Copyright (C) 1998-2002 by Project HOS */
/* ------------------------------------------------------------------------- */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* ------------------------------------ */
/* 掕悢掕媊 */
/* ------------------------------------ */
#define TRUE 1
#define FALSE 0
#define MAX_PATH 256 /* 嵟戝僷僗柤 */
#define MAX_PARAMETER 6 /* 嵟戝僷儔儊乕僞乕悢 */
#define MAX_ID 255 /* 嵟戝俬俢悢 */
#define MAX_INCLUDE_C 64 /* 嵟戝撉傒崬傒僼傽僀儖悢(俠尵岅梡) */
/* ------------------------------------ */
/* 娭悢愰尵 */
/* ------------------------------------ */
/* 僐儅儞僪夝愅 */
int AnalizeCommand(char *(*pppPara[MAX_PARAMETER]), int nPara, char *pBuf);
void AnalizeDefInt(char *pBuf);
void AnalizeIncludeC(char *pBuf);
void AnalizeMaxTskPri(char *pBuf);
void AnalizeSysStack(char *pBuf);
/* 儊儌儕偺奐曻 */
void FreeParameter(char *ppPara[MAX_PARAMETER]);
void FreeTable(char ***pppTable);
/* 暥帤楍張棟 */
void CutSpace(char *pBuf);
int ClipParameter(char *ppPar[], int nNum, char *pBuf);
int StrToInt(int *pNum, char *pBuf);
int StrToLong(long *pNum, char *pBuf);
/* 僼傽僀儖弌椡 */
void Write_Def_ID(void); /* 掕媊僼傽僀儖弌椡 */
void Write_C_Cfg(void); /* 俠尵岅晹弌椡 */
void Write_Asm_Cfg(void); /* 傾僙儞僽儕尵岅晹弌椡 */
/* ------------------------------------ */
/* 曄悢愰尵 */
/* ------------------------------------ */
char szCfgFile[MAX_PATH] = "hos.cfg"; /* 僐儞僼傿僌儗乕僔儑儞僼傽僀儖 */
#ifdef __USE_CROSS_GCC__
char szAsmFile[MAX_PATH] = "cfg_asm.s"; /* 傾僙儞僽儕尵岅弌椡僼傽僀儖柤 */
#else
char szAsmFile[MAX_PATH] = "cfg_asm.src"; /* 傾僙儞僽儕尵岅弌椡僼傽僀儖柤 */
#endif
char szCFile[MAX_PATH] = "cfg_c.c"; /* 俠尵岅弌椡僼傽僀儖柤 */
char szDefCFile[MAX_PATH] = "defid.h"; /* 掕悢掕媊僿僢僟僼傽僀儖柤 */
int nLine; /* 夝愅拞偺峴斣崋 */
int bErr = FALSE; /* 僄儔乕 */
#define ADVANCED 0
#define NORMAL 1
int Mode = ADVANCED;
#define MAX_INT_ADVANCED 64 /* 嵟戝妱傝崬傒斣崋 */
#define MAX_INT_TINY 26 /* TINY 懳墳 */
int maxInt = MAX_INT_ADVANCED;
char *pMaxTskPri = NULL; /* 嵟戝桪愭搙(僨僼僅儖僩偱俉) */
/* 奺僷儔儊乕僞乕 傪奿擺 */
char **pppTaskTable[MAX_ID]; /* 僞僗僋惗惉僨乕僞僥乕僽儖 */
char **pppSplTable[MAX_ID]; /* 僗僞僢僋僾乕儖惗惉僨乕僞僥乕僽儖 */
char **pppSemTable[MAX_ID]; /* 僙儅僼僅惗惉僨乕僞僥乕僽儖 */
char **pppFlgTable[MAX_ID]; /* 僀儀儞僩僼儔僌惗惉僨乕僞僥乕僽儖 */
char **pppMbxTable[MAX_ID]; /* 儊僢僙乕僕儃僢僋僗惗惉僨乕僞僥乕僽儖 */
char **pppMpfTable[MAX_ID]; /* 屌掕挿儊儌儕僾乕儖惗惉僨乕僞僥乕僽儖 */
char *ppIntTable[MAX_INT_ADVANCED]; /* 妱傝崬傒儀僋僞偺僥乕僽儖 */
int nTaskCount; /* 僞僗僋偺悢 */
int nSplCount; /* 僗僞僢僋僾乕儖偺悢 */
int nSemCount; /* 僙儅僼僅偺悢 */
int nFlgCount; /* 僀儀儞僩僼儔僌偺悢 */
int nMbxCount; /* 儊僀儖儃僢僋僗偺 */
int nMpfCount; /* 屌掕挿儊儌儕僾乕儖偺悢 */
char *ppIncludeCTable[MAX_INCLUDE_C]; /* 俠尵岅偺僀儞僋儖乕僪僼傽僀儖 */
int nIncCCount; /* 俠尵岅僀儞僋儖乕僪僼傽僀儖悢 */
#define SYSSTACK_ADV 0xfff10
#define SYSSTACK_TINY 0xff80
unsigned long SystemStack = SYSSTACK_ADV; /* 僔僗僥儉僗僞僢僋偺傾僪儗僗 */
int bUseTimer = TRUE; /* 僞僀儅傪巊偆偐偳偆偐 */
/* ------------------------------------ */
/* 儊僀儞 */
/* ------------------------------------ */
/* 儊僀儞娭悢 */
int main(int argc, char *argv[])
{
FILE *fp;
char szBuf[256];
int i;
/* 儘僑昞帵 */
fprintf(stderr, "HOS-H8 Configurator\n");
/* 僐儅儞僪儔僀儞夝愅 */
if ( argc > 3 ) {
fprintf(stderr,"Usage: %s [[-t] config_file]\n", argv[0]);
exit(1);
}
/* 僲乕儅儖儌乕僪 */
if ( argc > 1) {
if ( (i = strcmp( argv[1], "-n")) == 0) {
Mode = NORMAL;
maxInt = MAX_INT_TINY;
SystemStack = SYSSTACK_TINY;
}
if ( argc == 3 || Mode == ADVANCED )
strcpy(szCfgFile, argv[argc-1]);
}
/* 僼傽僀儖僆乕僾儞 */
if ( (fp = fopen(szCfgFile, "r")) == NULL ) {
fprintf(stderr, "%s 偑奐偗傑偣傫\n", szCfgFile);
exit(1);
}
/* 僼傽僀儖偺夝愅 */
nLine = 1;
while ( fgets(szBuf, sizeof(szBuf), fp) != NULL ) {
/* 梋暘側嬻敀傪嶍彍 */
CutSpace(szBuf);
/* 僐儅儞僪柤偵墳偠偰夝愅 */
if ( strncmp(szBuf, "CRE_TSKSP", 9) == 0 ) {
int nID;
nID = AnalizeCommand(pppTaskTable, 5, &szBuf[9]);
if ( nID != -1 )
pppTaskTable[nID][5] = malloc(1); /* 僀儞僠僉 (^^;; */
}
else if ( strncmp(szBuf, "CRE_TSK", 7) == 0 )
AnalizeCommand(pppTaskTable, 5, &szBuf[7]);
else if ( strncmp(szBuf, "CRE_SPL", 7) == 0 )
AnalizeCommand(pppSplTable, 3, &szBuf[7]);
else if ( strncmp(szBuf, "CRE_SEM", 7) == 0 )
AnalizeCommand(pppSemTable, 4, &szBuf[7]);
else if ( strncmp(szBuf, "CRE_FLG", 7) == 0 )
AnalizeCommand(pppFlgTable, 3, &szBuf[7]);
else if ( strncmp(szBuf, "CRE_MBX", 7) == 0 )
AnalizeCommand(pppMbxTable, 3, &szBuf[7]);
else if ( strncmp(szBuf, "CRE_MPF", 7) == 0 )
AnalizeCommand(pppMpfTable, 4, &szBuf[7]);
else if ( strncmp(szBuf, "DEF_INT", 7) == 0 )
AnalizeDefInt(&szBuf[7]);
else if ( strncmp(szBuf, "INCLUDE_C", 9) == 0 )
AnalizeIncludeC(&szBuf[9]);
else if ( strncmp(szBuf, "MAX_TSKPRI", 10) == 0 )
AnalizeMaxTskPri(&szBuf[10]);
else if ( strncmp(szBuf, "SYSTEM_STACK", 12) == 0 )
AnalizeSysStack(&szBuf[12]);
else if ( strncmp(szBuf, "USE_TIMER", 9) == 0 )
bUseTimer = TRUE;
else if ( strncmp(szBuf, "NOUSE_TIMER", 11) == 0 )
bUseTimer = FALSE;
else if ( szBuf[0] != ';' && szBuf[0] != '\0' && szBuf[0] != '\n' ) {
fprintf(stdout, "line(%d): 暥朄僄儔乕偱偡\n", nLine);
bErr = TRUE;
}
nLine++;
}
fclose(fp);
/* 僼傽僀儖弌椡 */
Write_Def_ID();
Write_C_Cfg();
Write_Asm_Cfg();
/* 儊儌儕奐曻 */
FreeTable(pppTaskTable);
FreeTable(pppSemTable);
FreeTable(pppFlgTable);
FreeTable(pppMbxTable);
FreeTable(pppMpfTable);
if ( pMaxTskPri != NULL ) free(pMaxTskPri);
for ( i = 0; i < maxInt; i++ )
if ( ppIntTable[i] != NULL ) free(ppIntTable[i]);
for ( i = 0; i < MAX_INCLUDE_C; i++ )
if ( ppIncludeCTable[i] != NULL ) free(ppIncludeCTable[i]);
return bErr;
}
/* ------------------------------------ */
/* 僼傽僀儖弌椡 */
/* ------------------------------------ */
/* 掕媊僼傽僀儖弌椡 */
void Write_Def_ID(void)
{
FILE *fp;
int i;
/* 僼傽僀儖僆乕僾儞 */
if ( (fp = fopen(szDefCFile, "w")) == NULL ) {
fprintf(stderr, "%s 偺嶌惉偵幐攕偟傑偟偨\n", szDefCFile);
exit(1);
}
fprintf(fp, "/* HOS-H8 configuration-file to define ID */\n\n");
fprintf(fp, "#ifndef __HOSCFG__DEFID_H_\n");
fprintf(fp, "#define __HOSCFG__DEFID_H_\n\n\n");
/* 僞僗僋ID 弌椡 */
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppTaskTable[i] != NULL && pppTaskTable[i][0][0] != '\0' )
fprintf(fp, "#define %s\t%d\n", pppTaskTable[i][0], i + 1);
}
fprintf(fp, "\n");
/* 僗僞僢僋僾乕儖ID 弌椡 */
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppSplTable[i] != NULL && pppSplTable[i][0][0] != '\0' )
fprintf(fp, "#define %s\t%d\n", pppSplTable[i][0], i + 1);
}
fprintf(fp, "\n");
/* 僙儅僼僅ID 弌椡 */
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppSemTable[i] != NULL && pppSemTable[i][0][0] != '\0' )
fprintf(fp, "#define %s\t%d\n", pppSemTable[i][0], i + 1);
}
fprintf(fp, "\n");
/* 僀儀儞僩僼儔僌ID 弌椡 */
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppFlgTable[i] != NULL && pppFlgTable[i][0][0] != '\0' )
fprintf(fp, "#define %s\t%d\n", pppFlgTable[i][0], i + 1);
}
fprintf(fp, "\n");
/* 儊乕儖儃僢僋僗ID 弌椡 */
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppMbxTable[i] != NULL && pppMbxTable[i][0][0] != '\0' )
fprintf(fp, "#define %s\t%d\n", pppMbxTable[i][0], i + 1);
}
fprintf(fp, "\n");
/* 屌掕挿儊儌儕僾乕儖ID 弌椡 */
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppMpfTable[i] != NULL && pppMpfTable[i][0][0] != '\0' )
fprintf(fp, "#define %s\t%d\n", pppMpfTable[i][0], i + 1);
}
fprintf(fp, "\n");
fprintf(fp, "\n#endif /* __HOSCFG__DEFID_H_ */\n");
}
/* 僐儞僼傿僊儏儗乕僔儑儞僼傽僀儖俠尵岅晹弌椡 */
void Write_C_Cfg(void)
{
FILE *fp;
char *pPri;
int nMaxID;
int i;
/* 僼傽僀儖僆乕僾儞 */
if ( (fp = fopen(szCFile, "w")) == NULL ) {
fprintf(stderr, "%s 偺嶌惉偵幐攕偟傑偟偨\n", szDefCFile);
exit(1);
}
/* 僐儊儞僩弌椡 */
fprintf(fp, "/* HOS-H8梡 僐儞僼傿僊儏儗乕僔儑儞僼傽僀儖俠尵岅晹 */\n\n");
/* 僀儞僋儖乕僪僼傽僀儖弌椡 */
fprintf(fp, "#include \"itron.h\"\n");
fprintf(fp, "#include \"%s\"\n", szDefCFile);
for ( i = 0; i < nIncCCount; i++ )
fprintf(fp, "#include %s\n", ppIncludeCTable[i]);
/* ------- 僔僗僥儉僗僞僢僋傾僪儗僗 -------- */
fprintf(fp, "\n\n/* 僔僗僥儉僗僞僢僋弶婜傾僪儗僗 */\n");
fprintf(fp, "void *const __system_stack = (void *)(0x%05lx);\n",
SystemStack);
/* ------- 儗僨傿乕僉儏乕弌椡 -------- */
fprintf(fp, "\n");
if ( pMaxTskPri == NULL )
pPri = "8";
else
pPri = pMaxTskPri;
fprintf(fp, "\n\n/* 儗僨傿乕僉儏乕 */\n");
fprintf(fp, "T_QUE rdyque[%s];\n", pPri);
fprintf(fp, "const H rdqcnt = %s;\n", pPri);
/* ------- 僗僞僢僋僾乕儖僨乕僞弌椡 -------- */
fprintf(fp, "\n");
/* 嵟戝僗僞僢僋僾乕儖ID専嶕 */
nMaxID = 0;
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppSplTable[i] != NULL ) {
nSplCount++;
nMaxID = i + 1;
}
}
if ( nMaxID > 0 ) {
/* 僗僞僢僋椞堟弌椡 */
fprintf(fp, "\n\n/* 僗僞僢僋僾乕儖梡僗僞僢僋椞堟 */\n");
for ( i = 0; i < nMaxID; i++ ) {
if ( pppSplTable[i] != NULL ) {
fprintf(fp, "VH StackPool%d[(%s) / 2];\n",
i + 1, pppSplTable[i][2]);
}
}
/* 僗僞僢僋僾乕儖掕媊 */
fprintf(fp, "\n\n/* 僗僞僢僋僾乕儖搊榐 */\n");
fprintf(fp, "T_SPCB spcbtbl[%d];\n", nMaxID);
fprintf(fp, "const T_SPCBS spcbstbl[%d] = {\n", nMaxID);
for ( i = 0; i < nMaxID; i++ ) {
if ( pppSplTable[i] == NULL )
fprintf(fp, "\t\t{}");
else
fprintf(fp, "\t\t{StackPool%d, %s, (%s) / 2}",
i + 1,
pppSplTable[i][1],
pppSplTable[i][2]
);
if ( i == nMaxID - 1 )
fprintf(fp, "\n");
else
fprintf(fp, ",\n");
}
fprintf(fp, "\t};\n");
}
fprintf(fp, "const H spcbcnt = %d;\t/* 僗僞僢僋僾乕儖悢 */\n", nMaxID);
/* ------- 僞僗僋僨乕僞弌椡 -------- */
fprintf(fp, "\n");
/* 嵟戝僞僗僋ID専嶕 */
nMaxID = 0;
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppTaskTable[i] != NULL ) {
nTaskCount++;
nMaxID = i + 1;
}
}
if ( nMaxID > 0 ) {
/* 僞僗僋梡僗僞僢僋椞堟弌椡 */
fprintf(fp, "\n\n/* 僗僞僢僋椞堟 */\n");
for ( i = 0; i < nMaxID; i++ ) {
if ( pppTaskTable[i] != NULL && pppTaskTable[i][5] == NULL ) {
fprintf(fp, "VH Stack%d[(%s) / 2];\n",
i + 1, pppTaskTable[i][4]);
}
}
/* 僞僗僋掕媊 */
fprintf(fp, "\n/* 僞僗僋搊榐 */\n");
fprintf(fp, "T_TCB tcbtbl[%d];\n", nMaxID);
fprintf(fp, "const T_TCBS tcbstbl[%d] = {\n", nMaxID);
for ( i = 0; i < nMaxID; i++ ) {
if ( pppTaskTable[i] == NULL )
fprintf(fp, "\t\t{}");
else {
if ( pppTaskTable[i][5] == NULL ) {
/* 帺慜偱僗僞僢僋傪帩偮 */
fprintf(fp, "\t\t"
"{(VP)%s, %s, %s, &Stack%d[(%s) / 2]}",
pppTaskTable[i][1],
pppTaskTable[i][2],
pppTaskTable[i][3],
i + 1,
pppTaskTable[i][4]
);
}
else {
/* 僗僞僢僋僾乕儖傪巊偆 */
fprintf(fp, "\t\t"
"{(VP)%s, %s, %s, (VH*)(((%s) - 1) * 2 + 1)}",
pppTaskTable[i][1],
pppTaskTable[i][2],
pppTaskTable[i][3],
pppTaskTable[i][4]
);
}
}
if ( i == nMaxID - 1 )
fprintf(fp, "\n");
else
fprintf(fp, ",\n");
}
fprintf(fp, "\t};\n");
}
fprintf(fp, "const H tcbcnt = %d;\t/* 僞僗僋悢 */\n", nMaxID);
/* ------- 僙儅僼僅僨乕僞弌椡 -------- */
fprintf(fp, "\n");
/* 嵟戝僙儅僼僅ID専嶕 */
nMaxID = 0;
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppSemTable[i] != NULL ) {
nSemCount++;
nMaxID = i + 1;
}
}
if ( nMaxID > 0 ) {
/* 僙儅僼僅掕媊 */
fprintf(fp, "\n\n/* 僙儅僼僅搊榐 */\n");
fprintf(fp, "T_SCB scbtbl[%d];\n", nMaxID);
fprintf(fp, "const T_SCBS scbstbl[%d] = {\n", nMaxID);
for ( i = 0; i < nMaxID; i++ ) {
if ( pppSemTable[i] == NULL )
fprintf(fp, "\t\t{}");
else
fprintf(fp, "\t\t{%s, %s, %s}",
pppSemTable[i][1],
pppSemTable[i][2],
pppSemTable[i][3]
);
if ( i == nMaxID - 1 )
fprintf(fp, "\n");
else
fprintf(fp, ",\n");
}
fprintf(fp, "\t};\n");
}
fprintf(fp, "const H scbcnt = %d;\t/* 僙儅僼僅悢 */\n", nMaxID);
/* ------- 僼儔僌僨乕僞弌椡 -------- */
fprintf(fp, "\n");
/* 嵟戝僀儀儞僩僼儔僌ID専嶕 */
nMaxID = 0;
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppFlgTable[i] != NULL ) {
nFlgCount++;
nMaxID = i + 1;
}
}
if ( nMaxID > 0 ) {
/* 僀儀儞僩僼儔僌掕媊 */
fprintf(fp, "\n\n/* 僀儀儞僩僼儔僌搊榐 */\n");
fprintf(fp, "T_FCB fcbtbl[%d];\n", nMaxID);
fprintf(fp, "const T_FCBS fcbstbl[%d] = {\n", nMaxID);
for ( i = 0; i < nMaxID; i++ ) {
if ( pppFlgTable[i] == NULL )
fprintf(fp, "\t\t{}");
else
fprintf(fp, "\t\t{%s, %s}",
pppFlgTable[i][1],
pppFlgTable[i][2]);
if ( i == nMaxID - 1 )
fprintf(fp, "\n");
else
fprintf(fp, ",\n");
}
fprintf(fp, "\t};\n");
}
fprintf(fp, "const H fcbcnt = %d;\t/* 僀儀儞僩僼儔僌悢 */\n", nMaxID);
/* ------- 儊僀儖儃僢僋僗僨乕僞弌椡 -------- */
fprintf(fp, "\n");
/* 嵟戝儊乕儖儃僢僋僗ID専嶕 */
nMaxID = 0;
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppMbxTable[i] != NULL ) {
nMbxCount++;
nMaxID = i + 1;
}
}
if ( nMaxID > 0 ) {
fprintf(fp, "\n\n/* 儊乕儖儃僢僋僗梡僶僢僼傽 */\n");
for ( i = 0; i < nMaxID; i++ )
fprintf(fp, "VP msgbuf%d[%s];\n", i, pppMbxTable[i][2]);
/* 儊乕儖儃僢僋僗掕媊 */
fprintf(fp, "\n/* 儊乕儖儃僢僋僗搊榐 */\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -