📄 cpu_support.s
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2001,2002 by Industrial Technology Institute, * Miyagi Prefectural Government, JAPAN * * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ * ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 * に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· * この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 * み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ * (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する * ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚を倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: cpu_support.S,v 1.5 2002/04/11 11:30:20 imai Exp $ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"#include "sys_config.h"#include "cpu_config.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) ここでアセンブルエラ〖#endif#if TCB_enatex > 15 ここでアセンブルエラ〖#endif#if TCB_enatex_mask > 0x80 ここでアセンブルエラ〖#endif#if !CHECK_IMMEDIATE_ADDRESSING(TCB_texptn) TCB_texptn ここでアセンブルエラ〖#endif/* * タスクディスパッチャ * * 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 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_1 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_1 mov.l r1,@(r0,r8) /* 觅变スロット */#endif /* TCB_SHORT */dispatch_r: /* レジスタを牲耽 */ 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.l _runtsk_dis,r0 /* runtsk->enatexのチェック */ mov.l @r0,r1 mov.b @(TCB_enatex,r1),r0 and #TCB_enatex_mask,r0 tst r0,r0 bt _dispatcher_r_1 mov.l @(TCB_texptn,r1),r2 /* runtsk->texptnのチェック */ tst r2,r2 bt _dispatcher_r_1 mov.l _call_texrtn_dis,r1 /* タスク毋嘲借妄ル〖チン弹瓢 */ jmp @r1 /*∈dispatch()钙び叫し傅にリタ〖ンする∷*/ nop /* 觅变スロット */_dispatcher_r_1: rts /* dispatch()钙び叫し傅へのリタ〖ン */ nop /* 觅变スロット */ .global _exit_and_dispatch_exit_and_dispatch: /* 充哈みネストカウンタをクリア */ mov.l _intnest_dis, r1 mov #0,r0 mov.l r0,@r1dispatcher_1: /* * ここには充り哈み敦贿で丸ること */ mov.l _schedtsk_dis,r12 /* r0 <- schedtsk */ mov.l @r12,r0 cmp/eq #0,r0 /* schedtsk があるか々 */ bt dispatcher_2 /* 痰ければジャンプ */ mov.l _runtsk_dis,r2 mov.l r0,@r2 /* schedtskをruntskに */ /* * タスクコントロ〖ルブロックTCB面のsp,pcが黎片から60バイトの * 认跋柒にあり、アラインメントが4バイト董肠になっていれば、 * イミディエイト陵滦アドレッシングでアクセスできる */#ifdef TCB_SHORT /* 悸乖浩倡戎孟を牲耽 */ mov.l @(TCB_pc, r0),r1 jmp @r1 mov.l @(TCB_sp, r0),r15 /* 觅变スロット */ /* タスクスタックポインタを牲傅 */#else /* TCB_SHORT */ mov #TCB_pc,r8 mov.l @(r0,r8),r1 /* 悸乖浩倡戎孟を牲耽 */ mov #TCB_sp,r9 jmp @r1 mov.l @(r0,r9),r15 /* 觅变スロット */ /* タスクスタックポインタを牲傅 */#endif /* TCB_SHORT */dispatcher_2: /* * ここで充哈みモ〖ドに磊り垂えるのは·ここで券栏する充哈み借妄 * にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で * のタスクディスパッチの松贿という企つの罢蹋があるˉ */ /* スタックを充り哈みスタックに磊仑え */ mov.l _stacktop_dis,r15 /* 充哈みネストカウンタを1にする */ mov.l _intnest_dis,r0 mov #1,r1 mov.l r1,@r0dispatcher_2_enable_interrupt: /* 充り哈み钓材 */#ifdef SUPPORT_CHG_IPM /* タスクコンテキストの充り哈み */ /* マスクを肋年 */ mov.l _task_intmask_dis,r2 mov.l @r2,r3 ldc r3,sr#else /* SUPPORT_CHG_IPM */ mov #0,r9 /* IPM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -