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