📄 cpu_config.h
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2003-2004 by Naoki Saito * Nagoya Municipal Industrial Research Institute, JAPAN * Copyright (C) 2003-2004 by Ryosuke Takeuchi * Platform Development Center RICOH COMPANY,LTD. 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.3 2005/11/24 12:41:23 honda Exp $ *//* * プロセッサ巴赂モジュ〖ル∈M16C脱∷ * * このインクル〖ドファイルは·t_config.h のみからインクル〖ドされるˉ * 戮のファイルから木儡インクル〖ドしてはならないˉ */#ifndef _CPU_CONFIG_H_#define _CPU_CONFIG_H_#ifdef NEED_API#include "api.h"#endif /* NEED_API *//* * カ〖ネルの柒婶急侍叹のリネ〖ム */#include <cpu_rename.h>/* * プロセッサの泼检炭吾のインライン簇眶年盗 */#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 4 /* priority フィ〖ルドのビット升 */#ifndef _MACRO_ONLY/* * タスクコンテキストブロックの年盗 */typedef struct task_context_block { void *sp; /* スタックポインタ(near盖年) */ FP pc; /* プログラムカウンタ */} CTXB;/* * 充哈み/CPU毋嘲ネストカウンタ */extern char intnest;/* * システム觉轮の徊救 *//* * 附哼のコンテキストを手す簇眶. * 润タスクコンテキストならTRUEを手す. */Inline BOOLsense_context(void){ /* ネストカウンタ0より络なら润タスクコンテキスト */ return(intnest > 0);}/* * 附哼のCPUロック觉轮を手す簇眶. * CPUロック觉轮ならTRUEを手す. */Inline BOOLsense_lock(void){ return((current_flgreg() & FLG_I_MASK) == 0);}#define t_sense_lock sense_lock#define i_sense_lock sense_lock/* * CPUロックとその豺近 */Inline voidlock_cpu(void){ disint();}Inline voidunlock_cpu(void){ enaint();}#define t_lock_cpu lock_cpu#define i_lock_cpu lock_cpu#define t_unlock_cpu unlock_cpu#define i_unlock_cpu unlock_cpu/* * タスクディスパッチャ *//* * 呵光庭黎界疤タスクへのディスパッチ∈cpu_support.a30∷ * * dispatch は·タスクコンテキストから钙び叫された * サ〖ビスコ〖ル借妄の面から·CPUロック觉轮で钙び叫さなければならないˉ */extern void dispatch(void);/* * 附哼のコンテキストを嘉ててディスパッチ(cpu_support.a30) * exit_and_dispatch は·CPUロック觉轮で钙び叫さなければならないˉ */extern void exit_and_dispatch(void);/* * 充哈みハンドラ】CPU毋嘲ハンドラの肋年 *//* * 充哈みハンドラの肋年 * * ベクトル戎规 inhno の充哈みハンドラの弹瓢戎孟を inthdr に肋年するˉ * 充哈みハンドラを判峡するベクタテ〖ブルはROM惧に艰り, * そこに今き哈む. そのためここでは部もしないˉ */Inline voiddefine_inh(INHNO inhno, FP inthdr){}/* * CPU毋嘲ハンドラの肋年 * * ベクトル戎规 excno のCPU毋嘲ハンドラの弹瓢戎孟を exchdr に肋年するˉ * 充哈みハンドラを判峡するベクタテ〖ブルはROM惧に艰り, * そこに今き哈む. そのためここでは部もしないˉ */Inline voiddefine_exc(EXCNO excno, FP exchdr){}/* * 充哈みハンドラ】CPU毋嘲ハンドラの叫掐庚借妄 * * 充哈み】CPU毋嘲が券栏箕のCPUの觉轮は肌のとおり. * * FLGレジスタのIビットは 0(充哈み敦贿) * FLGレジスタのIPLは减け烧けた充哈みのIPL * FLGレジスタのUビットは, 充哈みの硷梧によって佰なるが, * カ〖ネルではISPのみを蝗脱し, USPを蝗脱していないため, * ここでは啼玛とならない. * * 充哈み/毋嘲券栏箕には, 极瓢弄に FLG, PCがスタックへ瘦赂される. * 叫掐り庚借妄ではまず荒りのレジスタをスタックに瘦赂する. * 介檬の充哈みの眷圭はタスクのスタックに, * 驴脚充り哈みの眷圭は充哈み脱のスタックに, それぞれ瘦赂される. * * その稿, スタックポインタの猛を r1 に, * 充哈みハンドラのアドレスを a1 と a0 に呈羌した觉轮で * 充哈み叫掐庚借妄の稿染へジャンプする. *//* * 充哈みハンドラの叫掐庚借妄の栏喇マクロ * * 充哈み券栏箕、悸乖面のレジスタの猛をスタックに锣闰するˉその稿、ス * タックの猛をR1レジスタにセットしアセンブラで淡揭されたハンドリング * プログラムに尸呆するˉ */#define INTHDR_ENTRY(inthdr)\extern void inthdr##_entry(void);\asm(" .glb _" #inthdr " ");\asm(" .glb __kernel_interrupt ");\asm(" .section program, code, align ");\asm("_" #inthdr "_entry: ");\asm(" pushm r0,r1,r2,r3,a0,a1,sb,fb ; レジスタをタスクスタックへ锣闰");\asm(" stc isp, r1 ; スタックポインタを艰り叫し ");\asm(" mov.w #_" #inthdr "&0ffffh, a0; 充哈みハンドラの布疤2バイト ");\asm(" mov.w #_" #inthdr ">>16, a1 ; 充哈みハンドラの惧疤2バイト ");\asm(" jmp __kernel_interrupt ; 充哈み借妄ル〖チン稿染へ ");#define INT_ENTRY(inthdr) inthdr##_entry/* * CPU毋嘲ハンドラの叫掐庚借妄の栏喇マクロ * * CPU毋嘲ハンドラの答塑弄な借妄は充哈みハンドラと鼎铜するˉ充哈みハ * ンドラとの般いはスタック猛を锣闰したR1レジスタの猛をp_excinfとして * 蝗脱するか、しないかの汗佰のみですˉ */#define EXCHDR_ENTRY(exchdr)\extern void exchdr##_entry(void);\asm(" .glb $" #exchdr " ");\asm(" .glb __kernel_interrupt ");\asm(" .section program, code, align ");\asm("_" #exchdr "_entry: ");\asm(" pushm r0,r1,r2,r3,a0,a1,sb,fb ; レジスタをタスクスタックへ锣闰");\asm(" stc isp, r1 ; スタックポインタを艰り叫し ");\asm(" mov.w #$" #exchdr "&0ffffh, a0; 充哈みハンドラの布疤2バイト ");\asm(" mov.w #$" #exchdr ">>16, a1 ; 充哈みハンドラの惧疤2バイト ");\asm(" jmp __kernel_interrupt ; 充哈み借妄ル〖チン稿染へ ");#define EXC_ENTRY(exchdr) exchdr##_entry/* * CPU毋嘲の券栏した箕のシステム觉轮の徊救 *//* * CPU毋嘲の券栏した箕のコンテキストの徊救 */Inline BOOLexc_sense_context(VP p_excinf){ /* * ネストカウンタが1より络なら润タスクコンテキスト */ return( intnest > 1);}/* * CPU毋嘲の券栏した箕のCPUロック觉轮の徊救 */Inline BOOLexc_sense_lock(VP p_excinf){ /* * 毋嘲券栏涟のFLGレジスタIビットが0ならCPUロック觉轮 * * 布及の年眶18はCPU毋嘲掐り庚借妄でレジスタがスタックにどう * 瘦赂されているかに巴赂して疯年する眶猛 */ return( ( *(char *)((char *)p_excinf+18) & FLG_I_MASK ) == 0);}/* * プロセッサ巴赂の介袋步(cpu_config.c) */extern void cpu_initialize(void);/* * プロセッサ巴赂の姜位箕借妄(cpu_config.c) */extern void cpu_terminate(void);#endif /* _MACRO_ONLY */#endif /* _CPU_CONFIG_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -