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

📄 tlcs900vec.cpp

📁 免费的OS源代码 符合ITRON4.0规范 http://www.toppers.jp/official_release.html
💻 CPP
字号:
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  Copyright (C) 2003-2004 by Ryosuke Takeuchi *              Platform Development Center RIOCH COMPANY,LTD. JAPAN *  *  惧淡螟侯涪荚は·Free Software Foundation によって给山されている  *  GNU General Public License の Version 2 に淡揭されている掘凤か·笆 *  布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ *  アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ *      ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 *      に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· *      この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 *      み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ *    (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 *        涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する *        ことˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚を倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· *  塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ *  ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい *  かなる禄巢に簇しても·その勒扦を砷わないˉ *  *  @(#) $Id: tlcs900vec.cpp,v 1.4 2007/04/17 05:08:07 honda Exp $ */// tlcs900vec.cpp : コンソ〖ル アプリケ〖ション脱のエントリ ポイントの年盗////------------------------------------------------------------------------------// 恃构旺悟//version yyyy/mm/dd 车妥//---------- -------------------------------------------------------------------// 01.00   2004/01/02 介惹// 01.01   2004/08/06 FIX VECTOR が盖年猛で铜ったのをパラメタにて恃构材墙とした//                    EXCINIB の芹误が0の眷圭の啼玛饯赖。                      //                    M30262F8FGの栏喇箕、充り哈みベクタが1乖驴い稍恶圭饯赖。//                    M30620FCAFPのJSP1.3脱ベクタ栏喇コ〖ドを掘凤コンパイル步。//----------------------------------------------------------------------------- #include <stdio.h>#include <stdlib.h>#include <string.h>#define	MAX_INCLUDE		8#define	MAX_INT			64#define	MAX_EXC			9#define	MAX_VEC			MAX_INT#define	BUF_SIZE		512#define	STR_SIZE		128#define	INT_STATE		0#define	EXC_STATE		1#define	NORMAL_STATE	2struct VEC {	int		no;	char	no_name[STR_SIZE];	char	no_label[STR_SIZE];};static char const default_input_file[] = "kernel_cfg.i";static char const default_output_file[] = "tlcs900vec.inc";static char const default_unused_int[] = "unused_interrupt";//start叫蜗肋年static char const start_extern[] ="\n\textern large _start";static char const start_vector[] = "\tdl\t_start\t; 01  0xffff00";static char const lf[] = "\n";static char input_file[STR_SIZE];static char output_file[STR_SIZE];static char include_file[MAX_INCLUDE][STR_SIZE];static int  num_include = 0;static int  num_vec[2] = {0, 0};static int  max_int    = 47; static int  num_nodec = 0;static int  vec_state = NORMAL_STATE;static struct VEC vec_table[2][MAX_VEC];static char unused_vec[2][STR_SIZE];static void set_TLSS_TLCS900(FILE* pfo, int m);static void set_global(FILE* pfo, char const * t);static void set_global_function(FILE* pfo, char const * t);static void set_vector(FILE* pfo, int kind, int no);static bool test_string(char** s, char const * t);static bool skip_space(char** s);static bool skip_char(char** s, char const c);int main(int argc, char* argv[]){	FILE* pfi;	FILE* pfo;	FILE* pfw;	char  buf[BUF_SIZE];	struct VEC *v;	int   i, j, k;	bool  cnv, dec;	char* s;	char* p;	char* q;	char  c;	strcpy(input_file, default_input_file);	strcpy(output_file, default_output_file);	strcpy(unused_vec[0], default_unused_int);	strcpy(unused_vec[1], default_unused_int);	//オプション回年	for(i = 1 ; i < argc ; i++){		s = argv[i];		if(*s++ == '-'){			c = *s++;			skip_space(&s);			switch(c){			case 'O':		// アウトプットファイルの肋年			case 'o':				strcpy(output_file, s);				break;			case 'R':		// インプットファイルの肋年			case 'r':				strcpy(input_file, s);				break;			default:				printf("m16cvec -R<input_file> -O<output_file> -I<include_file> -M<mode> -F<fixvector>\n");				break;			}		}	}	printf("input file   = %s\n", input_file);	printf("output file  = %s\n", output_file);	if((pfi = fopen(input_file, "r")) == NULL){		fprintf(stderr, "can't open input file !");		exit(1);	}	if((pfo = fopen(output_file, "w")) == NULL){		fclose(pfi);		fprintf(stderr, "can't open output file !");		exit(1);	}	for(i = 0 ; i < num_include ; i++){		printf("include file = %s\n", include_file[i]);	}	//ファイル掐蜗	for(;;){		if((fgets(buf, BUF_SIZE, pfi)) == NULL)			break;		s = buf;		switch(vec_state){		case INT_STATE:		case EXC_STATE:			//掐蜗矢の矢琐まできた箕の借妄			if(test_string(&s, ";"))				vec_state = NORMAL_STATE;			//矢机误藐叫倡幌			else if(test_string(&s, "{")){				v = &vec_table[vec_state][num_vec[vec_state]];				p = &v->no_name[0];				if(skip_space(&s))					continue;				dec = true;				while(*s != ','){					if(*s == 0)						continue;					//(,),spaceの眷圭は肌のポインタを渴める					if(*s == '(' || *s == ')'|| *s <= ' '){						s++;						continue;					}					//sが[0-9]でない眷圭					if(*s < '0' || *s > '9')						dec = false;					*p++ = *s++;				}				s++;				*p++ = 0;				if(dec)					v->no = atoi(v->no_name);				else{					v->no = -1;					num_nodec++;				}				p = &v->no_label[0];				if(skip_char(&s, ','))					continue;				test_string(&s, "(FP)");				if(skip_space(&s))					continue;				while(*s != ')' && *s != ',' && *s > ' ' && *s != '}'){					*p++ = *s++;				}				*p++ = 0;				num_vec[vec_state]++;				printf("%s\n",v->no_label);			}			else				continue;			break;		default:			if(!test_string(&s, "const"))				continue;			if(test_string(&s, "INHINIB"))				vec_state = INT_STATE;			else if(test_string(&s, "EXCINIB"))				vec_state = EXC_STATE;			break;		}	}	do{		cnv = false;		for(i = 0 ; i < num_include ; i++){			if((pfw = fopen(include_file[i], "r")) != NULL){				for(;;){					if((fgets(buf, BUF_SIZE, pfw)) == NULL)						break;					s = buf;					if(!test_string(&s, "#define"))						continue;					if(skip_space(&s))						continue;					for(k = 0 ; k < 2 ; k++){						for(j = 0 ; j < num_vec[k] ; j++){							v = &vec_table[k][j];							if(v->no < 0){								p = s;								dec = true;								if(test_string(&p, v->no_name)){									q = &v->no_name[0];									if(!skip_space(&p)){										while(*p > ' '){											if(*p == '(' || *p == ')'){												p++;												continue;											}											if(*p < '0' || *p > '9')												dec = false;											*q++ = *p++;										}									}									*q++ = 0;								}								else									dec = false;								if(dec){									v->no = atoi(v->no_name);									num_nodec--;								}							}						}					}				}				fclose(pfw);			}			else				printf("open error %s !!\n", include_file[i]);		}	}while(cnv);	for(i = 0 ; i < num_vec[EXC_STATE] ; i++){		v = &vec_table[EXC_STATE][i];		if(v->no >= 32 && v->no < MAX_INT){			vec_table[INT_STATE][num_vec[INT_STATE]] = vec_table[EXC_STATE][i];			num_vec[INT_STATE]++;			for(j = i ; j < (num_vec[EXC_STATE]-1) ; j++)				vec_table[EXC_STATE][j] = vec_table[EXC_STATE][j+1];			num_vec[EXC_STATE]--;		}	}	for(j = 0 ; j < num_vec[INT_STATE] ; j++){		v = &vec_table[INT_STATE][j];		if(v->no >= MAX_INT)			strcpy(unused_vec[INT_STATE], v->no_label);		else if(max_int < v->no)			max_int = v->no;	}	for(j = 0 ; j < num_vec[EXC_STATE] ; j++){		v = &vec_table[EXC_STATE][j];		if((v->no >= MAX_EXC && v->no < 32) || v->no >= MAX_INT)			strcpy(unused_vec[EXC_STATE], v->no_label);	}	//extern startを叫蜗	fputs(start_extern, pfo);	if(num_nodec > 0)		printf("%dのエクセプション戎规を泼年できません—\n", num_nodec);	else{		fputs(lf, pfo);		for(i = 0 ; i < 2 ; i++){			for(j = 0 ; j < num_vec[i] ; j++)				set_global_function(pfo, vec_table[i][j].no_label);		}		if(!strcmp(default_unused_int, unused_vec[0]))			set_global(pfo, unused_vec[0]);		else if(!strcmp(default_unused_int, unused_vec[1]))			set_global(pfo, unused_vec[1]);			set_TLSS_TLCS900(pfo, max_int);	}	fclose(pfi);	fclose(pfo);	return 0;}static void set_TLSS_TLCS900(FILE* pfo, int m){	int iVec_num;	fputs("\nf_vecter section code large align=4", pfo);	fputs(lf, pfo);	for(iVec_num = 0 ; iVec_num < MAX_INT ; iVec_num++){		if(iVec_num == 0){			fputs(start_vector, pfo);			fputs(lf, pfo);}		else			//この婶尸で肋年			set_vector(pfo, INT_STATE, iVec_num+1);	}}/* * extern 离咐をする(叹涟の涟にアンダ〖バ〖が稍妥なもの) */static void set_global(FILE* pfo, char const * t){	fputs("\textern large ", pfo);		fputs(t, pfo);	fputs(lf, pfo);}/* * extern 离咐をする(叹涟の涟にアンダ〖バ〖が涩妥なもの) */static void set_global_function(FILE* pfo, char const * t){	fputs("\textern large _", pfo);		fputs(t, pfo);	fputs(lf, pfo);}/* * ベクトルを肋年する */static void set_vector(FILE* pfo, int kind, int no){	struct VEC* v = &vec_table[kind][0];	int  vec_cnt;	int  address;	int  address_high;	int  address_low;	char comment[15];	char comment_high[2];	char comment_low[2];	address = (no - 1) * 4;	address_high = address/16;	address_low = address%16;	sprintf(comment_high, "%x", address_high);	sprintf(comment_low, "%x", address_low);	fputs("\tdl\t", pfo);	comment[0] = '\t';	comment[1] = ';';	comment[2] = ' ';	comment[3] = (no/10)+'0';	comment[4] = (no%10)+'0';	comment[5] = ' ';	comment[6] = '0';	comment[7] = 'x';	comment[8] = 'f';	comment[9] = 'f';	comment[10] = 'f';	comment[11] = 'f';	comment[12] = comment_high[0];	comment[13] = comment_low[0];	comment[14] = 0;	for(vec_cnt = 0 ; vec_cnt < num_vec[kind] ; vec_cnt++, v++){		if(v->no == no){			fputs("_", pfo);			fputs(v->no_label, pfo);			fputs(comment, pfo);			fputs(lf, pfo);			return;		}	}	//unused interrupt	fputs(unused_vec[kind], pfo);	fputs(comment, pfo);	fputs(lf, pfo);}/* * 矢机误を孺秤して票办ならばTURE */static bool test_string(char** s, char const *t){	char*  p;	char   c;	p = *s;	while(*p <= ' '){		if(*p == 0)			return false;		p++;	}	while((c = *p++) != 0){		if(c != *t++)			break;		if(*t == 0){			*s = p;			return true;		}	}	return false;}/* * 回年のキャラクタまでスキップ */static bool skip_char(char** s, char const c){	char* p;	p = *s;	while(*p != c){		if(*p == 0)			break;		p++;	}	if(*p){		p++;		*s = p;		return false;	}	else{		*s = p;		return true;	}}/* * スペ〖スまたはタブをスキップする */static bool skip_space(char** s){	char* p;	p = *s;	while(*p <= ' ' ){		if(*p == 0)			break;		p++;	}	*s = p;	if(*p)		return false;	else		return true;}

⌨️ 快捷键说明

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