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 ;

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

*1 と言っても、カーネル内だけですが…
最終更新のRSS
Last-modified: 2010-03-26 (金) 17:55:48 3341日前
HTML convert time: 0.034 sec.