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

1.初期化部分

リセット~タスクが起動される直前までのソースです。

初期化部分

00001 ;---------------------------------------------------------------------
00002 ; H8/300H用マイクロRTOS Ver1.0.0
00003 ;
00004 ; 2007.03.08 新規作成
00005 ; 2007.04.05 ディスパッチ禁止の場合、wai_sem,slp_tskしないよう変更
00006 ;
00007 ;                                          Copyright(C) by MCM Co.,Ltd
00008 ;---------------------------------------------------------------------
00009         .h8300h
00010         .file    "kernel.s"
00011         .nolist
00012         .include "kernel.inc"           ;
00013         .include "h83052io.inc"         ; I/Oマップ
00014         .list

TCBなどの定義や、H8/3052のI/Oアドレス定義を読み込んでいます。
ソースは、後で出てきます、、、多分、、、

00015 ;
00016 ;---------------------------------------------------------------------
00017 ;
00018 ; システム使用領域
00019 ;
00020 ;---------------------------------------------------------------------
00021         .section .data
00022         .align 2
00023 os_status:      .word   NO_CUR_TASK     ; 実領域
00024 os_sys_sts      = os_status             ; システム状態
00025 os_cur_task     = os_sys_sts + 1        ; 実行中タスクID
00026 ;
00027 os_resouce:     .word   0               ; 実領域
00028 max_tsk_num     = os_resouce            ; タスク数
00029 max_sem_num     = os_resouce + 1        ; セマフォ数
00030 ;
00031 os_int_nest:    .word   0               ; 割り込みネストカウンタ
00032 os_sys_timer:   .long   0               ; システムタイマー
00033 ;

使用する、変数を定義しています。
メモリがもったいないので、基本的にByteで使っています。
内容はコメントの通りで、最初にWordで領域を取っていますが、あとの定義でByteに分けています。

00034         .section .text
00035         .align 2
00036 ;=====================================================================
00037 ;
00038 ; スタートアップ処理
00039 ;
00040 ;=====================================================================
00041         .global os_entry
00042 os_entry:                               ;
00043         orc     #0x80,ccr               ; 割り込み禁止
00044         bra     os_ent0                 ;
00045         ;-------------------------------------------------------------
00046         ; デバッグ用
00047         ;-------------------------------------------------------------
00048         .global _BP
00049 _BP:
00050         orc     #0x80,ccr               ; 割り込み禁止
00051         nop                             ;
00052         nop                             ;
00053         andc    #0x7F,ccr               ; 割り込み許可
00054         rts                             ;
00055         ;-------------------------------------------------------------
00056         ; 処理開始
00057         ;-------------------------------------------------------------
00058 os_ent0:
00059         mov.l   #os_ent2,er5            ; 戻り先を ER5へ
00060         jmp     _hard_init              ;
00061 os_ent2:
00062         mov.l   #os_stack,er7           ; スタックポインタの初期化
00063         ;-------------------------------------------------------------
00064         ; 初期値のある書き換えデータ領域のコピー(ROM->RAM)
00065         ;-------------------------------------------------------------
00066         mov.l   #_dataROM_begin,er0     ;
00067         mov.l   #_dataRAM_begin,er1     ;
00068         mov.l   #_dataRAM_end,er2       ;
00069         bra     mvdata1                 ;
00070 mvdata:
00071         mov.b   @er0,r3h                ;
00072         mov.b   r3h,@er1                ;
00073         adds    #1,er0                  ;
00074         adds    #1,er1                  ;
00075 mvdata1:
00076         cmp.l   er2,er1                 ;
00077         blo     mvdata                  ;
00078         ;-------------------------------------------------------------
00079         ; 初期値のない書き換えデータ領域のクリア
00080         ;-------------------------------------------------------------
00081         mov.b   #0,r0h                  ;
00082         mov.l   #_bss_begin,er1         ;
00083         mov.l   #_bss_end,er2           ;
00084         bra     cldata1                 ;
00085 cldata:
00086         mov.b   r0h,@er1                ;
00087         adds    #1,er1                  ;
00088 cldata1:
00089         cmp.l   er2,er1                 ;
00090         blo     cldata                  ;

リセットスタート時の処理です。
定数データをRAMにコピー、使用する変数の初期化を行っています。
00049 _BP:は、デバッグ時にブレークポイントを設定して処理を一時中断するための無駄な処理です*1

00091         ;-------------------------------------------------------------
00092         ; ユーザープログラムへ
00093         ; タスクの設定等を行ってもらう
00094         ;-------------------------------------------------------------
00095         mov.b   #OS_LOC_CPU,r0l         ; ディスパッチ禁止
00096         mov.b   r0l,@os_sys_sts         ;
00097         jsr     @_main                  ;
00098         sub.b   r0l,r0l                 ; ディスパッチ許可
00099         mov.b   r0l,@os_sys_sts         ;

ここで、main()を呼びだしています。
main()の中では、タスクやセマフォの登録を行ってもらい、一通り済んだら戻ってきてね♪です。

00100         ;-------------------------------------------------------------
00101         ; タイマーの設定(1mS周期@25MHzクロック)
00102         ; 25MHz÷8÷3125=1KHz
00103         ;-------------------------------------------------------------
00104         mov.b   #0b00100011,r0l         ; ITU0_TCR0初期化(GRAマッチ,φ÷8)
00105         mov.b   r0l,@ITU0_TCR0:8        ;
00106         mov.w   @_systmr_cnt,r0         ; ITU0_GRA0初期化(1mS)
00107         dec.w   #1,r0                   ;
00108         mov.w   r0,@ITU0_GRA0H          ;
00109         bclr    #0,@ITU0_TSR:8          ; IMFAクリア(ITU0のINTフラグクリア)
00110         mov.b   #0b11111001,r0l         ; ITU0_TIER(割込許可)初期化
00111         mov.b   r0l,@ITU0_TIER:8        ;
00112         bset    #0,@ITU_TSTR:8          ; ITU ch0動作開始
00113         ;
00114         andc    #0x7F,ccr               ; 割り込み許可


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

*1 えっと、ROMに焼いたら意味ないですから…
最終更新のRSS
Last-modified: 2010-03-26 (金) 17:55:47 3406日前
HTML convert time: 0.036 sec.