2 = TOPPERS/JSPカーネル ユーザズマニュアル =
5 (Release 1.4.1対応,最終更新: 6-Oct-2004)
7 ------------------------------------------------------------------------
9 Toyohashi Open Platform for Embedded Real-Time Systems/
10 Just Standard Profile Kernel
12 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
13 Toyohashi Univ. of Technology, JAPAN
15 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
16 によって公表されている GNU General Public License の Version 2 に記
17 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
18 を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
20 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
21 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
23 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
24 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
25 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
27 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
30 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
31 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
34 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
35 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
37 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
38 よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
39 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
40 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
42 @(#) $Id: m68k.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $
43 ------------------------------------------------------------------------
50 M68040プロセッサのターゲットシステムとしては,(株)電産製の DVE-68K/40
51 CPUボード(CPU: MC68LC040)のみをサポートしている.
55 開発環境には,GCCなどのGNU開発環境を用い,オブジェクトファイルフォーマッ
58 実行環境として,ROMモニタを用いる方法とGDBスタブを用いる方法をサポート
59 している.GDBスタブを用いる場合には,Makefile中で,DBGENVにGDB_STUBを
60 定義する(デフォルト).ROMモニタを用いる場合には,DBGENVを定義しない.
64 M68040依存の機能として,割込みマスクの変更・参照(chg_ixx,get_ixx)を
65 サポートしている.また,DVE-68K/40 CPUボード依存の機能として,性能評価
66 用システム時刻参照機能(vxget_tim)をサポートしている.割込みの禁止と
67 許可(dis_int,ena_int)はサポートしていない.
71 現バージョンでは,FPUを持たないMC68LC040のみをサポートしている.FPUを
72 用いない場合には,FPU内蔵のM68040にも適用可能なはずである.FPUを活用し
73 たい場合には,ディスパッチャでFPUレジスタを保存/復帰する必要があるな
76 他のM68K系列のプロセッサへのポーティングについては,マスタスタックと別
77 に割込みスタックを持つM68020以降のプロセッサへは比較的容易にポーティン
78 グ可能と思われるが,それより前のプロセッサへのポーティングはやや面倒で
84 この節では,カーネルおよびシステムサービスの機能の中で,M68040依存の部
89 signed int型,unsigned int型,size_t型のサイズは,いずれも32ビットであ
94 カーネル管理外の割込みはNMIのみである.よって,CPUロック状態や初期化ルー
95 チン内では,NMI以外の割込みはすべて禁止されている.具体的には,IPM
96 (Interrupt Priority Mask)が7に設定される.
98 DEF_INHで指定する割込みハンドラ番号(inhno)は,M68040での例外ベクタ番
99 号を表し,そのデータ型(INHNO)はunsigned int型に定義されている.
100 DEF_INHで,例外ベクタ番号として有効でない値や,外部割込みに対応しない
103 M68040依存の機能として,SR(Status Register)中のIPM(Interrupt
104 Priority Mask)の値を変更するためのサービスコールchg_ipmと,参照するた
105 めのサービスコールget_ipmをサポートしている.なお,IPMの値を表すデータ
106 型IPMは,unsigned int型に定義されている.
108 これらのサービスコールは,タスクコンテキストでCPUロック解除状態の場合
109 にのみ呼び出すことができる.chg_ipmによりIPMを0以外(すなわち,何らか
110 の割込みが禁止されている状態)にした場合でも,ディスパッチは禁止されず,
111 chg_ipmにより変更したIPMの値は,ディスパッチ後のタスクに引き継がれる.
112 例えば,あるタスクでIPMを1に変更した後,何らかの割込みにより別のタスク
113 に切り替わると,切り替わった後のタスクでもIPMは1になる.ただし,IPMを0
114 以外に設定していても,実行できるタスクがなくなった場合にはIPMは一時的
115 に0になる.これは,M68040の命令セットからくる制限事項である(解決手段
118 chg_ipmをサポートするために,割込みハンドラの出入口処理などにオーバヘッ
119 ドを生じている.そこで,SUPPORT_CHG_IPMというマクロにより,これらのサー
120 ビスコールをサポートするかどうかを切り替えられるようにしている.
121 SUPPORT_CHG_IPMは,cpu_config.hの中でマクロ定義されている.
123 M68040依存の割込みマスクの変更・参照のためのサービスコールの仕様は次の
126 (1) chg_ipm 割込みマスクの変更
129 ER ercd = chg_ipm(IPM ipm);
139 E_PAR パラメータエラー(ipm が不正)
143 IPM(Interrupt Priority Mask)を ipm で指定された値に設定する.指定し
144 た値が 0〜6 以外の場合,E_PARエラーとなる.IPM を 1〜6 に設定した場合
145 でも,ディスパッチは禁止されない.また,設定した IPM の値は,ディスパッ
146 チ後も引き継がれる.ディスパッチを禁止したい場合には,dis_dsp と併用す
149 なお,このサービスコールを用いて,IPM を 7 (すべての割込みを禁止)に
150 設定することはできない.IPM を 7 にしたい場合には,loc_cpu を使うべき
153 このサービスコールは,タスクコンテキストで CPUロック解除状態の時のみ呼
154 び出すことができる.非タスクコンテキストや CPUロック状態で呼び出した場
157 (2) get_ipm 割込みマスクの参照
160 ER ercd = get_ipm(IPM *p_ipm);
174 現在の IPM(Interrupt Priority Mask)の値を読み出し,ipm に返す.
176 このサービスコールは,タスクコンテキストで CPUロック解除状態の時のみ呼
177 び出すことができる.非タスクコンテキストや CPUロック状態で呼び出した場
180 2.3 CPU例外管理機能とCPU例外ハンドラ
182 DEF_EXC で指定する割込みハンドラ番号(excno)は,M68040 での例外ベクタ
183 番号を表し,そのデータ型(EXCNO)は unsigned int型に定義されている.
184 DEF_EXC で,例外ベクタ番号として有効でない値や,CPU例外に対応しない番
189 M68040依存のスタートアップモジュール(start.S)では,次の初期化処理を
192 (A) プロセッサモードの初期化とスタックポインタの初期化
194 最初に,すべてのキャッシュを無効化した後,コードキャッシュとデータキャッ
195 シュを共に有効にする.また,プロセッサのモードを,スーパバイザモード・
196 割込みモードに設定し,NMI 以外のすべての割込みを禁止する.スタートアッ
197 プモジュールは,スーパバイザモードで起動しなければならないので,ここで
198 スーパバイザモードに設定するのは,本当はムダである.
200 次に,割込みスタックポインタ(SPI)を STACKTOP に設定する.ここで割込
201 みスタックポインタに設定されたスタック領域は,カーネル起動後は非タスク
202 コンテキスト用のスタック領域として使われる.STACKTOP は,sys_config.h
203 部で定義することを想定している.また,フレームポインタを 0 に初期化す
206 (B) hardware_init_hook の呼出し
208 hardware_init_hook が 0 でない場合には,hardware_init_hook を呼び出す.
209 hardware_init_hook は,カーネルが起動される前に行う必要があるターゲッ
210 ト依存の初期化を行うために用意している.hardware_init_hook がどこでも
211 定義されていない場合,リンカでこのシンボルを 0 に定義する(リンカスク
214 (C) bssセクションと dataセクションの初期化
216 bssセクションをゼロクリアする.また,dataセクションを初期化する.
218 (D) software_init_hook の呼出し
220 software_init_hook が 0 でない場合には,software_init_hook を呼び出す.
221 software_init_hook は,カーネルが起動される前に行う必要があるソフトウェ
222 ア環境(具体的には,ライブラリ)依存の初期化を行うために用意している.
223 software_init_hook がどこでも定義されていない場合,リンカでこのシンボ
224 ルを 0 に定義する(リンカスクリプト内に記述あり).
228 kernel_start へ分岐し,カーネルを起動する.kernel_start からリターンし
232 3.DVE-68K/40 システム依存部の機能
236 システムクロックドライバがisig_timを呼び出す周期は,sys_defs.h中の
237 TIC_NUMEとTIC_DENOで定義されている(標準は 1ミリ秒周期).この定義を変
238 更することで,isig_timを呼び出す周期を変更することができる.ただし,タ
239 イマの精度が1μ秒であるため,1μ秒単位で端数になる値を設定した場合には,
240 isig_timの呼出し周期に誤差が生じることになる.
244 DVE-68K/40依存部では,性能評価用システム時刻参照機能(vxget_tim)をサ
245 ポートしている.性能評価用システム時刻の精度は1μ秒単位であるが,タイ
246 マの現在値を読み出すために一時的にタイマを停止させる必要があるため,
247 vxget_timを呼ぶ度にシステムクロックが少しづつ遅れることになる.なお,
248 SYSUTIM型はUD型(64ビットの符号無し整数型)に定義している.
252 DVE-68K/40依存部のシリアルインタフェースドライバは,DVE-68K/40 CPUボー
253 ドの2つのシリアルインタフェースをサポートしている.ポートID=1がポートB,
254 ポートID=2がポートAに対応している.ポートの割当てを逆にしているのは,
255 GDBスタブまたはROMモニタがポートAを使用するためである.
259 DVE-68K/40依存部では,CPUボード上のメモリが4MBの場合を想定し,コード領
260 域を0x10000〜0xfffffの約1MB,データ領域を0x100000〜の約3MB,非タスクコ
261 ンテキスト用のスタック領域を〜0x3fffffに確保している.0〜0xffffの64KB
262 は,ROMモニタまたはGDBスタブのワークエリアとなっており,使用することが
268 開発環境の構築方法については,GNU開発環境構築マニュアルを参照すること.
272 動作確認したツールのバージョンは以下の通りである.
279 GCC 2.95.3では,アプリケーションが標準Cライブラリを使用しないなら,
282 GCC 3.3を用いる場合,コンパイラが標準Cライブラリ関数を呼び出すコードを
283 生成するため,NEWLIBが必要になる.NEWLIBの標準Cライブラリをリンクする
284 ために,Makefile中のLIBSの定義に以下のように -lc を追加する必要がある.
286 LIBS := $(LIBS) $(CXXLIBS) -lc -lgcc
293 M68040ターゲット依存部の各ファイルの概要は次の通り.
296 Makefile.config MakefileのM68040依存定義
297 cpu_defs.h プロセッサ依存部のアプリケーション用定義
298 cpu_config.h プロセッサ依存部の構成定義
299 cpu_config.c プロセッサ依存部の関数
300 cpu_support.S プロセッサ依存部のサブルーチン
301 cpu_context.h コンテキスト操作
302 cpu_rename.def カーネルの内部識別名のリネーム定義
303 cpu_rename.h カーネルの内部識別名のリネーム
304 cpu_unrename.h カーネルの内部識別名のリネーム解除
305 tool_defs.h 開発環境依存部のアプリケーション用定義(GNU開発環境用)
306 tool_config.h 開発環境依存部の構成定義(GNU開発環境用)
307 makeoffset.c offset.h生成サポートプログラム
308 cpu_insn.h 低レベルのプロセッサ操作ルーチン
313 Makefile.config MakefileのDVE-68K/40依存定義
314 sys_defs.h システム依存部のアプリケーション用定義
315 sys_config.h システム依存部の構成定義
316 sys_config.c システム依存部の関数
317 sys_support.S システム依存部のサブルーチン
318 sys_rename.def カーネルの内部識別名のリネーム定義
319 sys_rename.h カーネルの内部識別名のリネーム
320 sys_unrename.h カーネルの内部識別名のリネーム解除
323 hw_serial.cfg SIOドライバのコンフィギュレーションファイル
324 dve68k.h DVE-68K/40 CPUボードのハードウェア資源の定義
325 dve68k_dga.h DGAのアクセスユーティリティ
328 upd72001.h μPD72001用 簡易SIOドライバ関連の定義
329 upd72001.c μPD72001用 簡易SIOドライバ
333 ターゲットへのダウンロードと実行手順については,GNU開発環境構築マニュ
334 アルに説明されているが,以下では,M68040およびDVE-68K/40 CPUボードの場
339 DVE-68K/40 CPUボードの場合,別売りのROMモニタとそれに対応した端末ソフ
340 トを用いると,Rコマンドでバイナリ形式のファイルをダウンロードすること
352 M68040では,プログラムを実行中にNMIをかける(DVE-68K/40 CPUボードでは,
353 ABORTスイッチを押す)ことで,プログラムを停止させて,gdbに制御を戻すこ