⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcfgh8h.c

📁 050117 CD 修正分 iTRON hosroot
💻 C
📖 第 1 页 / 共 2 页
字号:
		fprintf(fp, "T_MCB  mcbtbl[%d];\n", nMaxID);
		fprintf(fp, "const T_MCBS mcbstbl[%d] = {\n", nMaxID);
		for ( i = 0; i < nMaxID; i++ ) {
			if ( pppMbxTable[i] == NULL )
				fprintf(fp, "\t\t{}");
			else
				fprintf(fp, "\t\t{%s, msgbuf%d, msgbuf%d + %s}",
							pppMbxTable[i][1], i, i, pppMbxTable[i][2]);
			if ( i == nMaxID - 1 )
				fprintf(fp, "\n");
			else
				fprintf(fp, ",\n");
		}
		fprintf(fp, "\t};\n");
	}
	fprintf(fp, "const H  mcbcnt = %d;\t/* 儊乕儖儃僢僋僗悢 */\n", nMaxID);
	
	
	/* ------- 屌掕挿儊儌儕僾乕儖僨乕僞弌椡 -------- */
	fprintf(fp, "\n");
	
	/* 嵟戝屌掕挿儊儌儕僾乕儖ID専嶕 */
	nMaxID = 0;
	for ( i = 0; i < MAX_ID; i++ ) {
		if ( pppMpfTable[i] != NULL ) {
			nMpfCount++;
			nMaxID = i + 1;
		}
	}
	
	if ( nMaxID > 0 ) {
		fprintf(fp, "\n\n/* 屌掕挿儊儌儕僾乕儖梡儊儌儕 */\n");
		for ( i = 0; i < nMaxID; i++ )
			fprintf(fp, "UB mpfblk%d[(%s) * (%s)];\n", i,
						pppMpfTable[i][2], pppMpfTable[i][3]);
		
		/* 屌掕挿儊儌儕僾乕儖掕媊 */
		fprintf(fp, "\n/* 屌掕挿儊儌儕僾乕儖搊榐 */\n");
		fprintf(fp, "T_FMCB  fmcbtbl[%d];\n", nMaxID);
		fprintf(fp, "const T_FMCBS fmcbstbl[%d] = {\n", nMaxID);
		for ( i = 0; i < nMaxID; i++ ) {
			if ( pppMpfTable[i] == NULL )
				fprintf(fp, "\t\t{}");
			else
				fprintf(fp, "\t\t{%s, mpfblk%d, %s, %s}",
							pppMpfTable[i][1], i,
							pppMpfTable[i][2], pppMpfTable[i][3]);
			if ( i == nMaxID - 1 )
				fprintf(fp, "\n");
			else
				fprintf(fp, ",\n");
		}
		fprintf(fp, "\t};\n");
	}
	fprintf(fp, "const H  fmcbcnt = %d;\t/* 屌掕挿儊儌儕僾乕儖悢 */\n", nMaxID);	
	
	/* 弶婜壔儖乕僠儞弌椡 */
	fprintf(fp, "\n\n/* 弶婜壔 */\n"
				"void __initialize(void)\n{\n"
			);
	if ( bUseTimer )
		fprintf(fp, "\t__ini_tim();\t/* 僞僀儅弶婜壔 */\n");
	if ( nTaskCount > 0 )
		fprintf(fp, "\t__ini_tsk();\t/* 僞僗僋弶婜壔 */\n");
	if ( nSemCount > 0 )
		fprintf(fp, "\t__ini_sem();\t/* 僙儅僼僅弶婜壔 */\n");
	if ( nFlgCount > 0 )
		fprintf(fp, "\t__ini_flg();\t/* 僀儀儞僩僼儔僌弶婜壔 */\n");
	if ( nMbxCount > 0 )
		fprintf(fp, "\t__ini_mbx();\t/* 儊僀儖儃僢僋僗弶婜壔 */\n");
	if ( nMpfCount > 0 )
		fprintf(fp, "\t__ini_mpf();\t/* 屌掕挿儊儌儕僾乕儖弶婜壔 */\n");
	fprintf(fp, "}\n");

	fclose(fp);
}


/* 傾僙儞僽儕尵岅晹弌椡 */
void Write_Asm_Cfg(void)
{
	FILE *fp;
	int  i;
	
	/* 僼傽僀儖僆乕僾儞 */
	if ( (fp = fopen(szAsmFile, "w")) == NULL ) {
		fprintf(stderr, "%s 偺嶌惉偵幐攕偟傑偟偨\n", szAsmFile);
		exit(1);
	}
	
	/* IMPORT愰尵弌椡 */
	fprintf(fp, "; 僐儞僼傿僊儏儗乕僞乕 傾僙儞僽儔晹\n\n");
#ifndef __USE_CROSS_GCC__
	fprintf(fp, 		"\t\t.CPU     %s\n\n"
				"\t\t.IMPORT\t_hos_start\n"
				"\t\t.IMPORT\t_int_default\n"
				"\t\t.IMPORT\t_int_trap\n",
				Mode == ADVANCED ? "300HA": "300HN");
	for ( i = 1; i < maxInt; i++ ) {
		if ( ppIntTable[i] != NULL )
			fprintf(fp, "\t\t.IMPORT\t_%s\n", ppIntTable[i]);
	}
	
	/* 儀僋僞僥乕僽儖弌椡 */
	fprintf(fp, "\n\t\t.SECTION  VECT,DATA,ALIGN=2\n\n"
				"; -----------------------------------------------\n"
				";          妱傝崬傒儀僋僞僥乕僽儖\n"
				"; -----------------------------------------------\n"
				"\t\t.DATA.%c\t_hos_start\n",
				Mode == ADVANCED ? 'L': 'W');
	for ( i = 1; i < maxInt; i++ ) {
		if ( ppIntTable[i] != NULL ) {
			fprintf(fp, "\t\t.DATA.%c\tINT%02X\n",
				Mode == ADVANCED ? 'L': 'W', i);
		}
		else {
			fprintf(fp, "\t\t.DATA.%c\t_int_default\n",
				Mode == ADVANCED ? 'L': 'W');
		}
	}
#endif	 /* __USE_CROSS_GCC_ */
	/* 妱傝崬傒僴儞僪儔弌椡 */
	fprintf(fp,
#ifdef __USE_CROSS_GCC__
				"\t\t.h8300h\n"
#else
				"\n\n\t\t.SECTION  P,CODE,ALIGN=2\n\n"
#endif
				"; -----------------------------------------------\n"
				";          妱傝崬傒僴儞僪儔\n"
				"; -----------------------------------------------\n\n"
			);
	for ( i = 1; i < maxInt; i++ ) {
		if ( ppIntTable[i] != NULL ) {
			fprintf(fp,
#ifdef __USE_CROSS_GCC__
				"\t\t.global\tint%02x\nint%02x:\t\tpush.l\ter1\n"
				"\t\tmov.%c\t#_%s,%s1\n"
				"\t\tjmp\t@_int_trap\n\n",
				i , i, Mode == ADVANCED ? 'l': 'w' ,
				ppIntTable[i], Mode == ADVANCED ? "er": "r");
#else
				"INT%02X:\t\tPUSH.L\tER1\n"
				"\t\tMOV.%c\t#_%s,%s1\n"
				"\t\tjmp\t@_int_trap\n\n",
				i , Mode == ADVANCED ? 'L': 'W' ,
				ppIntTable[i], Mode == ADVANCED ? "ER": "R");
#endif
		}
	}
	
	
	/* 僥乕僽儖偑柍偄応崌 Warning 懳嶔偵傾僪儗僗偺傒妱傝怳傝 */
#ifndef __USE_CROSS_GCC__
	if ( nTaskCount == 0 || nSplCount == 0 || nSemCount == 0
			|| nFlgCount == 0 || nMbxCount == 0 || nMpfCount == 0 ) {
		fprintf(fp, "\n\n");
		if ( nSplCount == 0 )
			fprintf(fp,"\t\t.EXPORT\t_spcbtbl\n"
						"\t\t.EXPORT\t_spcbstbl\n");
		if ( nTaskCount == 0 )
			fprintf(fp,"\t\t.EXPORT\t_tcbtbl\n"
						"\t\t.EXPORT\t_tcbstbl\n");
		if ( nSemCount == 0 )
			fprintf(fp,"\t\t.EXPORT\t_scbtbl\n"
						"\t\t.EXPORT\t_scbstbl\n");
		if ( nFlgCount == 0 )
			fprintf(fp,"\t\t.EXPORT\t_fcbtbl\n"
						"\t\t.EXPORT\t_fcbstbl\n");
		if ( nMbxCount == 0 )
			fprintf(fp,"\t\t.EXPORT\t_mcbtbl\n"
						"\t\t.EXPORT\t_mcbstbl\n");
		if ( nMpfCount == 0 )
			fprintf(fp,"\t\t.EXPORT\t_fmcbtbl\n"
						"\t\t.EXPORT\t_fmcbstbl\n");
		
		fprintf(fp,"\n\n\t\t.SECTION  C,DATA,ALIGN=2\n\n");
		
		if ( nSplCount == 0 )
			fprintf(fp, "_spcbtbl:\n"
						"_spcbstbl:\n");
		if ( nTaskCount == 0 )
			fprintf(fp,"_tcbtbl:\n"
						"_tcbstbl:\n");
		if ( nSemCount == 0 )
			fprintf(fp,"_scbtbl:\n"
						"_scbstbl:\n");
		if ( nFlgCount == 0 )
			fprintf(fp,"_fcbtbl:\n"
						"_fcbstbl:\n");
		if ( nMbxCount == 0 )
			fprintf(fp,"_mcbtbl:\n"
						"_mcbstbl:\n");
		if ( nMpfCount == 0 )
			fprintf(fp,"_fmcbtbl:\n"
						"_fmcbstbl:\n");
	}
	
	fprintf(fp, "\n\n\t\t.END\n");
#else
	fprintf(fp, "\n\n\t\t.end\n");
#endif	
	fclose(fp);
}



/* ------------------------------------ */
/*           僐儅儞僪夝愅               */
/* ------------------------------------ */

/* 僐儅儞僪夝愅 (CRE_TSK, CRE_SEM, CRE_FLG, CRE_MBX) */
/* 奺僷儔儊乕僞乕傪 pppTable[id][pram] 偵暥帤楍偺傑傑奿擺 */
int AnalizeCommand(char ***pppTable, int nPara, char *pBuf)
{
	char **ppPar;
	int  nID;
	
	/* 儊儌儕妋曐 */
	ppPar = (char **)calloc(MAX_PARAMETER, sizeof(char *));
	if ( ppPar == NULL ) {
		fprintf(stderr, "儊儌儕偑懌傝傑偣傫\n");
		exit(1);
	}
	
	/* 僷儔儊乕僞乕暘夝 */
	if ( !ClipParameter(ppPar, nPara, pBuf) ) {
		FreeParameter(ppPar);
		return -1;
	}
	
	/* ID僠僃僢僋 */
	if ( StrToInt(&nID, ppPar[0]) ) {
		nID--;
		if ( nID < 0 || nID >= MAX_ID ) {
			/* ID斣崋偑晄惓 */
			fprintf(stdout, "line(%d): 晄惓側俬俢斣崋偱偡\n", nLine);
			FreeParameter(ppPar);
			bErr = TRUE;
			return -1;
		}
		if ( pppTable[nID] != NULL ) {
			/* ID斣崋偑廳暋 */
			fprintf(stdout, "line(%d): 俬俢斣崋偑廳暋偟偰偄傑偡\n", nLine);
			FreeParameter(ppPar);
			bErr = TRUE;
			return -1;
		}
		ppPar[0][0] = '\0';
	}
	else {
		for ( nID = 0; nID < MAX_ID; nID++ ) {
			if ( pppTable[nID] == NULL )
				break;
		}
		if ( nID >= MAX_ID ) {
			/* 僆僽僕僃僋僩偑懡偡偓傞 */
			fprintf(stdout, "line(%d): 僆僽僕僃僋僩偑懡偡偓傑偡\n", nLine);
			FreeParameter(ppPar);
			bErr = TRUE;
			return -1;
		}
	}
	
	/* 搊榐 */
	pppTable[nID] = ppPar;
	
	return nID;
}


/* DEF_INT 偺夝愅 */
void AnalizeDefInt(char *pBuf)
{
	char *ppPara[2] = {NULL, NULL};
	int  nIntNum;

	/* 僐儅儞僪愗傝弌偟 */
	if ( !ClipParameter(ppPara, 2, pBuf) ) {
		if ( ppPara[0] != NULL )  free(ppPara[0]);
		if ( ppPara[1] != NULL )  free(ppPara[1]);
		return;
	}

	/* 妱傝崬傒斣崋僠僃僢僋 */
	if ( !StrToInt(&nIntNum, ppPara[0])
			|| nIntNum < 1 || nIntNum >= maxInt ) {
		/* 妱傝崬傒斣崋偑晄惓 */
		fprintf(stdout, "line(%d): illegal intrrupt-number.\n", nLine);
		if ( ppPara[0] != NULL )  free(ppPara[0]);
		if ( ppPara[1] != NULL )  free(ppPara[1]);
		bErr = TRUE;
		return;
	}
	if ( ppIntTable[nIntNum] != NULL ) {
		/* 妱傝崬傒斣崋偑廳暋 */
		fprintf(stdout, "line(%d): 妱傝崬傒斣崋偑廳暋偟偰偄傑偡\n", nLine);
		if ( ppPara[0] != NULL )  free(ppPara[0]);
		if ( ppPara[1] != NULL )  free(ppPara[1]);
		bErr = TRUE;
		return;
	}

	/* 妱傝崬傒僙僢僩 */
	ppIntTable[nIntNum] = ppPara[1];
	free(ppIntTable[0]);
}


/* INCLUDE_C 偺夝愅 */
void AnalizeIncludeC(char *pBuf)
{
	char *ppPara[1] = {NULL};
	
	if ( !ClipParameter(ppPara, 1, pBuf) ) {
		if ( ppPara[0] != NULL )  free(ppPara[0]);
		return;
	}
	
	if ( nIncCCount >= MAX_INCLUDE_C ) {
		/* 僀儞僋儖乕僪僼傽僀儖偑懡偡偓傞 */
		fprintf(stdout, "line(%d): 僀儞僋儖乕僪僼傽僀儖偑懡偡偓傑偡\n",
					nLine);
		free(ppPara[0]);
		bErr = TRUE;
		return;
	}
	
	ppIncludeCTable[nIncCCount++] = ppPara[0];
}


/* MAX_TSKPRI 偺夝愅 */
void AnalizeMaxTskPri(char *pBuf)
{
	char *ppPara[1] = {NULL};
	
	if ( !ClipParameter(ppPara, 1, pBuf) ) {
		if ( ppPara[0] != NULL )  free(ppPara[0]);
		return;
	}
	
	pMaxTskPri = ppPara[0];
}


/* SYSTEM_STACK 偺夝愅 */
void AnalizeSysStack(char *pBuf)
{
	char *ppPara[1] = {NULL};
	long  nAdr;

	if ( !ClipParameter(ppPara, 1, pBuf) ) {
		if ( ppPara[0] != NULL )  free(ppPara[0]);
		return;
	}
	if ( StrToLong(&nAdr, ppPara[0]) ) {
		SystemStack = (unsigned long)nAdr;
	}
	else {
		/* 僷儔儊乕僞乕偑晄惓 */
		fprintf(stdout, "line(%d): 僷儔儊乕僞乕偑晄惓偱偡\n", nLine);
	}
	
	free(ppPara[0]);
}


/* ------------------------------------ */
/*           儊儌儕奐曻                 */
/* ------------------------------------ */

/* 僷儔儊乕僞曐懚晹暘偺奐曻 */
void FreeParameter(char **ppPara)
{
	int i;
	
	for ( i = 0; i < MAX_PARAMETER; i++ ) {
		if ( ppPara[i] != NULL ) {
			free(ppPara[i]);
			ppPara[i] = NULL;
		}
	}
	free(ppPara);
}

/* 僷儔儊乕僞乕僥乕僽儖偺奐曻 */
void FreeTable(char ***pppTable)
{
	int i;

	for ( i = 0; i < MAX_ID; i++ ) {
		if ( pppTable[i] != NULL ) {
			FreeParameter(pppTable[i]);
			pppTable[i] = NULL;
		}
	}
}



/* ------------------------------------ */
/*            暥帤楍張棟                */
/* ------------------------------------ */

/* 慜屻偺嬻敀偺彍嫀 */
void CutSpace(char *pBuf)
{
	char *p;
	
	/* 屻傠偺嬻敀僇僢僩 */
	p = &pBuf[strlen(pBuf) - 1];
	while ( p >= pBuf && (*p == ' ' || *p == '\t' || *p == '\n') )
		p--;
	*(p + 1) = '\0';
	
	/* 慜敿偺嬻敀僇僢僩 */
	p = pBuf;
	while ( *p == ' ' || *p == '\t' )
		p++;
	memmove(pBuf, p, strlen(p) + 1);
}


/* 妵屖偱埻傑傟偨椞堟偐傜僷儔儊乕僞傪愗傝弌偡 */
int ClipParameter(char *ppPar[], int nNum, char *pBuf)
{
	char *pBase;
	int  nParNest = 1;
	int  i;

	/* 巒傑傝偺 '(' 僠僃僢僋 */
	CutSpace(pBuf);
	if ( *pBuf++ != '(' ) {
		/* 暥朄僄儔乕 */
		fprintf(stdout, "line(%d): 暥朄僄儔乕\n", nLine);
		bErr = TRUE;
		return FALSE;
	}
	
	/* 堷悢暘夝 */
	for ( i = 0; i < nNum; i++ ) {
		pBase = pBuf;
		while ( *pBuf ) {
			if ( nParNest == 1 && *pBuf == ',' )
				break;
			if ( *pBuf == '(' )
				nParNest++;
			if ( *pBuf == ')' )
				nParNest--;
			if ( nParNest == 0 )
				break;
			pBuf++;
		}
		if ( (i < nNum - 1 && *pBuf == ',')
				|| (i == nNum - 1 && *pBuf == ')') ) {
			*pBuf++ = '\0';
			CutSpace(pBase);
			ppPar[i] = (char *)calloc(strlen(pBase) + 1, sizeof(char));
			if ( ppPar[i] == NULL ) {
				/* 儊儌儕晄懌 */
				fprintf(stderr, "儊儌儕偑懌傝傑偣傫\n");
				exit(1);
			}
			strcpy(ppPar[i], pBase);
		}
		else {
			/* 僷儔儊乕僞乕悢偑堎忢 */
			fprintf(stdout, "line(%d): 僷儔儊乕僞悢偑堎忢偱偡\n", nLine);
			bErr = TRUE;
			return FALSE;
		}
	}
	
	return TRUE;
}


/* 暥帤楍傪悢抣偵曄姺偡傞(16恑懳墳) */
int StrToInt(int *pNum, char *pBuf)
{
	/* 嬻敀僇僢僩 */
	CutSpace(pBuf);
	
	/* 悢抣偐偳偆偐僠僃僢僋 */
	if ( pBuf[0] < '0' || pBuf[0] > '9' )
		return FALSE;
	
	/* 侾俇恑偐偳偆偐僠僃僢僋 */
	if ( pBuf[0] == '0' && (pBuf[1] == 'x' || pBuf[1] == 'X') )
		return (sscanf(&pBuf[2], "%x", pNum) == 1);
	
	return (sscanf(&pBuf[0], "%d", pNum) == 1);
}


/* 暥帤楍傪悢抣偵曄姺偡傞(16恑懳墳) */
int StrToLong(long *pNum, char *pBuf)
{
	/* 嬻敀僇僢僩 */
	CutSpace(pBuf);
	
	/* 悢抣偐偳偆偐僠僃僢僋 */
	if ( pBuf[0] < '0' || pBuf[0] > '9' )
		return FALSE;
	
	/* 侾俇恑偐偳偆偐僠僃僢僋 */
	if ( pBuf[0] == '0' && (pBuf[1] == 'x' || pBuf[1] == 'X') )
		return (sscanf(&pBuf[2], "%lx", pNum) == 1);
	
	return (sscanf(&pBuf[0], "%ld", pNum) == 1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -