📄 cpu_support.a30
字号:
;*;* 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-2005 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_support.a30,v 1.4 2005/11/24 12:41:23 honda Exp $;; プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈M32C脱∷;;; offset.inc はTCBの黎片からメンバまでのオフセット年盗ファイル; .include offset.inc .glb __kernel_runtsk .glb __kernel_schedtsk .glb __kernel_reqflg .glb __kernel_enadsp .glb __kernel_dispatch .glb __kernel_exit_and_dispatch .glb __kernel_activate_r .glb __kernel_call_texrtn .glb __kernel_interrupt .glb __kernel_intnest .glb _iana_tsk .glb __kernel_break_wait .section program, code, align;; タスクディスパッチャ;; dispatch は·タスクコンテキスト觉轮ˇ充哈み敦贿觉轮で钙び叫さなけ; ればならないˉexit_and_dispatch も·タスクコンテキスト觉轮ˇ充哈; み敦贿觉轮で钙び叫すのが付搂であるが·カ〖ネル弹瓢箕に滦炳するため·; 充哈みモ〖ドで钙び叫した眷圭にも滦炳しているˉ; 钙び叫し掘凤: IPL=0, FLGレジスタIビット=0 (CPUロック觉轮),; intnest = 0(タスクコンテキスト), タスクスタック;__kernel_dispatch: pushm r0,r1,r2,r3,a0,a1,sb,fb ; スタックへレジスタ瘦赂 mov.l __kernel_runtsk, a0 stc isp, TCB_sp[a0] ; スタックポインタをTCBに瘦赂 mov.l #dispatch_r, TCB_pc[a0] ; 悸乖浩倡戎孟をTCBに瘦赂 jmp.b dispatcher;; 钙び叫し掘凤: IPL=0, FLGレジスタIビット=0 (CPUロック觉轮),; intnest = 0(タスクコンテキスト), タスクスタック;; a0 にはruntsk のアドレスが呈羌されている;dispatch_r: mov.b TCB_enatex[a0], r0l btst TCB_enatex_bit, r0l ; タスク毋嘲借妄钓材? jz dispatch_r_1 ; 钓材でなければ dispatch_r_1 へ mov.w TCB_texptn[a0], r0 ; 瘦伪毋嘲妥傍があるか々 jz dispatch_r_1 ; なければ dispatch_r_1 へ jsr.a __kernel_call_texrtn ; タスク毋嘲ハンドラへdispatch_r_1: ; タスク毋嘲を悸乖しない眷圭 popm r0,r1,r2,r3,a0,a1,sb,fb ; タスクスタックからレジスタ牲耽 rts ; dispatch 钙び叫し傅へ提る.;; タスク弹瓢箕借妄;; ここでは, CPUロック豺近觉轮にし, タスクを弹瓢する.;; 钙叫掘凤: FLGレジスタIビット=0 (CPUロック觉轮), タスクスタック; IPL=0, タスクコンテキスト(intnest=0);__kernel_activate_r: pop.w r0 pop.w r2 mov.l r2r0, a0 ; タスクの弹瓢戎孟をA0に肋年 ldc #0040h, flg ; 充哈み钓材, ISP, IPL=0 jmpi.a a0;; dispatch钙び叫し掘凤:; ˇすべてのタスクのコンテキストは瘦赂されている.; ˇFLGレジスタIビット=0 (CPUロック觉轮); ˇコンテキストはカ〖ネル弹瓢箕を近きタスクコンテキスト(intnest=0); 弹瓢箕は润タスクコンテキスト(intnest=1)で, その眷圭にも滦炳.; dispatcher 钙叫箕のスタック:; __kernel_dispatch からきた眷圭: タスクスタック; exit_and_dispatch からきた眷圭: ; exit_task からきた眷圭はタスクスタック; カ〖ネル弹瓢箕は充哈みスタック; ret_int からきた眷圭: 充哈みスタック; dispatcher_2 での充哈み略ちからきた眷圭: 充哈みスタック;__kernel_exit_and_dispatch: fclr i ; 充哈み敦贿 mov.b #0, __kernel_intnest ; ネストカウンタクリアdispatcher: mov.l __kernel_schedtsk, a0 ; mov.l a0, __kernel_runtsk ; schedtsk を runtsk に .IF MON == 1; タスクモニタ〖怠墙脱尸呆; 稍妥の眷圭は (MON = 0) jsr.a _iana_tsk ; タスク悸乖攫鼠の肋年 mov.l __kernel_runtsk,a0 ; a0を牲耽 .ENDIF jz dispatcher_1 ; schedtsk がなければ充哈み略ち ldc TCB_sp[a0], isp ; タスクスタックポインタを牲耽 jmpi.a TCB_pc[a0] ; 悸乖浩倡戎孟へジャンプ;; schdedtskが NULL の眷圭は、これより布には乖かない;dispatcher_1: ldc #RAMEND, isp ; 充哈み脱のスタックへ磊仑え inc.b __kernel_intnest ; 润タスクコンテキストdispatcher_2: fset i ; 充哈み略ち .IF USE_KD3083 != 1 ; KD3083を蝗脱するときはwait炭吾を蝗わない wait .ENDIF nop nop nop nop;; ここで润タスクコンテキスト,充哈みスタックに磊り垂えたのは,; ここで券栏する充哈み借妄にどのスタックを蝗うかという啼玛の豺疯と,; 充哈みハンドラ柒でのディスパッチ松贿という2つの罢蹋があるˉ; fclr i ; 充哈み敦贿 mov.w __kernel_reqflg, r0 ; reqflg が FALSE なら jz dispatcher_2 ; dispatcher_2 へ mov.w #0, __kernel_reqflg ; reqflgがTRUEならFALSEにする dec.b __kernel_intnest ; タスクコンテキストに提す jmp.b dispatcher ; dispatcher へ提る;; 充哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄;; 钙叫し掘凤:; ˇFLGレジスタのIビット=0, IPL=0, タスクコンテキスト(intnest=0); ˇ蝗脱スタックはタスクスタック, reqflg = TRUE;ret_int: mov.w #0, __kernel_reqflg ; reqflg <--- FALSE mov.l __kernel_runtsk, a0 ; すぐ ret_int_r にジャンプする眷圭があるのでここでセット mov.w __kernel_enadsp, r0 ; enadsp が FALSE なら jz ret_int_r ; ret_int_r へ mov.l __kernel_schedtsk, a1 ; schedtskと cmp.l a0, a1 ; runtsk が票じなら jeq ret_int_r ; ret_int_r へ mov.l a0, r2r0 ; runtsk = NULL なら jz dispatcher ; 瘦赂せずdispatherへ stc isp, TCB_sp[a0] ; タスクスタックを瘦赂 mov.l #ret_int_r, TCB_pc[a0] ; 悸乖浩倡戎孟を瘦赂 jmp.b dispatcher__kernel_break_wait:ret_int_r: mov.b TCB_enatex[a0],r0l ; enatex が FALSE ならリタ〖ン btst TCB_enatex_bit,r0l jz ret_int_r_1 mov.w TCB_texptn[a0],r0 ; texptn が 0 ならばリタ〖ン jz ret_int_r_1 jsr.a __kernel_call_texrtn ; タスク毋嘲借妄ル〖チンの钙叫しret_int_r_1: popm r0,r1,r2,r3,a0,a1,sb,fb ; スタックからレジスタを牲耽 reit ; タスクへ提る;; 充哈み/CPU毋嘲の叫掐庚借妄(アセンブリ咐胳淡揭婶尸);; 钙叫し掘凤:; ˇFLGレジスタのIビット=0, IPLは减烧けた充哈みのIPL.; ˇスタックは驴脚充り哈みなら充哈みスタック, そうでなければ; タスクスタック; ˇa0 には充哈み/CPU毋嘲ハンドラのアドレスが呈羌されている.; ˇr3r1 には(タスクor充哈み)スタックポインタの猛が呈羌されている.; これはそのままCPU毋嘲ハンドラに畔すVP房の恃眶 p_excinf となる.; ポインタ恃眶はデフォルトでfarポインタなのでVP房は4バイトサイズの; ポインタとなり, 苞眶をスタックで畔すことになる.;; レジスタがスタック惧にどのように瘦赂されているかを笆布に绩す.; この哭では惧が你疤, 布が光疤のアドレスで, スタックは布から; 惧数羹に羹かって姥み惧げられるものとする.;; --------------------------; | R0(2byte) | <----- p_excinf; -------------------------; | R1(2byte) |; -------------------------; | R2(2byte) |; -------------------------; | R3(2byte) |; -------------------------; | A0(4byte) |; | |; -------------------------; | A1(4byte) |; | |; -------------------------; | SB(4byte) |; | |; -------------------------; | FB(4byte) |; | |; -------------------------; | PC(4byte) |; | |; -------------------------; | FLG(2byte) |; -------------------------;; ハンドラからリタ〖ンした稿は, 驴脚充哈みでなく, かつ reqflg が; TRUE になった箕に·ret_int へ尸呆するˉ;; 驴脚充哈みかどうかは充哈みネストカウンタの猛で冉年する.; intnest != 0 ならば驴脚充哈みであると冉年する.;; reqflg はCPUロック觉轮でチェックする. そうでないと·; reqflg チェック稿に弹瓢された充哈みハンドラ柒で; ディスパッチが妥滇された眷圭に·ディスパッチされない.;__kernel_interrupt: cmp.b #0, __kernel_intnest ; 驴脚充り哈みかどうか jnz int_from_int ; 0でなければ驴脚充哈みint_from_task: ; 介檬の充哈み ldc #RAMEND, isp ; 充哈み脱のスタックへ磊仑えるint_from_int: ; 驴脚充哈み inc.b __kernel_intnest ; ネスト搀眶をインクリメント push.w r3 ; スタックポインタを充哈みスタックへ瘦赂 push.w r1 ; (充哈み箕は瘦赂の涩妥ないが, 毋嘲箕とル〖チン鼎铜のため) fset i ; 充哈み敦贿豺近 jsri.a a0 ; Cル〖チン钙び叫し fclr i ; 充哈み敦贿 pop.w r1 ; スタックポインタを牲耽 pop.w r3 ; (充哈み箕は牲耽の涩妥ないが, 毋嘲箕とル〖チン鼎铜のため) dec.b __kernel_intnest ; ネスト搀眶をデクリメント jnz int_return ; 驴脚充り哈みならリタ〖ンint_from_task2: ; 介檬の充哈み ldc r3r1, isp ; タスクのスタックに提す ldipl #0 ; タスクのIPL猛をセット(IPL=0) mov.w __kernel_reqflg, r1 ; ディスパッチ妥滇がないか? jz int_return ; なければ充哈み券栏傅のタスクに提る jmp.b ret_int ; あれば ret_int へジャンプint_return: popm r0,r1,r2,r3,a0,a1,sb,fb ; レジスタ牲耽 reit ; 充哈み涟の借妄に提る;; 腮警箕粗略ち;SIL_DLY_TIM1 .equ 264 ; 呵井箕粗(ル〖プ0搀)[ns]SIL_DLY_TIM2 .equ 66 ; ル〖プ1搀あたりの箕粗[ns] .glb $sil_dly_nse$sil_dly_nse: sub.w #SIL_DLY_TIM1, r0 jgtu L0 rtsL0: sub.w #SIL_DLY_TIM2, r0 jgtu L0 rts ; 踏蝗脱充哈みの借妄 .glb _unused_interrupt_unused_interrupt: reit .end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -