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

小さなRTOSみたいなものを動かす/7 システムコール(4)

00566         ;
00567         ;-------------------------------------------------------------
00568         ; セマフォ資源取得
00569         ; INP: er0=セマフォID
00570         ; OUT:
00571         ;-------------------------------------------------------------
00572         .global _wai_sem
00573 _wai_sem:
00574         push.l  er6                     ;
00575         push.l  er0                     ;
00576         mov.w   @os_int_nest,r6         ; 割り込み中か?
00577         bne     wai_se3                 ;
00578         mov.b   @os_sys_sts,r6l         ; ディスパッチ禁止か?
00579         and.b   #OS_LOC_CPU,r6l         ;
00580         bne     wai_se3                 ;
00581         sub.l   er6,er6                 ; セマフォIDのオフセット計算
00582         mov.b   #SEM_SIZ,r6l            ;
00583         mulxs   r0l,r6                  ;
00584         add.l   #_SEM_TOP,er6           ; セマフォ領域先頭+オフセット
00585         orc     #0x80,ccr               ; 割り込み禁止
00586         mov.b   @(SEM_CTR,er6),r0l      ; 資源取得
00587         bne     wai_se2                 ; 資源あり?
00588         mov.b   @os_cur_task,r0l        ; 自タスクID
00589         jsr     @os_gettcbadr           ; er6←TCB先頭アドレス
00590         mov.b   #COND_WSEM,r0l          ; 該当タスクを資源待ち状態にする
00591         mov.b   r0l,@(TCB_STATUS,er6)   ;
00592         pop.l   er0                     ; 待つセマフォIDを記憶
00593         mov.b   r0l,@(TCB_SEMPH,er6)    ;
00594         andc    #0x7F,ccr               ; 割り込み許可
00595         pop.l   er6                     ;
00596         jmp     os_dispatch             ; ディスパッチ
00597 wai_se2:
00598         dec.b   r0l                     ; 資源数を更新
00599         mov.b   r0l,@(SEM_CTR,er6)      ;
00600 wai_se3:
00601         andc    #0x7F,ccr               ; 割り込み許可
00602         pop.l   er0                     ;
00603         pop.l   er6                     ;
00604         rts                             ; ディスパッチしない
00605         ;
00606         ;-------------------------------------------------------------
00607         ; セマフォ資源返却
00608         ; INP: er0=セマフォID(r0l)
00609         ; OUT:
00610         ;-------------------------------------------------------------
00611         .global _sig_sem
00612 _sig_sem:
00613         push.l  er4                     ;
00614         push.l  er5                     ;
00615         push.l  er6                     ;
00616         push.l  er0                     ;
00617         push.l  er3                     ;
00618         sub.w   e4,e4                   ; ディスパッチが必要かのフラグ
00619         sub.l   er3,er3                 ; セマフォIDのオフセット計算
00620         mov.b   #SEM_SIZ,r3l            ;
00621         mulxs   r0l,r3                  ;
00622         add.l   #_SEM_TOP,er3           ; セマフォ領域先頭+オフセット
00623         orc     #0x80,ccr               ; 割り込み禁止
00624         mov.b   @(SEM_MAX,er3),r6h      ; 最大資源数
00625         mov.b   @(SEM_CTR,er3),r4h      ; 現在の資源数
00626         cmp.b   r6h,r4h                 ; 資源数の最大値を越えないか?
00627         beq     sig_sem9                ;
00628         mov.l   #_TCB_TOP,er6           ; TCBの先頭アドレス
00629         mov.b   @max_tsk_num,r4l        ; タスク数
00630         mov.l   #TCB_SIZE,er5           ; TCBサイズ
00631 sig_sem0:
00632         mov.b   @(TCB_STATUS,er6),r0h   ; セマフォ資源待ち?
00633         cmp.b   #COND_WSEM,r0h          ;
00634         bne     sig_sem5                ;
00635         mov.b   @(TCB_SEMPH,er6),r0h    ; 同じセマフォを待っているか?
00636         cmp.b   r0h,r0l                 ;
00637         bne     sig_sem5                ;
00638         mov.b   #0xff,r0h               ; セマフォ待ち解除
00639         mov.b   r0h,@(TCB_SEMPH,er6)    ;
00640         mov.b   #COND_READY,r0h         ; 該当のタスクをREADYにする
00641         mov.b   r0h,@(TCB_STATUS,er6)   ;
00642         dec.w   #1,e4                   ; ディスパッチが必要
00643         bra     sig_sem9                ; 資源数は更新しない(READYになったTASKへ移譲)
00644 sig_sem5:
00645         dec.b   r4l                     ;
00646         beq     sig_sem7                ; 該当タスクなし
00647         add.l   er5,er6                 ; 次のTCB
00648         bra     sig_sem0                ;
00649 sig_sem7:
00650         inc.b   r4h                     ; 資源数を更新
00651         mov.b   r4h,@(SEM_CTR,er3)      ;
00652 sig_sem9:
00653         andc    #0x7F,ccr               ; 割り込み許可
00654         pop.l   er3                     ;
00655         pop.l   er0                     ;
00656         pop.l   er6                     ;
00657         pop.l   er5                     ;
00658         mov.w   e4,r4                   ; ディスパッチが必要か?
00659         beq     sig_sem_                ;
00660         pop.l   er4                     ;
00661         jmp     os_dispatch             ; ディスパッチ
00662 sig_sem_:
00663         pop.l   er4                     ;
00664         rts                             ;
00665         ;
00666         ;-------------------------------------------------------------
00667         .end

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

最終更新のRSS
Last-modified: 2010-03-26 (金) 17:55:49 3012日前
HTML convert time: 0.012 sec.