OSDN Git Service

bd2c9f49142f6fb48e9cfe62f3bc8ba142990139
[trx-305dsp/dsp.git] / trx305 / kernel / doc / m68k.txt
1
2         = TOPPERS/JSPカーネル ユーザズマニュアル =
3             (M68040 ターゲット依存部)
4
5              (Release 1.4.1対応,最終更新: 6-Oct-2004)
6
7 ------------------------------------------------------------------------ 
8  TOPPERS/JSP Kernel
9      Toyohashi Open Platform for Embedded Real-Time Systems/
10      Just Standard Profile Kernel
11
12  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
13                              Toyohashi Univ. of Technology, JAPAN
14
15  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
16  によって公表されている GNU General Public License の Version 2 に記
17  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
18  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
19  利用と呼ぶ)することを無償で許諾する.
20  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
21      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22      スコード中に含まれていること.
23  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
24      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
25      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
26      の無保証規定を掲載すること.
27  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
29      と.
30    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
31        作権表示,この利用条件および下記の無保証規定を掲載すること.
32    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
33        報告すること.
34  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
35      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
36
37  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
38  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
39  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
40  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
41
42  @(#) $Id: m68k.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $
43 ------------------------------------------------------------------------
44
45
46 1.M68040 ターゲット依存部の概要
47
48 1.1 ターゲットシステム
49
50 M68040プロセッサのターゲットシステムとしては,(株)電産製の DVE-68K/40
51 CPUボード(CPU: MC68LC040)のみをサポートしている.
52
53 1.2 開発環境と実行環境
54
55 開発環境には,GCCなどのGNU開発環境を用い,オブジェクトファイルフォーマッ
56 トはELFを標準とする.
57
58 実行環境として,ROMモニタを用いる方法とGDBスタブを用いる方法をサポート
59 している.GDBスタブを用いる場合には,Makefile中で,DBGENVにGDB_STUBを
60 定義する(デフォルト).ROMモニタを用いる場合には,DBGENVを定義しない.
61
62 1.3 サポートする機能の概要
63
64 M68040依存の機能として,割込みマスクの変更・参照(chg_ixx,get_ixx)を
65 サポートしている.また,DVE-68K/40 CPUボード依存の機能として,性能評価
66 用システム時刻参照機能(vxget_tim)をサポートしている.割込みの禁止と
67 許可(dis_int,ena_int)はサポートしていない.
68
69 1.4 他のターゲットへのポーティング
70
71 現バージョンでは,FPUを持たないMC68LC040のみをサポートしている.FPUを
72 用いない場合には,FPU内蔵のM68040にも適用可能なはずである.FPUを活用し
73 たい場合には,ディスパッチャでFPUレジスタを保存/復帰する必要があるな
74 ど,若干の改造が必要である.
75
76 他のM68K系列のプロセッサへのポーティングについては,マスタスタックと別
77 に割込みスタックを持つM68020以降のプロセッサへは比較的容易にポーティン
78 グ可能と思われるが,それより前のプロセッサへのポーティングはやや面倒で
79 あろう.
80
81
82 2.M68040プロセッサ依存部の機能
83
84 この節では,カーネルおよびシステムサービスの機能の中で,M68040依存の部
85 分について解説する.
86
87 2.1 データ型
88
89 signed int型,unsigned int型,size_t型のサイズは,いずれも32ビットであ
90 る.
91
92 2.2 割込み管理機能と割込みハンドラ
93
94 カーネル管理外の割込みはNMIのみである.よって,CPUロック状態や初期化ルー
95 チン内では,NMI以外の割込みはすべて禁止されている.具体的には,IPM
96 (Interrupt Priority Mask)が7に設定される.
97
98 DEF_INHで指定する割込みハンドラ番号(inhno)は,M68040での例外ベクタ番
99 号を表し,そのデータ型(INHNO)はunsigned int型に定義されている.
100 DEF_INHで,例外ベクタ番号として有効でない値や,外部割込みに対応しない
101 番号を指定した場合の動作は保証されない.
102
103 M68040依存の機能として,SR(Status Register)中のIPM(Interrupt
104 Priority Mask)の値を変更するためのサービスコールchg_ipmと,参照するた
105 めのサービスコールget_ipmをサポートしている.なお,IPMの値を表すデータ
106 型IPMは,unsigned int型に定義されている.
107
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の命令セットからくる制限事項である(解決手段
116 がないわけではない).
117
118 chg_ipmをサポートするために,割込みハンドラの出入口処理などにオーバヘッ
119 ドを生じている.そこで,SUPPORT_CHG_IPMというマクロにより,これらのサー
120 ビスコールをサポートするかどうかを切り替えられるようにしている.
121 SUPPORT_CHG_IPMは,cpu_config.hの中でマクロ定義されている.
122
123 M68040依存の割込みマスクの変更・参照のためのサービスコールの仕様は次の
124 通り.
125
126 (1) chg_ipm         割込みマスクの変更
127
128 【C言語API】
129     ER ercd = chg_ipm(IPM ipm);
130
131 【パラメータ】
132     IPM ipm     設定すべき IPM の値
133
134 【リターンパラメータ】
135     ER  ercd        エラーコード
136
137 【エラーコード】
138     E_CTX       コンテキストエラー
139     E_PAR       パラメータエラー(ipm が不正)
140
141 【機能】
142
143 IPM(Interrupt Priority Mask)を ipm で指定された値に設定する.指定し
144 た値が 0〜6 以外の場合,E_PARエラーとなる.IPM を 1〜6 に設定した場合
145 でも,ディスパッチは禁止されない.また,設定した IPM の値は,ディスパッ
146 チ後も引き継がれる.ディスパッチを禁止したい場合には,dis_dsp と併用す
147 ればよい.
148
149 なお,このサービスコールを用いて,IPM を 7 (すべての割込みを禁止)に
150 設定することはできない.IPM を 7 にしたい場合には,loc_cpu を使うべき
151 である.
152
153 このサービスコールは,タスクコンテキストで CPUロック解除状態の時のみ呼
154 び出すことができる.非タスクコンテキストや CPUロック状態で呼び出した場
155 合には,E_CTXエラーとなる.
156
157 (2) get_ipm         割込みマスクの参照
158
159 【C言語API】
160     ER ercd = get_ipm(IPM *p_ipm);
161
162 【パラメータ】
163     なし
164
165 【リターンパラメータ】
166     ER  ercd        エラーコード
167     IPM ipm     現在の IPM の値
168
169 【エラーコード】
170     E_CTX       コンテキストエラー
171
172 【機能】
173
174 現在の IPM(Interrupt Priority Mask)の値を読み出し,ipm に返す.
175
176 このサービスコールは,タスクコンテキストで CPUロック解除状態の時のみ呼
177 び出すことができる.非タスクコンテキストや CPUロック状態で呼び出した場
178 合には,E_CTXエラーとなる.
179
180 2.3 CPU例外管理機能とCPU例外ハンドラ
181
182 DEF_EXC で指定する割込みハンドラ番号(excno)は,M68040 での例外ベクタ
183 番号を表し,そのデータ型(EXCNO)は unsigned int型に定義されている.
184 DEF_EXC で,例外ベクタ番号として有効でない値や,CPU例外に対応しない番
185 号を指定した場合の動作は保証されない.
186
187 2.4 スタートアップモジュール
188
189 M68040依存のスタートアップモジュール(start.S)では,次の初期化処理を
190 行う.
191
192 (A) プロセッサモードの初期化とスタックポインタの初期化
193
194 最初に,すべてのキャッシュを無効化した後,コードキャッシュとデータキャッ
195 シュを共に有効にする.また,プロセッサのモードを,スーパバイザモード・
196 割込みモードに設定し,NMI 以外のすべての割込みを禁止する.スタートアッ
197 プモジュールは,スーパバイザモードで起動しなければならないので,ここで
198 スーパバイザモードに設定するのは,本当はムダである.
199
200 次に,割込みスタックポインタ(SPI)を STACKTOP に設定する.ここで割込
201 みスタックポインタに設定されたスタック領域は,カーネル起動後は非タスク
202 コンテキスト用のスタック領域として使われる.STACKTOP は,sys_config.h 
203 部で定義することを想定している.また,フレームポインタを 0 に初期化す
204 る.
205
206 (B) hardware_init_hook の呼出し
207
208 hardware_init_hook が 0 でない場合には,hardware_init_hook を呼び出す.
209 hardware_init_hook は,カーネルが起動される前に行う必要があるターゲッ
210 ト依存の初期化を行うために用意している.hardware_init_hook がどこでも
211 定義されていない場合,リンカでこのシンボルを 0 に定義する(リンカスク
212 リプト内に記述あり).
213
214 (C) bssセクションと dataセクションの初期化
215
216 bssセクションをゼロクリアする.また,dataセクションを初期化する.
217
218 (D) software_init_hook の呼出し
219
220 software_init_hook が 0 でない場合には,software_init_hook を呼び出す.
221 software_init_hook は,カーネルが起動される前に行う必要があるソフトウェ
222 ア環境(具体的には,ライブラリ)依存の初期化を行うために用意している.
223 software_init_hook がどこでも定義されていない場合,リンカでこのシンボ
224 ルを 0 に定義する(リンカスクリプト内に記述あり).
225
226 (E) カーネルの起動
227
228 kernel_start へ分岐し,カーネルを起動する.kernel_start からリターンし
229 てくることは想定していない.
230
231
232 3.DVE-68K/40 システム依存部の機能
233
234 3.1 システムクロックドライバ
235
236 システムクロックドライバがisig_timを呼び出す周期は,sys_defs.h中の
237 TIC_NUMEとTIC_DENOで定義されている(標準は 1ミリ秒周期).この定義を変
238 更することで,isig_timを呼び出す周期を変更することができる.ただし,タ
239 イマの精度が1μ秒であるため,1μ秒単位で端数になる値を設定した場合には,
240 isig_timの呼出し周期に誤差が生じることになる.
241
242 3.2 性能評価用システム時刻参照機能
243
244 DVE-68K/40依存部では,性能評価用システム時刻参照機能(vxget_tim)をサ
245 ポートしている.性能評価用システム時刻の精度は1μ秒単位であるが,タイ
246 マの現在値を読み出すために一時的にタイマを停止させる必要があるため,
247 vxget_timを呼ぶ度にシステムクロックが少しづつ遅れることになる.なお,
248 SYSUTIM型はUD型(64ビットの符号無し整数型)に定義している.
249
250 3.3 シリアルインタフェースドライバ
251
252 DVE-68K/40依存部のシリアルインタフェースドライバは,DVE-68K/40 CPUボー
253 ドの2つのシリアルインタフェースをサポートしている.ポートID=1がポートB,
254 ポートID=2がポートAに対応している.ポートの割当てを逆にしているのは,
255 GDBスタブまたはROMモニタがポートAを使用するためである.
256
257 3.4 メモリマップ
258
259 DVE-68K/40依存部では,CPUボード上のメモリが4MBの場合を想定し,コード領
260 域を0x10000〜0xfffffの約1MB,データ領域を0x100000〜の約3MB,非タスクコ
261 ンテキスト用のスタック領域を〜0x3fffffに確保している.0〜0xffffの64KB 
262 は,ROMモニタまたはGDBスタブのワークエリアとなっており,使用することが
263 できない.
264
265
266 4.開発環境の構築
267
268 開発環境の構築方法については,GNU開発環境構築マニュアルを参照すること.
269
270 4.1 開発環境のバージョン
271
272 動作確認したツールのバージョンは以下の通りである.
273
274     BINUTILS : 2.13.2.1
275     GCC-CORE : 2.95.3
276     GDB      : 5.3
277     NEWLIB   : 1.9.0
278
279 GCC 2.95.3では,アプリケーションが標準Cライブラリを使用しないなら,
280 NEWLIBは必要ない.
281
282 GCC 3.3を用いる場合,コンパイラが標準Cライブラリ関数を呼び出すコードを
283 生成するため,NEWLIBが必要になる.NEWLIBの標準Cライブラリをリンクする
284 ために,Makefile中のLIBSの定義に以下のように -lc を追加する必要がある.
285
286     LIBS := $(LIBS) $(CXXLIBS) -lc -lgcc
287
288
289 5.その他
290
291 5.1 ディレクトリ・ファイル構成
292
293 M68040ターゲット依存部の各ファイルの概要は次の通り.
294
295     config/m68k/
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  低レベルのプロセッサ操作ルーチン
309     start.S     スタートアップモジュール
310     m68kelf.ld  リンカスクリプト
311
312     config/m68k/dve68k/
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  カーネルの内部識別名のリネーム解除
321     hw_timer.h  タイマ操作ルーチン
322     hw_serial.h SIOドライバ
323     hw_serial.cfg   SIOドライバのコンフィギュレーションファイル
324     dve68k.h    DVE-68K/40 CPUボードのハードウェア資源の定義
325     dve68k_dga.h    DGAのアクセスユーティリティ
326
327     pdic/simple_sio/
328     upd72001.h  μPD72001用 簡易SIOドライバ関連の定義
329     upd72001.c  μPD72001用 簡易SIOドライバ
330
331 5.2 ターゲットへのダウンロードと実行
332
333 ターゲットへのダウンロードと実行手順については,GNU開発環境構築マニュ
334 アルに説明されているが,以下では,M68040およびDVE-68K/40 CPUボードの場
335 合に特有の事項について説明する.
336
337 (A) ROMモニタを用いる方法
338
339 DVE-68K/40 CPUボードの場合,別売りのROMモニタとそれに対応した端末ソフ
340 トを用いると,Rコマンドでバイナリ形式のファイルをダウンロードすること
341 ができる.
342
343     #R 10000
344     \up jsp.bin
345
346 プログラムの実行は,gコマンドで行う.
347
348     #g 10000
349
350 (B) GDBスタブを用いる方法
351
352 M68040では,プログラムを実行中にNMIをかける(DVE-68K/40 CPUボードでは,
353 ABORTスイッチを押す)ことで,プログラムを停止させて,gdbに制御を戻すこ
354 とができる.
355
356 以上