📄 cpu_support.s
字号:
/* * 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-2005 by Industrial Technology Institute, * Miyagi Prefectural Government, JAPAN * Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering * Tomakomai National College of Technology, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: cpu_support.S,v 1.16 2005/11/07 01:49:53 honda Exp $ *//* * プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈H8脱∷ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"/* * NMIを近くすべての充哈みを敦贿 */#define DISINT orc.b #H8INT_DIS_ALL, ccr/* * すべての充哈みを钓材 */#define ENAINT andc.b #H8INT_ENA_ALL, ccr .h8300h .text .align 2/* * タスクディスパッチャ * * _dispatch は、充哈み嘲ネストカウンタ = 0,充哈み敦贿觉轮 * で钙び叫さなければならないˉexit_and_dispatch も·充哈みネスト * カウンタ = 0ˇ充哈み敦贿觉轮で钙び叫すのが付搂であるが·カ〖ネル * 弹瓢箕に滦炳するため·充哈みネストカウンタ = 1で钙び叫した眷圭に * も滦炳しているˉ */ .global _dispatch_dispatch: push.l er4 /* er4×6を瘦赂 */ push.l er5 push.l er6 mov.l @_runtsk, er0 /* er0 <- runtsk */ mov.l sp, @(TCB_sp, er0) /* タスクスタックポインタを瘦赂 */ mov.l #dispatch_r, er1 /* 悸乖浩倡戎孟 */ mov.l er1, @(TCB_pc, er0) bra dispatcherdispatch_r: pop.l er6 /* er4×6を牲傅 */ pop.l er5 pop.l er4 mov.l @_runtsk, er0 mov.b @(TCB_enatex, er0), r1l /* runtsk->enatex のチェック */ btst #TCB_enatex_bit, r1l beq dispatch_r_1 mov.l @(TCB_texptn, er0), er1 /* runtsk->texptn のチェック */ beq dispatch_r_1 jmp @_call_texrtndispatch_r_1: rts /* dispatch()の钙び叫し傅へリタ〖ン */ .global _exit_and_dispatch_exit_and_dispatch: /* 充り哈み敦贿で钙ばれる */ mov.b #0, r0l /* 充哈みネストカウンタをクリア */ mov.b r0l, @_intnest/* * ディスパッテャ塑挛 */dispatcher: /* * ここには充り哈み敦贿で丸ること */ /* * ここでruntskにschedtskを洛掐するのは2つの罢蹋がある。 * (1) schedtsk != NULLの眷圭 * 奶撅のタスク磊り仑えを乖う。 * (2) schedtsk == NULLの眷圭 * runtskにNULLを洛掐しておく。 * ∈dispatcher_1笆惯の充哈み略ちで充哈みが掐り、その面で * iget_tid()がコ〖ルされたときに赖しくTSK_NONEを手すため * には、悸乖觉轮のタスクがない箕に、runtskをNULLにして * おく涩妥がある。∷ */ mov.l @_schedtsk, er0 /* er0 <- schedtsk */ mov.l er0, @_runtsk /* schedtskをruntskに */ /* 悸乖すべきタスクがなければ、充哈み略ちへ尸呆 */ beq dispatcher_1 mov.l @(TCB_sp, er0), sp mov.l @(TCB_pc, er0), er0 /* 悸乖浩倡戎孟を牲耽 */ jmp @er0 /* * 悸乖すべきタスクがない眷圭の充哈み略ち * * ここで充哈みモ〖ドに磊り垂えるのは·ここで券栏する充哈み借妄 * にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で * のタスクディスパッチの松贿という企つの罢蹋があるˉ */dispatcher_1: /* スタックを充り哈みスタックに磊仑え */ mov.l #STACKTOP, sp /* 充哈みネストカウンタを1にする */ mov.b #1, r0l mov.b r0l, @_intnest /* * r1l¨充哈み钓材箕にccrに肋年する猛 * 充哈みハンドラ柒ではchg_ipmが蝗脱できないので、 * task_intmaskは1搀粕み哈んでおけば、OK */#ifdef SUPPORT_CHG_IPM mov.b @_task_intmask, r1l#else /* SUPPORT_CHG_IPM */ mov.b #H8INT_ENA_ALL, r1l#endif /* SUPPORT_CHG_IPM */ /* CPUロックフラグをクリア */ sub.l er0, er0 mov.l er0, @_iscpulockeddispatcher_2_enable_interrupt: /* * ldc炭吾木稿は充哈み敦贿であり、充哈み妥滇があっても * 肌の炭吾が悸乖される。 * ∈充哈みから提ってきてsleepするケ〖スはない∷ */ ldc.b r1l, ccr /* 充り哈み钓材 */ sleep /* 充哈み略ち */ DISINT /* 充り哈み敦贿 */ mov.l @_reqflg, er0 /* reqflgのチェック */ /* reqflgはBOOL房 -> int房(32bits) */ /* reqflg==NULLならば、もう1刨充哈み略ち */ beq dispatcher_2_enable_interrupt sub.l er0, er0 mov.l er0, @_reqflg /* reqflgのクリア */ /* 充哈みネストカウンタをクリア */ mov.b r0l, @_intnest bra dispatcher/* * * 充哈みハンドラ掐庚借妄 * 充哈み妥傍に巴らず、鼎奶な婶尸 * ∈cpu_config.hのINTHDR_ENTRYからの鲁き∷ * * 笆布の觉轮でここにやってくる * ˇ充哈み敦贿 * ˇer0×er3锣闰貉み * ˇer2¨C咐胳ル〖チンの黎片アドレス * ˇr3l¨充哈み钓材箕に充哈みマスクに肋年する猛 */ .global _common_interrupt_process_common_interrupt_process: push.l er4 /* 呵努步滦忽でer4も锣闰 */ mov.b @_intnest, r0l /* 充哈みネストカウンタのチェック */ bne _interrupt_from_int /* intnetが0でなければ、*/ /* 驴脚充哈みの借妄へ */ /* * 介檬の充哈みの眷圭 */ mov.b #1, r1l /* 充哈みネストカウンタ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -