MCU
小さなRTOSみたいなものを動かす/1 システム初期化
小さなRTOSみたいなものを動かす/2 ディスパッチ処理
小さなRTOSみたいなものを動かす/3 タイマー割り込み
小さなRTOSみたいなものを動かす/4 システムコール(1)
小さなRTOSみたいなものを動かす/5 システムコール(2)
小さなRTOSみたいなものを動かす/6 システムコール(3)
小さなRTOSみたいなものを動かす/7 システムコール(4)
小さなRTOSみたいなものを動かす/8 インクルード・ファイル
カウント領域を更新して、時間待ちのタスクがあれば READY状態にします。
最後に、ディスパッチへ飛んでいきます。
ディスパッチへ行くという事は、 READY状態のタスクがあれば、起動されるという事なので、タイマーさえ動いていれば、 sta_tsk()で起動しなくても、タスクが勝手に動き出す…という事になります。
00215 ; 00216 ; 00217 ;------------------------------------------------------------- 00218 ; システムタイマー割り込み処理 00219 ;------------------------------------------------------------- 00220 .global _int_imia0 00221 _int_imia0: 00222 jsr @_INT_ENT ; 割り込み処理開始 00223 push.l er0 ; 00224 push.l er6 ; 00225 push.l er5 ; 00226 push.l er4 ; 00227 ; 00228 bclr #0,@ITU0_TSR:8 ; ITU0のINTフラグクリア 00229 ; 00230 mov.l @os_sys_timer,er0 ; システムタイマーの更新 00231 inc.l #1,er0 ; 00232 mov.l er0,@os_sys_timer ; 00233 ; 00234 ; タイマー待ちのタスクの処理 00235 ; 00236 mov.b @os_sys_sts,r5l ; システム状態(遅延ディスパッチ) 00237 mov.b @max_tsk_num,r5h ; タスク数 00238 beq os_time9 ; タスクなしの場合 00239 mov.l #_TCB_TOP,er6 ; TCB先頭 00240 mov.l #TCB_SIZE,er4 ; TCBサイズ 00241 os_time1: 00242 mov.b @(TCB_STATUS,er6),r0l ; タスク状態は時間待ちか? 00243 cmp.b #COND_WTIME,r0l ; 00244 bne os_time5 ; 00245 mov.l @(TCB_TIMER,er6),er0 ; タイマーカウンタを減らす 00246 dec.l #1,er0 ; 00247 mov.l er0,@(TCB_TIMER,er6) ; 00248 bne os_time5 ; 00249 mov.b #COND_READY,r0l ; タスク状態をREADYにする 00250 mov.b r0l,@(TCB_STATUS,er6) ; 00251 or.b #OS_DLY_DSP,r5l ; ディスパッチが必要 00252 os_time5: 00253 dec.b r5h ; 調べるタスク数-1 00254 beq os_time9 ; 終わり? 00255 add.l er4,er6 ; 次のTCB 00256 bra os_time1 ; 00257 os_time9: 00258 mov.b r5l,@os_sys_sts ; システム状態(遅延ディスパッチ) 00259 pop.l er4 ; 00260 pop.l er5 ; 00261 pop.l er6 ; 00262 pop.l er0 ; 00263 jsr @_RET_INT ; 割り込み処理終了ディスパッチ 00264 rte ;
以下は、良く使う*1処理なので、サブルーチンとして作っておきました。
00265 ; 00266 ;------------------------------------------------------------- 00267 ; 指定したタスクIDのTCB先頭アドレスを求める 00268 ; 00269 ; INP: r0l=タスクID 00270 ; OUT: er6=TCB先頭アドレス 00271 ; INF: er0破壊 00272 ;------------------------------------------------------------- 00273 os_gettcbadr: 00274 sub.l er6,er6 ; 02 er6クリア 00275 mov.b #TCB_SIZE,r6l ; 02 TCBサイズ 00276 mulxu r0l,r6 ; 16 タスクID×TCBサイズ→r6 00277 mov.l #_TCB_TOP,er0 ; 06 TCBの先頭+オフセット 00278 add.l er0,er6 ; 02 er6に該当TCBの先頭アドレス 00279 rts ; 10 00280 ; 38ST=3.04uS@25MHz 00281 ;