📄 cpu_config.h
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2001-2004 by Industrial Technology Institute, * Miyagi Prefectural Government, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: cpu_config.h,v 1.18 2005/11/14 08:00:44 honda Exp $ *//* * プロセッサ巴赂モジュ〖ル∈SH1脱∷ * カ〖ネル柒婶で蝗脱する年盗 * デ〖タ房、マクロ、簇眶のプロトタイプ离咐 * * このインクル〖ドファイルは·t_config.h のみからインクル〖ドされるˉ * 戮のファイルから木儡インクル〖ドしてはならないˉ */#ifndef _CPU_CONFIG_H_#define _CPU_CONFIG_H_/* * カ〖ネルの柒婶急侍叹のリネ〖ム */#include <cpu_rename.h>/* * SH1プロセッサの柒婶レジスタの年盗 */#include <sh1.h>/* * 眶猛デ〖タ矢机误步脱マクロの年盗 */#include <util.h>/* * ユ〖ザ〖年盗攫鼠 */#include <user_config.h>/* * 肋年材墙な呵光庭黎刨 */#ifdef GDB_STUB#define MAX_IPM 0xe /* スタブありの眷圭は庭黎刨14でCPUロック */#else#define MAX_IPM 0xf /* スタブなしの眷圭は呵光庭黎刨でCPUロック */#endif /* GDB_STUB */#define str_MAX_IPM TO_STRING(MAX_IPM)/* * プロセッサの泼检炭吾のインライン簇眶年盗 */#ifndef _MACRO_ONLY#include <cpu_insn.h>#endif /* _MACRO_ONLY *//* * TCB 面のフィ〖ルドのビット升の年盗 * * cpu_context.h に掐れる数がエレガントだが·徊救の巴赂拉の簇犯で· * cpu_context.h には掐れられないˉ */#define TBIT_TCB_TSTAT 8 /* tstat フィ〖ルドのビット升 */#define TBIT_TCB_PRIORITY 8 /* priority フィ〖ルドのビット升 */#ifndef _MACRO_ONLY/* * タスクコンテキストブロックの年盗 * * spをUW *房としているのは4バイト董肠を罢急しているため * */typedef struct task_context_block { UW *sp; /* スタックポインタ */ FP pc; /* プログラムカウンタ */} CTXB;/* * 充哈みマスク拎侯ライブラリ * * 充哈みマスク∈intmask∷は·IPM∈Interrupt Priority Mask∷を4ビット * 焊にシフトしたものであるˉ *//* * 附哼の充哈みマスクの粕叫し */Inline UWcurrent_intmask(void){ return(current_sr() & 0x000000f0u);}/* * 充哈みマスクの肋年 */Inline voidset_intmask(UW intmask){ set_sr((current_sr() & ~0x000000f0u) | intmask);}/* * 充哈み】CPU毋嘲ネストカウンタ */extern UW intnest;/* * システム觉轮徊救 *//* * コンテキスト徊救 * * 充哈みネストカウンタを粕み叫した木稿に充哈みが券栏しても、 * 提ったときにはコンテキストも傅に提っている */Inline BOOLsense_context(void){ return(intnest > 0);}Inline BOOLsense_lock(void){ return(current_intmask() == (MAX_IPM << 4));}#define t_sense_lock sense_lock#define i_sense_lock sense_lock/* * CPUロックとその豺近∈タスクコンテキスト脱∷ * * task_intmask は·chg_ipm をサポ〖トするための恃眶ˉchg_ipm をサポ〖 * トしない眷圭には·task_intmask が撅に 0 になっていると雇えればよいˉ */#ifdef SUPPORT_CHG_IPMextern UW task_intmask; /* タスクコンテキストでの充哈みマスク */#endif /* SUPPORT_CHG_IPM */Inline voidt_lock_cpu(viod){ disint(); /* cpu_insn.h */}Inline voidt_unlock_cpu(void){#ifdef SUPPORT_CHG_IPM /* * t_unlock_cpu が钙び叫されるのは CPUロック觉轮のみであるた * め·借妄の庞面で task_intmask が今き垂わることはないˉ */ set_intmask(task_intmask);#else /* SUPPORT_CHG_IPM */ enaint(); /* cpu_insn.h */#endif /* SUPPORT_CHG_IPM */}/* * CPUロックとその豺近∈润タスクコンテキスト脱∷ */extern UW int_intmask; /* 润タスクコンテキストでの充哈みマスク */Inline voidi_lock_cpu(void){ UW intmask; /* * 办箕恃眶 intmask を蝗っているのは·current_intmask() を钙 * んだ木稿に充哈みが券栏し·弹瓢された充哈みハンドラ柒で * int_intmask が恃构される材墙拉があるためであるˉ */ intmask = current_intmask(); disint(); int_intmask = intmask;}Inline voidi_unlock_cpu(void){ set_intmask(int_intmask);}/* * タスクディスパッチャ *//* * 呵光庭黎界疤タスクへのディスパッチ∈cpu_support.S∷ * * dispatch は·タスクコンテキストから钙び叫されたサ〖ビスコ〖ル借妄 * 柒で·CPUロック觉轮で钙び叫さなければならないˉ */extern void dispatch(void);/* * 附哼のコンテキストを嘉ててディスパッチ∈cpu_support.S∷ * * exit_and_dispatch は·CPUロック觉轮で钙び叫さなければならないˉ */extern void exit_and_dispatch(void);#endif /* _MACRO_ONLY *//* * 充哈みハンドラ】CPU毋嘲ハンドラの肋年 *//* * 毋嘲ベクタテ〖ブルの年盗 * マクロの棱汤 * KERNEL_HAS_A_VECTOR_TABLE * カ〖ネルが毋嘲ベクタテ〖ブルを积つ * SIO_RESERVED * シリアルデバイスがデバッガによって蝗脱されている */#ifndef _MACRO_ONLY#ifdef KERNEL_HAS_A_VECTOR_TABLEextern FP vector_table[]; /* 毋嘲ベクタテ〖ブル */#endif /* KERNEL_HAS_A_VECTOR_TABLE *//* * 充哈みハンドラの肋年 * * ベクトル戎规 inhno の充哈みハンドラの弹瓢戎孟を inthdr に肋年するˉ */Inline voiddefine_inh(INHNO inhno, FP inthdr){#ifdef GDB_STUB /* スタブ钙び叫し */ Asm("mov #0x08,r0; \ mov %0,r4; \ mov %1,r5; \ trapa #0x21" : /* no output */ : "r"(inhno),"r"(inthdr) : "r0","r4","r5");#else /* GDB_STUB */#ifdef KERNEL_HAS_A_VECTOR_TABLE#ifdef SIO_RESERVED /* シリアル充り哈みは闰ける */ if ((inhno != RXI0) && (inhno != TXI0))#endif /* SIO_RESERVED */ vector_table[inhno] = inthdr;#endif /* KERNEL_HAS_A_VECTOR_TABLE */#endif /* GDB_STUB */}/* * CPU毋嘲ハンドラの肋年 * * ベクトル戎规 excno のCPU毋嘲ハンドラの弹瓢戎孟を exchdr に肋年するˉ */extern void define_exc(EXCNO excno, FP exchdr) throw();/* * 充哈みハンドラ】CPU毋嘲ハンドラの掐庚借妄 *//* C咐胳ル〖チンの簇眶叹から掐庚借妄のラベルを栏喇 * kernel_cfg.cで蝗脱 */#define INT_ENTRY(inthdr) _kernel_##inthdr##_entry#define EXC_ENTRY(exchdr) _kernel_##exchdr##_entry/* * 充哈みハンドラ】CPU毋嘲ハンドラの掐庚借妄の鼎奶婶尸 * * SH1では、充哈みとCPU毋嘲の胺いがほとんど票じなので、 * 掐庚借妄のマクロも鼎奶に年盗している * * 苞眶 * label¨掐庚借妄のラベル * inthdr¨C咐胳ル〖チンの黎片アドレス * common_routine¨cpu_support.S柒の尸呆黎アドレス * interrupt_entry¨充哈みの眷圭 * cpu_exception_entry¨CPU毋嘲の眷圭 * * レジスタ充碰 * r1¨充哈み减烧木稿のSRのコピ〖 * r0¨interrupt_entry * r2¨C咐胳ル〖チンの黎片アドレス * * 充哈みとCPU毋嘲の陵般爬 * ˇCPU毋嘲ハンドラに苞眶を涂える * ˇCPU毋嘲では、毋嘲券栏箕のIPMと票じ猛で充哈みを钓材する * ∈CPU毋嘲により、IPMを恃步させない∷ * * ˇ充哈みハンドラの眷圭 * 充哈み减烧箕にハ〖ドウェアがIPMを肋年する * 充哈み钓材にはこのIPMの猛を脱いる * ˇCPU毋嘲ハンドラの眷圭 * CPU毋嘲减烧箕にIPMの猛は恃步しない * 充哈み钓材にはCPU毋嘲券栏箕のIPMの猛を脱いる */#define HANDLER_ENTRY_PROC(label, handler, common_routine) \asm(".text; "\" .align 2; "\" .global _"#label"; "\"_"#label":; "\ /* 涩妥呵井嘎のレジスタをスタックに略闰 */ \" mov.l r0,@-r15; "\" mov.l r1,@-r15; "\ /* 充哈み敦贿とSR牲傅の洁洒 */ \" stc sr,r1; "\ /* 充哈み敦贿 */ \ /* 充哈みを敦贿する涟に侍の充哈みが掐った眷圭の庙罢爬は */ \ /* cpu_suppourt.Sのret_intを徊救 */ \" mov.l _mask_ipm_"#handler",r0; "\" ldc r0,sr; "\" mov.l r2,@-r15; "\" mov.l _common_routine_"#handler",r0; "\" mov.l _c_routine_"#handler",r2;" /* C咐胳ル〖チンの黎片アドレス*/\" jmp @r0; "/* interrupt_entryへジャンプ */ \" nop; " /* 觅变スロット */ \ /* 洒雇 */ \ /* 觅变スロットにPC陵滦アドレッシングのロ〖ド炭吾を */ \ /* 掐れると疙瓢侯する。 */ \ /* ∈スロット稍碰炭吾毋嘲が券栏しないので券斧が岂しい。∷ */ \ \" .align 2; "\"_mask_ipm_"#handler":; " /* 充哈み敦贿脱マスク */ \" .long "str_MAX_IPM" << 4; " /* ipm笆嘲のビットはゼロで紊い */ \"_c_routine_"#handler":; "\" .long _"#handler"; " /* C咐胳ル〖チンの黎片アドレス */ \"_common_routine_"#handler":; " /* cpu_support.S柒の尸呆黎アドレス */ \" .long __kernel_"#common_routine"; " \)/* * 充哈みハンドラの掐庚借妄の栏喇マクロ * */#define INTHDR_ENTRY(inthdr) INTHDR_ENTRY2(INT_ENTRY(inthdr), inthdr)#define INTHDR_ENTRY2(entry, inthdr) \ extern void entry(void); \ HANDLER_ENTRY_PROC(entry, inthdr, interrupt_entry)/* * CPU毋嘲ハンドラの掐庚借妄の栏喇マクロ */#define EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY2(EXC_ENTRY(exchdr), exchdr)#define EXCHDR_ENTRY2(entry, exchdr) \ extern void entry(void); \ HANDLER_ENTRY_PROC(entry, exchdr, cpu_exception_entry) /* * void entry()は帽なるエントリのラベルなので、 * 苞眶は烧けない *//* * CPU毋嘲の券栏した箕のシステム觉轮の徊救 *//* * CPU毋嘲の券栏した箕のコンテキストの徊救 */Inline BOOLexc_sense_context(VP p_excinf){ /* * 1と孺秤するのは、附哼悸乖面のCPU毋嘲の尸 * 充哈みネストカウンタがインクリメントされているため * * CPU毋嘲の掐庚借妄面に侍のCPU毋嘲は券栏しないと簿年 * している */ return(intnest > 1);}/* * CPU毋嘲の券栏した箕のCPUロック觉轮の徊救 */Inline BOOLexc_sense_lock(VP p_excinf){ UW sr = *(UW *)p_excinf; return((sr& 0x00000f0u) == (MAX_IPM << 4));}/* * プロセッサ巴赂の介袋步 */extern void cpu_initialize(void);/* * プロセッサ巴赂の姜位箕借妄 */extern void cpu_terminate(void);/* * 布淡のログ叫蜗箕のスタック菇陇の年盗 */typedef struct exc_stack { VW r0; VW r1; VW r2; VW r3; VW r4; VW r5; VW r6; VW r7; VW r8; VW r9; VW r10; VW r11; VW r12; VW r13; VW r14; VW r15; VW pr; /* プロシ〖ジャˇレジスタ */ VW pc; /* プログラムˇカウンタ */ VW sr; /* ステ〖タスˇレジスタ */} EXCSTACK;/* * 毋嘲券栏箕のログ叫蜗 (cpu_config.c, cpu_support.S) */extern void cpu_experr(EXCSTACK *);#endif /* _MACRO_ONLY *//* * 毋嘲ベクタに肋年するデフォルトの猛 * 笆布の毋嘲妥傍でデフォルトとは佰なる毋嘲ベクタを年盗 * する眷圭は、sys_config.hで澈碰するマクロを年盗する。 */#define RESET_VECTOR start /* リセットベクタ */#define INIT_STACK STACKTOP /* スタックポインタの介袋猛 */#define RESERVED_VECTOR RESET_VECTOR /* システム徒腆のリセットベクタ */ /* 悸狠には蝗脱されない */#ifndef GII_VECTOR /* 办忍稍碰炭吾 */#define GII_VECTOR RESET_VECTOR#endif /* GII_VECTOR */#ifndef SII_VECTOR /* スロット稍碰炭吾 */#define SII_VECTOR RESET_VECTOR#endif /* SII_VECTOR */#ifndef CAE_VECTOR /* CPUアドレスエラ〖 */#define CAE_VECTOR RESET_VECTOR#endif /* CAE_VECTOR */#ifndef DAE_VECTOR /* DMAアドレスエラ〖 */#define DAE_VECTOR RESET_VECTOR#endif /* DAE_VECTOR */#ifndef NMI_VECTOR /* NMI */#define NMI_VECTOR RESET_VECTOR#endif /* NMI_VECTOR */#endif /* _CPU_CONFIG_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -