📄 m16cvec.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: m16cvec.cpp,v 1.3 2004/09/03 17:33:49 honda Exp $ */// m16cvec.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 "stdafx.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 version[] = "01.01";static char const default_input_file[] = "kernel_cfg.i";static char const default_output_file[] = "m16cvec.inc";static char const default_unused_int[] = "unused_interrupt";static char const in_portid[] = "serial_in_portid";static char const out_portid[] = "serial_out_portid";static char const in_handler[] = "serial_in_handler_xyzx";static char const out_handler[] = "serial_out_handler_xyzx";static char const comment[] = ";************************************************";static char const int_vec[] = ";* interrupt vectors *";static char const exc_vec[] = ";* exception vectors *";static char const func01[] = "\t.section bss_NE,DATA,ALIGN";static char const func02[] = "\t.blkw\t1";static char const func03[] = "\t.section program, code, align";static char const lf[] = "\n";static char const default_fvector[] = "0fffdch";static int board_mode = 0;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_M30620FCAFP(FILE* pfo, int no, int m);static void set_M30262F8FG(FILE* pfo, int no, int m);static void set_global(FILE* pfo, char const * t);static void set_comment(FILE* pfo, char const * t);static void set_org(FILE* pfo, char const * t);static void set_vector(FILE* pfo, int kind, int no);static void set_vector2(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);static char fvector[STR_SIZE];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); strcpy(fvector,default_fvector); for(i = 1 ; i < argc ; i++){ s = argv[i]; if(*s++ == '-'){ c = *s++; skip_space(&s); switch(c){ case 'I': // インクル〖ドファイルの肋年 case 'i': if(num_include < MAX_INCLUDE){ strcpy(include_file[num_include], s); num_include++; } break; case 'F': // フィックスベクタの年盗 case 'f': strcpy(fvector, s); break; case 'O': // アウトプットファイルの肋年 case 'o': strcpy(output_file, s); break; case 'R': // インプットファイルの肋年 case 'r': strcpy(input_file, s); break; case 'M': // ボ〖ドモ〖ド case 'm': board_mode = atoi(s); break; default: printf("m16cvec -R<input_file> -O<output_file> -I<include_file> -M<mode> -F<fixvector>\n"); break; } } } printf("version = %s\n", version); printf("input file = %s\n", input_file); printf("output file = %s\n", output_file); printf("Fix Vector = %s\n", fvector); printf("board mode = %d : ", board_mode); if(board_mode == 1) printf("M30262F8FG(OAKS16 MINI)\n"); else printf("M30620FCAFP(OAKS16)\n"); 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; if(*s == '(' || *s == ')' || *s <= ' '){ s++; continue; } 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, "INT_ENTRY("); test_string(&s, "EXC_ENTRY("); test_string(&s, "CFG_INT_ENTRY("); test_string(&s, "CFG_EXC_ENTRY("); test_string(&s, "(FP)"); if(skip_space(&s)) continue; while(*s != ')' && *s != ',' && *s > ' '){ *p++ = *s++; } *p++ = 0; num_vec[vec_state]++; } 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; printf("int %d:%d,%s,%s\n", j, v->no, v->no_name, v->no_label); } 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); printf("exc %d:%d,%s,%s\n", j, v->no, v->no_name, v->no_label); } 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(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]); switch(board_mode){ case 1: // M30262F8FG(OAKS16 MINI) set_M30262F8FG(pfo, board_mode, max_int); break; default: // M30620FCAFP(OAKS16) set_M30620FCAFP(pfo, board_mode, max_int); break; } set_comment(pfo, exc_vec); fputs("\t.section\tfvector", pfo);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -