📄 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 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_support.S,v 1.15 2005/11/07 01:15:43 honda Exp $ *//* * プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈SH1脱∷ * カ〖ネル柒婶で蝗脱する年盗 */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"/* * タスクコントロ〖ルブロックTCB面のsp,pcが黎片から60バイトの * 认跋柒にあり、アラインメントが4バイト董肠になっていれば、 * イミディエイト陵滦アドレッシングでアクセスできる * TCB_pc,TCB_spはoffset.hで年盗されている * (make箕に栏喇される∷ *//* イミディエイト陵滦アドレッシングが材墙かチェック */#define CHECK_IMMEDIATE_ADDRESSING(dst) \ ((dst <= 60) && ((dst % 4) == 0))#if CHECK_IMMEDIATE_ADDRESSING(TCB_pc) && \ CHECK_IMMEDIATE_ADDRESSING(TCB_sp)#define TCB_SHORT#endif/* * タスクコントロ〖ルブロックTCB面のsp,pcが黎片から128バイト * 笆惯に芹弥されていると * mov #TCB_sp,r9 * 霹の射规橙磨を崔む炭吾は袋略奶りに瓢侯しない */#if (TCB_pc > 127) || (TCB_sp > 127)#error TCB offset is limited 127.#endif#if !CHECK_IMMEDIATE_ADDRESSING(TCB_texptn)#error immediate addressing TCB_texptn.#endif/* * その戮のオフセット猛について * * (1) TCB_enatex * mov.b @(#TCB_enatex,rx),r0炭吾の篓猛はゼロ橙磨されるので * TCB_enatexに簇してはチェックする涩妥がない * ∈アクセスできる认跋15バイトを亩えると、アセンブルエラ〖になる∷ * * (2) TCB_enatex_mask * and #TCB_enatex_mask,r0炭吾の篓猛はゼロ橙磨されるので * TCB_enatex_maskに簇してはチェックする涩妥がない *//* * タスクディスパッチャ * * dispatch は、充哈み】CPU毋嘲ネストカウンタ = 0,充哈み敦贿觉轮 * で钙び叫さなければならないˉexit_and_dispatch も·充哈みネスト * カウンタ = 0ˇ充哈み敦贿觉轮で钙び叫すのが付搂であるが·カ〖ネル * 弹瓢箕に滦炳するため·充哈みネストカウンタ = 1で钙び叫した眷圭に * も滦炳しているˉ */ .text .align 2 .global _dispatch_dispatch: /* pr,r8×r15 をスタックに瘦赂 */ mov.l r8, @-r15 /* r0×r7は钙び叫し傅で瘦赂しているため */ mov.l r9, @-r15 /* 瘦赂する涩妥が痰い */ mov.l r10,@-r15 mov.l r11,@-r15 mov.l r12,@-r15 mov.l r13,@-r15 mov.l r14,@-r15 sts.l pr,@-r15#ifdef SAVE_MACL_IN_DISPATCH sts.l mach,@-r15 sts.l macl,@-r15#endif /* SAVE_MACL_IN_DISPATCH */ mov.l _runtsk_dis,r2 /* r0 <- runtsk */ mov.l @r2,r0 /* * タスクコントロ〖ルブロックTCB面のsp,pcが黎片から60バイトの * 认跋柒にあり、アラインメントが4バイト董肠になっていれば、 * イミディエイト陵滦アドレッシングでアクセスできる */#ifdef TCB_SHORT /* タスクスタックポインタを瘦赂 */ mov.l r15,@(TCB_sp, r0) mov.l dispatch_r_k,r1 /* 悸乖浩倡戎孟 */ bra dispatcher mov.l r1,@(TCB_pc, r0) /* 觅变スロット */#else /* TCB_SHORT */ mov #TCB_sp,r9 mov.l r15,@(r0,r9) /* タスクスタックを瘦赂 */ mov #TCB_pc,r8 mov.l dispatch_r_k,r1 /* 悸乖浩倡戎孟を瘦赂 */ bra dispatcher mov.l r1,@(r0,r8) /* 觅变スロット */#endif /* TCB_SHORT */ /* * dispatch_r: * タスクコントコンテキストでディスパッチャ钙び叫しをした眷圭の * 悸乖浩倡戎孟 * dispatcherから钙ばれるので、r7にruntskが洛掐されている * * レジスタ充り碰て * r7 ¨runtsk * r0 ¨runtsk->enatex * mov.b @(imm, r),r0炭吾はオペランドがr0に * 盖年されている * r1 ¨runtsk->texptn * r2 ¨call_texrtn()の黎片アドレス * */dispatch_r: /* レジスタを牲耽 */#ifdef SAVE_MACL_IN_DISPATCH lds.l @r15+,macl lds.l @r15+,mach#endif /* SAVE_MACL_IN_DISPATCH */ lds.l @r15+,pr mov.l @r15+,r14 mov.l @r15+,r13 mov.l @r15+,r12 mov.l @r15+,r11 mov.l @r15+,r10 mov.l @r15+,r9 mov.l @r15+,r8 mov.b @(TCB_enatex,r7),r0 /* オペランドがr0に盖年 (c) */ mov.l @(TCB_texptn,r7),r1 and #TCB_enatex_mask,r0 tst r0,r0 /* runtsk->enatexのチェック */ bt _dispatch_r_1 /* 觅变スロットなし */ tst r1,r1 /* runtsk->texptnのチェック */ bt _dispatch_r_1 /* 觅变スロットなし */ mov.l _call_texrtn_dis,r2 /* タスク毋嘲借妄ル〖チン弹瓢 */ jmp @r2 /*∈dispatch()钙び叫し傅にリタ〖ンする∷*/ nop /* 觅变スロット */_dispatch_r_1: rts /* dispatch()钙び叫し傅へのリタ〖ン */ nop /* 觅变スロット */ .global _exit_and_dispatch_exit_and_dispatch: /* 充哈みネストカウンタをクリア */ mov.l _intnest_dis, r1 mov #0,r0 mov.l r0,@r1/* * ディスパッチャ塑挛 * */dispatcher: /* * ここには充り哈み敦贿で丸ること */ mov.l _schedtsk_dis,r1 mov.l _runtsk_dis,r2 mov.l @r1,r7 /* r7 <- schedtsk */ mov #0, r0 /* (b) */ /* * ここでruntskにschedtskを洛掐するのは2つの罢蹋がある。 * (1) schedtsk != NULLの眷圭 * 奶撅のタスク磊り仑えを乖う。 * (2) schedtsk == NULLの眷圭 * runtskにNULLを洛掐しておく。 * ∈dispatcher_1笆惯の充哈み略ちで充哈みが掐り、その面で * iget_tid()がコ〖ルされたときに赖しくTSK_NONEを手すため * には、悸乖觉轮のタスクがない箕に、runtskをNULLにして * おく涩妥がある。∷ */ mov.l r7,@r2 /* runtsk
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -