OSDN Git Service

動作検証済み。DSPの負荷率を%で表示できるようになった。出力はsyslog()
[trx-305dsp/dsp.git] / trx305 / kernel / config / blackfin / cpu_config.h
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  *
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  *
9  *  TOPPERS/JSP for Blackfin
10  *
11  *  Copyright (C) 2004,2006,2006 by Takemasa Nakamura
12  *  Copyright (C) 2004 by Ujinosuke
13  *
14  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
15  *  によって公表されている GNU General Public License の Version 2 に記
16  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
18  *  利用と呼ぶ)することを無償で許諾する.
19  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21  *      スコード中に含まれていること.
22  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
24  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
25  *      の無保証規定を掲載すること.
26  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
28  *      と.
29  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
30  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
31  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
32  *        報告すること.
33  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
35  *
36  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
38  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
39  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
40  *
41  *
42  */
43
44
45 /*
46  *  プロセッサ依存のカーネル資源(BLACKfin用)
47  *
48  *  このインクルードファイルは,t_config.h のみからインクルードされる.
49  *  他のファイルから直接インクルードしてはならない.
50  */
51
52 #ifndef _CPU_CONFIG_H_
53 #define _CPU_CONFIG_H_
54
55 /*
56  *  サービスコール選択マクロの読み込み
57  */
58 #ifdef __GNUC__
59 /*
60 * サービスコール選択は、configureスクリプトがおこなうので、gnu環境では不要
61 */
62 //#include <api.h>
63 #elif defined(__ECC__)
64 /*
65 * サービスコール選択は、IPAが行うので、VisualDSP++環境ではすべて選択しておく
66 */
67 #include <api.h>
68 #else
69 #error "Compiler is not supported"
70 #endif
71
72 /*
73 *  イベントプライオリティ宣言. sys_config.h の device_dispatcher()で使う。
74 */
75 #ifndef ik_timer
76 #define ik_timer 6
77 #endif
78
79 #ifndef ik_hardware
80 #define ik_hardware_err 5
81 #endif
82
83 /*
84  *  カーネルの内部識別名のリネーム
85  */
86 #include <cpu_rename.h>
87
88 /*
89 *   BLACKfinのビットマップ検索機能を使う
90 *   BLACKfinはMSBから数える。
91 */
92 #define CPU_BITMAP_SEARCH
93 #define PRIMAP_BIT(pri)     (0x40000000u >> (pri))
94
95
96 /*
97  *  TCB 中のフィールドのビット幅の定義
98  *
99  *  cpu_context.h に入れる方がエレガントだが,参照の依存性の関係で,
100  *  cpu_context.h には入れられない.
101  */
102 #define TBIT_TCB_TSTAT      8   /* tstat フィールドのビット幅 */
103 #define TBIT_TCB_PRIORITY   8   /* priority フィールドのビット幅 */
104
105
106 /*
107 *   BLACKfinのIMASKへの設定パターン
108 *
109 */
110 #define IMASK_LOCK   0xc01f
111 #define IMASK_UNLOCK 0xffff
112
113 #ifndef _MACRO_ONLY
114
115 /*
116  * カーネル内部のidle命令実行サイクル数
117  * この値にはidle命令の実行時間(cclk)が累積されていくので、適当にクリアして使うこと。
118  */
119 extern unsigned int idle_cycle;
120
121 /*
122  *  プロセッサの特殊命令のインライン関数定義
123  */
124 /*
125  *  レディキューサーチのためのビットマップサーチ関数
126  *
127  *  ビットマップの下位16ビットを使用し,最下位ビットを最低優先度に対応
128  *  させる.
129  */
130
131
132 Inline UINT
133 bitmap_search(UINT bitmap)
134 {
135     UINT    numOfSign;
136
137     /*
138      *  このコードは,bitmap(UINT型)が32ビットであることを仮定し
139      *  ている.Signbits 命令は32ビット整数を取ってMSBから連続する
140      *  符号ビット - 1 を返す。all 0のときは31を返す。LSBのみが1の
141      *  ときは30を返す。
142      */
143 #ifdef __GNUC__         // gcc
144     // gcc 3.4.1 の時点では、オペランドに下位ハーフレジスタを指定
145     // できないため、余計なコードが必要になる。
146     Asm( "r0.L=signbits %1; %0 = r0.L;": "=d"(numOfSign) : "d"(bitmap) : "R0" );
147 #elif defined(__ECC__)  // visualdsp
148     Asm( "%0=signbits %1;": "=l"(numOfSign) : "d"(bitmap) );
149 #else
150 #error "Compiler is not supported"
151 #endif
152     return( numOfSign );
153 }
154
155
156
157 /*
158  *  タスクコンテキストブロックの定義
159  */
160 typedef struct task_context_block {
161     VP  sp;     /* スタックポインタ */
162     FP  pc;     /* プログラムカウンタ */
163 } CTXB;
164
165
166 /*
167  *  システム状態参照
168  *  返す値は以下のとおり
169  *  TRUE : 非タスクコンテキスト
170  *  FALSE: タスクコンテキスト
171  *              IPENDが$8000か$8010の時、タスクコンテキストである。それ以外のときは非タスクコンテキスト。
172  */
173
174 Inline BOOL
175 sense_context()
176 {
177     return( *__pIPEND & 0x7FEF );
178 }
179
180 /*
181 * 現在のロック状態を調べる。管理外割り込みまでロックするsil_loc_int()に
182 * よるロック状態は、このsense_lock()では無視する。
183 */
184 Inline BOOL
185 sense_lock()
186 {
187 #ifdef UNMANAGED_INT
188     return((*__pIMASK & ~UNMANAGED_INT )== 0xC01F );
189 #else
190     return(*__pIMASK == 0xC01F );
191 #endif
192 }
193
194 #define t_sense_lock    sense_lock
195 #define i_sense_lock    sense_lock
196
197
198 /*
199  *  CPUロックとその解除(タスクコンテキスト用)
200  *
201  *  task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー
202  *  トしない場合には,task_intmask が常に 0 になっていると考えればよい.
203  *
204  */
205
206 #ifdef SUPPORT_CHG_IPM
207 extern UH   task_intmask;   /* タスクコンテキストでの割込みマスク */
208 #endif /* SUPPORT_CHG_IPM */
209
210 #ifdef UNMANAGED_INT
211 #if UNMANAGED_INT & 0xC01F
212 // 管理外割り込みの範囲チェック。管理外割り込みはIVHWからIVG13の間でなければならない
213 #error "Illegal un-managed interrupt : must be IVHW-IVG13"
214 #endif
215 #endif
216
217
218 // BLACKfinではIMASKに0xC01Fを書き込んでCPUをロックする。
219 Inline void
220 t_lock_cpu()
221 {
222 #ifdef UNMANAGED_INT
223     unsigned int imask;
224     Asm( "cli %0;" :"=d"(imask) );
225     Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
226 #else
227     Asm( "cli r0;" : : :"R0" );
228     Asm( "sti %0;" : :"d"(0xC01F) );
229 #endif
230 }
231
232 Inline void
233 t_unlock_cpu()
234 {
235 #ifdef UNMANAGED_INT
236     unsigned int imask;
237     Asm( "cli %0;" :"=d"(imask) );
238     Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
239 #else
240     Asm( "sti %0;" : :"d"(0xffff) );
241 #endif
242 }
243
244 /*
245  *  CPUロックとその解除(非タスクコンテキスト用)
246  */
247
248
249 Inline void
250 i_lock_cpu()
251 {
252 #ifdef UNMANAGED_INT
253     unsigned int imask;
254     Asm( "cli %0;" :"=d"(imask) );
255     Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
256 #else
257     Asm( "cli r0;" : : :"R0" );
258     Asm( "sti %0;" : :"d"(0xC01F) );
259 #endif
260 }
261
262 Inline void
263 i_unlock_cpu()
264 {
265 #ifdef UNMANAGED_INT
266     unsigned int imask;
267     Asm( "cli %0;" :"=d"(imask) );
268     Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
269 #else
270     Asm( "sti %0;" : :"d"(0xffff) );
271 #endif
272 }
273
274 /*
275  *  タスクディスパッチャ
276  */
277
278 /*
279  *  最高優先順位タスクへのディスパッチ(cpu_support.S)
280  *
281  *  dispatch は,タスクコンテキストから呼び出されたサービスコール処理
282  *  内で,CPUロック状態で呼び出さなければならない.
283  */
284 extern void dispatch(void);
285
286 /*
287  *  現在のコンテキストを捨ててディスパッチ(cpu_support.S)
288  *
289  *  exit_and_dispatch は,CPUロック状態で呼び出さなければならない.
290  */
291 extern void exit_and_dispatch(void);
292
293
294 /*
295  * ブート時にシステムリセットをするなら真。デフォルトでは偽。
296  */
297 extern unsigned int enable_boot_for_gdb;
298 /*
299  *  割込みハンドラ/CPU例外ハンドラの設定
300  */
301
302
303 /*
304  *  割込みハンドラの設定
305  *
306  *  ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
307  * evtvector はstart.asmで定義されている。
308  */
309 extern void (* dev_vector[])(void) ;
310
311 extern void (* exc_vector)(VP) ;
312 Inline void
313 define_inh(INHNO inhno, FP inthdr)
314 {
315     dev_vector[inhno] = inthdr;
316 }
317
318 /*
319  *  CPU例外ハンドラの設定
320  *
321  *  ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する.
322  */
323 Inline void
324 define_exc(EXCNO excno, FP exchdr)
325 {
326 //  exc_vector[excno] = exchdr;     // 例外ハンドラを配列に格納
327     exc_vector = (void (*)(VP))exchdr;      // 例外ハンドラを格納
328 }
329
330 /*
331  *  割込みハンドラ/CPU例外ハンドラの出入口処理
332  */
333
334 /*
335  *  割込みハンドラの出入口処理の生成マクロ
336  *
337  *  reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
338  *  に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ
339  *  スパッチされない.
340  */
341
342 #define INTHDR_ENTRY(inthdr)    extern void inthdr(void);
343 #define INT_ENTRY(inthdr)   inthdr
344
345 /*
346  *  CPU例外ハンドラの出入口処理の生成マクロ
347  *
348  *  reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
349  *  に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ
350  *  スパッチされない.
351  */
352
353 #define EXCHDR_ENTRY(exchdr)    extern void exchdr( VP );
354 #define EXC_ENTRY(exchdr)   exchdr
355
356 /*
357  *  CPU例外の発生した時のシステム状態の参照
358  */
359
360 /*
361  *  CPU例外の発生した時のコンテキストの参照
362  */
363 Inline BOOL
364 exc_sense_context(VP p_excinf)
365 {
366     return( *__pIPEND & 0x7FE6 );               // IVG15, GIE, EXP, EMU 以外のビットが立っていれば非タスクコンテキスト
367 }
368
369 /*
370  *  CPU例外の発生した時のCPUロック状態の参照。管理外割り込みの状態は無視する。
371  */
372 Inline BOOL
373 exc_sense_lock(VP p_excinf)
374 {
375 #ifdef UNMANAGED_INT
376     return((*__pIMASK | UNMANAGED_INT) != 0xFFFF );     // 0xFFFFならアンロック
377 #else
378     return(*__pIMASK != 0xFFFF );               // 0xFFFFならアンロック
379 #endif
380 }
381
382 /*
383  *  プロセッサ依存の初期化
384  */
385 extern void cpu_initialize(void);
386
387 /*
388  *  プロセッサ依存の終了時処理
389  */
390 extern void cpu_terminate(void);
391
392 #endif /* _MACRO_ONLY */
393 #endif /* _CPU_CONFIG_H_ */