MCU
小さなRTOSみたいなものを動かす/1 システム初期化
小さなRTOSみたいなものを動かす/2 ディスパッチ処理
小さなRTOSみたいなものを動かす/3 タイマー割り込み
小さなRTOSみたいなものを動かす/4 システムコール(1)
小さなRTOSみたいなものを動かす/5 システムコール(2)
小さなRTOSみたいなものを動かす/6 システムコール(3)
小さなRTOSみたいなものを動かす/7 システムコール(4)
小さなRTOSみたいなものを動かす/8 インクルード・ファイル

OSの中心部分、ディスパッチ処理


ここが動けば、他の部分は造作ない?のではないでしょうか?*1

00115 ;
00116 ;=====================================================================
00117 ;
00118 ; OSカーネル
00119 ;
00120 ;=====================================================================
00121         ;
00122         ;-------------------------------------------------------------
00123         ; ディスパッチ処理
00124         ; ジャンプで飛んでくること
00125         ;-------------------------------------------------------------
00126 os_dispatch:
00127         push.l  er0                     ; 10 コンテキスト保存1
00128         orc     #0x80,ccr               ; 02 割り込み禁止 Ugh! 位置はここでよい?
00129         ;
00130         mov.b   @os_sys_sts,r0l         ; 08 遅延ディスパッチにしておく
00131         or.b    #OS_DLY_DSP,r0l         ; 02
00132         mov.b   r0l,@os_sys_sts         ; 08
00133         ;
00134         and.b   #OS_LOC_CPU,r0l         ; 02 ディスパッチ禁止か?
00135         bne     os_dispat99:16          ; 06
00136         ;
00137         mov.w   @os_int_nest,r0         ; 08 割り込み中か?
00138         bne     os_dispat99:16          ; 06
00139         ;
00140         mov.b   @os_sys_sts,r0l         ; 08 遅延ディスパッチのクリア
00141         and.b   #~OS_DLY_DSP,r0l        ; 02
00142         mov.b   r0l,@os_sys_sts         ; 08
00143         ;
00144         push.l  er1                     ; 10 コンテキスト保存2
00145         push.l  er2                     ; 10
00146         push.l  er3                     ; 10
00147         push.l  er4                     ; 10
00148         push.l  er5                     ; 10
00149         push.l  er6                     ; 10
00150         ;
00151         ; 現在実行中のタスクがあるか?
00152         ;
00153         mov.b   @os_cur_task,r0l        ; 08 カレントタスクID
00154         cmp.b   #NO_CUR_TASK,r0l        ; 02
00155         beq     os_dispat05             ; 04
00156         ;
00157         ; 実行していたタスクの状態保存
00158         ;
00159         jsr     @os_gettcbadr           ; 10 er6←TCB先頭アドレス
00160         mov.l   er7,@(TCB_STACK,er6)    ; 10 SP保存
00161         ;
00162         ; dly_tsk,wai_sem等はWAIT状態で来るので現在のタスク状態を調べる
00163         ;
00164         mov.b   @(TCB_STATUS,er6),r0l   ; 10 タスク状態がRUNか?
00165         cmp.b   #COND_RUN,r0l           ; 02
00166         bne     os_dispat03             ; 04
00167         mov.b   #COND_READY,r0l         ; 02 タスク状態をREADYとする
00168         mov.b   r0l,@(TCB_STATUS,er6)   ; 10
00169 os_dispat03:
00170         mov.b   #NO_CUR_TASK,r0l        ; 02 実行中タスクID=なし
00171         mov.b   r0l,@os_cur_task        ; 08
00172 os_dispat05:
00173         mov.l   #os_stack,er7           ; 02 システムのスタック
00174         ;
00175         ; 次に実行するタスクを探す
00176         ;
00177         mov.l   #_TCB_TOP,er6           ; 02 TCBの先頭アドレス
00178         sub.b   r4l,r4l                 ; 02 タスクID
00179         mov.b   @max_tsk_num,r5l        ; 02 タスク数
00180         mov.l   #TCB_SIZE,er3           ; 06 TCBサイズ
00181 os_dispat10:
00182         mov.b   @(TCB_STATUS,er6),r0l   ; 10 タスク状態
00183         cmp.b   #COND_READY,r0l         ; 02
00184         beq     os_dispat50             ; 04 READY状態のタスクあり
00185         dec.b   r5l                     ; 02 全て見たか?
00186         beq     os_idle                 ; 04 実行するタスクなし
00187         add.l   er3,er6                 ; 02 次のTCBへ
00188         inc.b   r4l                     ; 02 次のタスクID
00189         bra     os_dispat10             ; 04
00190 os_dispat50:
00191         mov.b   r4l,@os_cur_task        ; 08 実行中タスクIDをセット
00192         mov.b   #COND_RUN,r0l           ; 02 タスク状態をRUNに
00193         mov.b   r0l,@(TCB_STATUS,er6)   ; 10
00194         mov.l   @(TCB_STACK,er6),er7    ; 10 SPロード
00195 os_dispat98:
00196         pop.l   er6                     ; 10 コンテキストのロード
00197         pop.l   er5                     ; 10
00198         pop.l   er4                     ; 10
00199         pop.l   er3                     ; 10
00200         pop.l   er2                     ; 10
00201         pop.l   er1                     ; 10
00202 os_dispat99:
00203         pop.l   er0                     ; 10
00204         andc    #0x7F,ccr               ; 02 割り込み許可
00205         rts                             ; 10 タスクへ
00206                                         ; 366ST=29.28uS@25MHz+3.04uS
00207         ;
00208         ;-------------------------------------------------------------
00209         ; アイドルタスク
00210         ;-------------------------------------------------------------
00211 os_idle:                                ;
00212         andc    #0x7F,ccr               ; 割り込み許可
00213 os_idl9:                                ;
00214         bra     os_idl9                 ; ループ
~

小さなRTOSみたいなものを動かす/3

*1 本格的にやろうと考えれば別ですが…
最終更新のRSS
Last-modified: 2010-03-26 (金) 17:55:47 3341日前
HTML convert time: 0.021 sec.