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