📄 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-2004 by Dep. of Computer Science and Engineering * Tomakomai National College 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プロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h" .h8300s .text .align 2/* * タスクディスパッチャ * ˇdispatch は、充哈みネストカウンタ = 0、CPUロック觉轮∈充哈み敦贿觉轮∷で * 钙び叫さなければならない。 * ˇexit_and_dispatch は·充哈みネストカウンタ = 0、CPUロック觉轮∈充哈み敦贿 * 觉轮∷で钙び叫すのが付搂である。しかし、カ〖ネル弹瓢箕に滦炳するため· * 充哈みネストカウンタ = 1 で钙び叫した眷圭にも滦炳している。 */ .global _dispatch .global _exit_and_dispatch/* タスクディスパッチャを汤绩弄に钙び叫す箕 */_dispatch: push.l er2 /* er2×6 を瘦赂 */ push.l er3 push.l er4 push.l er5 push.l er6 mov.l @_runtsk, er0 /* er0 = runtsk */ mov.l sp, @(TCB_sp, er0) /* runtsk->sp = sp (タスクスタックポインタを瘦赂) */ mov.l #dispatch_r, er1 mov.l er1, @(TCB_pc, er0) /* runtsk->pc = dispatch_r (タスクの悸乖浩倡戎孟を瘦赂) */ bra dispatcher_1/* 附哼悸乖面のコンテキストを嘉てて、タスクディスパッチャを钙び叫す箕 */_exit_and_dispatch: sub.l er0, er0 mov.l er0, @_intnest /* 充哈みネストカウンタ = 0 */dispatcher_1: /* ここには CPUロック∈充り哈み敦贿∷で丸ること */ mov.l @_schedtsk, er0 /* er0 = schedtsk */ or.l er0, er0 /* 冉年婶尸 (悸乖材墙タスクの铜痰) */ beq dispatcher_2 /* schedtsk が痰いなら、充哈み略ちへ */ mov.l er0, @_runtsk /* runtsk = er0 (= schedtsk) (タスクスイッチの悸乖) */ mov.l @(TCB_sp, er0), sp /* sp = runtsk->sp (タスクスタックポインタ牲傅) */ mov.l @(TCB_pc, er0), er0 /* er0 = runtsk->pc (タスクの悸乖浩倡戎孟の艰评) */ /* 悸乖浩倡戎孟は笆布の3奶り ˇディスパッチャの叫庚 dispatch_r ˇ充哈み】毋嘲の叫庚 ret_int_r ˇタスク弹瓢木稿 activate_r */ jmp @er0 /* タスクの悸乖浩倡戎孟へジャンプ */ /* * 悸乖すべきタスクが附れるまで略つ借妄 * ここでコンテキストを磊り垂えるのは· * ˇここで券栏する充哈み借妄にどのスタックを蝗うかという啼玛の豺疯 * ˇ充哈みハンドラ柒でのタスクディスパッチの松贿 * という企つの罢蹋があるˉ */ dispatcher_2: sub.l er0, er0 mov.l er0, @_runtsk /* runtsk = NULL */ mov.l #STACKTOP, sp /* 充哈みスタックに磊仑 */ sub.l er0, er0 inc.l #1, er0 mov.l er0, @_intnest /* 充哈みネストカウンタ = 1 */dispatcher_2_enable_interrupt:#ifdef SUPPORT_CHG_IPM ldc.b @_task_intmask, exr /* unlock_cpu陵碰(充哈み钓材) */#else /* SUPPORT_CHG_IPM */ ldc.b #0, exr /* unlock_cpu陵碰(充哈み钓材) */#endif /* SUPPORT_CHG_IPM */ sleep /* 充哈み略ち */ ldc.b #MAX_IPM, exr /* lock_cpu 陵碰 (充哈み敦贿) */ mov.l @_reqflg, er0 /* er0 = reqflg */ or.l er0, er0 /* 冉年婶尸 (ディスパッチ妥滇) */ beq dispatcher_2_enable_interrupt /* ディスパッチ妥滇が痰い箕、 ル〖プの黎片へジャンプ */ sub.l er0, er0 /* er0 = 0 (= NULL) */ mov.l er0, @_reqflg /* reqflg = NULL (reqflgをクリア) */ mov.l er0, @_intnest /* 充哈みネストカウンタ = 0 */ bra dispatcher_1 /* ディスパッチ借妄へジャンプ *//* * タスクコンテキストへの牲耽借妄∈ディスパッチャ叫庚借妄∷ */dispatch_r: pop.l er6 /* er2×6 を牲傅 */ pop.l er5 pop.l er4 pop.l er3 pop.l er2 /* タスク毋嘲借妄妥滇のチェック */ mov.l @_runtsk, er0 /* er0 = runtsk */ mov.b @(TCB_enatex, er0), r1l /* r1l = runtsk->enatex */ btst #TCB_enatex_bit, r1l /* TCB_enatex == 1 か々 */ beq dispatch_r_1 /* タスク毋嘲借妄敦贿の箕、ジャンプ */ mov.l @(TCB_texptn, er0), er1 /* er1 = runtsk->texptn */ beq dispatch_r_1 /* タスク毋嘲妥滇が痰い箕、ジャンプ */ jmp @_call_texrtn /* タスク毋嘲借妄ル〖チンの钙叫 */dispatch_r_1: rts /* dispatch 钙び叫し改疥へ提る *//*============================================================================*//* * 充哈みハンドラ叫掐庚借妄 * ここに丸るときは、CPU ロック觉轮で、 * er0(r0l) : 充哈み妥滇稿の充り哈みレベルの猛 * er1 : 充哈みハンドラのアドレス * が洛掐されている。∈er0, er1 はスタックに瘦赂貉み∷ */ .global ret_main .global _ret_int_r /* monitor 羹け */ret_main: push.l er2 /* 荒りのレジスタを瘦赂 */ push.l er3 push.l er4 push.l er5 push.l er6 /* もしかすると、H8S/2600 における macl, mach レジスタの瘦赂も ここで乖う涩妥があるかも梦れません。∈牲耽箕も票屯。∷ 倡券茨董の扩嘎により、澄千できていません。 */ mov.l @_intnest, er2 /* er2 = intnest */ mov.l er2, er3 /* er3(= er2)は、肌の借妄で网脱する。 */ inc.l #1, er2 /* 充哈みネストカウンタ += 1 */ mov.l er2, @_intnest or.l er3, er3 /* 冉年婶尸 (充哈み券栏箕のコンテキスト) */ beq first_exception /* 介檬の充哈みの箕、ジャンプ *//* 驴脚充哈みの借妄 */multipul_exception: ldc.b r0l, exr /* (附哼の充哈みレベル笆惧)充哈み钓材 */ jsr @er1 /* 充哈みハンドラ钙叫 */ ldc.b #MAX_IPM, exr /* lock_cpu 陵碰 (充哈み敦贿) */ mov.l @_intnest, er0 /* er0 = intnest */ dec.l #1, er0 /* 充哈みネストカウンタ -= 1 */ mov.l er0, @_intnest jmp ret_to_task_int
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -