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

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

00477         ;
00478         ;-------------------------------------------------------------
00479         ; タスク起床
00480         ; INP: r0=起床するタスクID
00481         ; OUT:
00482         ;-------------------------------------------------------------
00483         .global _wup_tsk
00484 _wup_tsk:
00485         push.l  er6                     ;
00486         push.l  er0                     ;
00487         jsr     @os_gettcbadr           ; ER6←TCB先頭アドレス
00488         orc     #0x80,ccr               ; 割り込み禁止
00489         mov.b   @(TCB_STATUS,er6),r0l   ; タスクはSLEEPか?
00490         cmp.b   #COND_SLEEP,r0l         ;
00491         bne     wup_ts7                 ; SLEEPでないならWakeUp要求数を加算してディスパッチ
00492         mov.b   #COND_READY,r0l         ; 該当タスクをREADY状態にする
00493         mov.b   r0l,@(TCB_STATUS,er6)   ;
00494         bra     wup_ts9                 ;
00495 wup_ts7:
00496         mov.w   @(TCB_WUPCTR,er6),r0    ; WakeUp要求数を加算
00497         cmp.w   #0xffff,r0              ; カウンタオーバーフロー?
00498         beq     wup_ts9                 ;
00499         inc.w   #1,r0                   ; WakeUp数の更新
00500         mov.w   r0,@(TCB_WUPCTR,er6)    ;
00501 wup_ts9:
00502         andc    #0x7F,ccr               ; 割り込み許可
00503         pop.l   er0                     ;
00504         pop.l   er6                     ;
00505         jmp     os_dispatch             ; ディスパッチ
00506         ;
00507         ;-------------------------------------------------------------
00508         ; 自タスクを起床待ちにする
00509         ; INP:
00510         ; OUT:
00511         ;-------------------------------------------------------------
00512         .global _slp_tsk
00513 _slp_tsk:
00514         push.l  er6                     ;
00515         mov.w   @os_int_nest,r6         ; 割り込み中か?
00516         bne     slp_tsk5                ;
00517         mov.b   @os_sys_sts,r6l         ; ディスパッチ禁止か?
00518         and.b   #OS_LOC_CPU,r6l         ;
00519         bne     slp_tsk5                ;
00520         push.l  er0                     ;
00521         orc     #0x80,ccr               ; 割り込み禁止
00522         mov.b   @os_cur_task,r0l        ; 自タスクID
00523         jsr     @os_gettcbadr           ; er6←TCB先頭アドレス
00524         mov.w   @(TCB_WUPCTR,er6),r0    ; これまでのWakeUp数を取得
00525         beq     slp_tsk2                ;
00526         dec.w   #1,r0                   ;
00527         mov.w   r0,@(TCB_WUPCTR,er6)    ;
00528         pop.l   er0                     ;
00529         bra     slp_tsk5                ;
00530 slp_tsk2:
00531         mov.b   #COND_SLEEP,r0l         ; 該当タスクをSLEEP状態にする
00532         mov.b   r0l,@(TCB_STATUS,er6)   ;
00533         andc    #0x7F,ccr               ; 割り込み許可
00534         pop.l   er0                     ;
00535         pop.l   er6                     ;
00536         jmp     os_dispatch             ; ディスパッチ
00537 slp_tsk5:
00538         andc    #0x7F,ccr               ; 割り込み許可
00539         pop.l   er6                     ; ディスパッチしない
00540         rts                             ;
00541         ;
00542         ;-------------------------------------------------------------
00543         ; 自タスクを時間待ちにする
00544         ; INP: er0=待ち時間
00545         ; OUT:
00546         ;-------------------------------------------------------------
00547         .global _dly_tsk
00548 _dly_tsk:
00549         push.l  er6                     ;
00550         mov.w   @os_int_nest,r6         ; 割り込み中か?
00551         bne     dly_ts9                 ;
00552         push.l  er0                     ;
00553         mov.b   @os_cur_task,r0l        ; 自タスクID
00554         jsr     @os_gettcbadr           ; er6←TCB先頭アドレス
00555         orc     #0x80,ccr               ; 割り込み禁止
00556         mov.b   #COND_WTIME,r0l         ; 該当タスクを時間待ち状態にする
00557         mov.b   r0l,@(TCB_STATUS,er6)   ;
00558         pop.l   er0                     ;
00559         mov.l   er0,@(TCB_TIMER,er6)    ; 待ち時間をセット
00560         andc    #0x7F,ccr               ; 割り込み許可
00561         pop.l   er6                     ;
00562         jmp     os_dispatch             ; ディスパッチ
00563 dly_ts9:
00564         pop.l   er6                     ; ディスパッチしない
00565         rts                             ;


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

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