|
|
cpu_config.c説明を見る。00001 /* 00002 * TOPPERS/FDMP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Function Distributed Multiprocessor Kernel 00005 * 00006 * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory 00007 * Graduate School of Information Science, Nagoya Univ., JAPAN 00008 * 00009 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 00010 * によって公表されている GNU General Public License の Version 2 に記 00011 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 00012 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 00013 * 利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * 00031 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00032 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 00033 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 00034 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 00035 * 00036 * @(#) $Id: cpu_config.c,v 1.3 2006/03/13 07:34:04 honda Exp $ 00037 */ 00038 00042 #include "fdmp_kernel.h" 00043 #include "check.h" 00044 #include "task.h" 00045 #include <nios2.h> 00046 00047 /* 00048 * 割り込みハンドラ/ビットマスクテーブル 00049 */ 00050 FP int_handler_table[MAX_INT_NUM]; 00051 UW int_bit_table[MAX_INT_NUM]; 00052 00053 /* 00054 * CPU例外ハンドラテーブル 00055 */ 00056 FP exc_handler_table[MAX_EXC_NUM]; 00057 00058 /* 00059 * 割り込みのネスト回数のカウント 00060 * カーネル起動時はタスク独立部とみなすため1で初期化する 00061 */ 00062 UW interrupt_count = 1; 00063 00064 /* 00065 * プロセッサ依存の初期化 00066 */ 00067 void 00068 cpu_initialize() 00069 { 00070 int i; 00071 00072 /* 00073 * int_handler_table[],int_plevel_table[]の初期化 00074 * 未登録の割込み発生時にcpu_interrup()が呼び出されるように 00075 * no_reg_interrup()を登録する 00076 */ 00077 for(i = 0; i < MAX_INT_NUM; i++){ 00078 int_handler_table[i] = no_reg_interrupt; 00079 int_bit_table[i] = 1 << i; /* ビットパターンの生成 */ 00080 } 00081 00082 /* 00083 * CPU例外ハンドラテーブル 00084 */ 00085 for(i = 0; i < MAX_EXC_NUM; i++){ 00086 exc_handler_table[i] = no_reg_exception; 00087 } 00088 } 00089 00090 /* 00091 * プロセッサ依存の終了処理 00092 * 割込み禁止 00093 */ 00094 void 00095 cpu_terminate() 00096 { 00097 disint(); 00098 } 00099 00100 00101 /* 00102 * 割込みの許可/禁止 00103 */ 00104 SYSCALL ER 00105 ena_int(INTNO intno){ 00106 set_ienable((1 << intno) | current_ienable()); 00107 return(E_OK); 00108 } 00109 00110 SYSCALL ER 00111 dis_int(INTNO intno){ 00112 set_ienable(~(1 << intno) & current_ienable()); 00113 return(E_OK); 00114 } 00115 00116 00117 /* 00118 * 未登録の割込みが発生した場合に呼び出される 00119 */ 00120 void 00121 no_reg_interrupt(void) 00122 { 00123 syslog(LOG_EMERG, "Unregisted Interrupt Occur!"); 00124 while(1); 00125 } 00126 00127 /* 00128 * 未登録の例外が発生した場合に呼び出される 00129 */ 00130 void 00131 no_reg_exception(void) 00132 { 00133 syslog(LOG_EMERG, "Unregisted Exception Occur!"); 00134 while(1); 00135 } 00136 00137 /* 00138 * 割込み要因の判定と割込みハンドラの呼び出し 00139 */ 00140 void 00141 int_handler_call(){ 00142 UW status; 00143 UW mask; 00144 int i; 00145 00146 interrupt_count++; 00147 status = current_ipending(); 00148 for(i = 0; i < 32; i++){ 00149 if((status & (1 << i)) != 0x00){ 00150 mask = current_ienable(); 00151 set_ienable(~int_bit_table[i] & mask); 00152 00153 enaint(); 00154 (int_handler_table[i])(); 00155 disint(); 00156 00157 set_ienable(mask); 00158 break; 00159 } 00160 } 00161 interrupt_count--; 00162 } 00163 00164 /* 00165 * 例外の判定とCPU例外ハンドラの呼び出し 00166 * 現在は未実装命令例外のみをサポート 00167 */ 00168 void 00169 exc_handler_call(VP p_excinf){ 00170 interrupt_count++; 00171 00172 enaint(); 00173 (exc_handler_table[0])(p_excinf); 00174 disint(); 00175 00176 interrupt_count--; 00177 } Copyright © 2006 by TAKAGI Nobuhisa. このページは Mon Apr 3 23:49:12 2006 に Doxygen によって生成されました。 |