ITRON入門 HOSポーティング手順【HEWの環境準備と構築】

ITRON入門カリキュラム
この記事は約16分で読めます。

こんにちは、ナナです。

では、ITRON入門編で使用する具体的な開発環境の準備に取り掛かりましょう。

HOS(Hyper Operating System)とはITRON仕様に準拠したフリーのITRONカーネルソフトウェアです。本カリキュラムはこのHOSを利用して学習を行います。

本記事では次の疑問点を解消する内容となっています。

本記事で学習できること
  • ITRONの開発をするためには何を準備すればよいの?
  • ITRONを開発機器に搭載するためにはどうすればよいの?

それではHOSをビュートローバーへ搭載する手順を順に示していきます。

ビュートローバーと開発環境HEWに関する情報は、マイコン入門編の『マイコン入門 組み込み開発に必要な環境構築とドキュメント準備』を参照ください。

それではITRONを開発する準備を整えましょう。

開発前のITRON仕様書とHOSの前準備

まずは、ITRONの開発を行うための前準備を行いましょう。必要なデータを収集します。

ITRON仕様書のダウンロード

ITRONの仕様書は公開されており、トロンフォーラムというサイトからダウンロードができます。

ITRONは4.0というバージョンが最新です。仕様書はPDFになっていますのでこちらからダウンロードしておくとよいでしょう。ちなみに、ITRONはμITRON(マイクロ アイトロン)が正式名称です。

HOSのソースコードのダウンロード

HOSはこちらのサイトにて管理されています。誰でも自由にHOSのソースコードをダウンロードすることができます。

サイトトップの[ダウンロード]-[リリース一覧]を選択しスクロールすると次のダウンロードファイルがあります。似たファイルが他にもたくさんあるため気を付けましょう。

HOSダウンロード

ファイルは「h4_102.lzh」の圧縮ファイルとなっています。一応、直リンクを貼っておきます。

開発は長らく停止しているようなのでリンクが更新されることはないと思いますが、リンクが切れていた場合は直接HOSのサイトからダウンロードするとよいでしょう。

ITRON環境のポーティング

ポーティングとはソフトウェアをとある環境へ移植することを言います。それではHOSというITRONカーネルをビュートローバーで動かすためのポーティング手順を示します。

結構大変なので根気よく実施してください。ポーティング作業って大変なんです・・・。

HEW環境でのプロジェクト構成について

今回のシステムはマイコン入門編と同じビュートローバーを使って開発を行います。

マイコン入門編で使用した統合開発環境HEWを利用します。マイコン入門編とはプロジェクト構成が異なるので改めてITRON入門編に向けて再構築を行います。

全体のワークスペースの構成は次のようにしていきます。

ワークスペース構成

RTOS版のビュートローバーのワークスペースを作り、HOSとビュートローバーシステムを管理するプロジェクトを2つ管理する構成で作成します。

統合開発環境HEWにHOSプロジェクトを登録

では、まずはHOSをHEW環境に取り込みましょう。HOSはシステムにおいてライブラリという形で作り出します。

ビュートローバーワークスペースとHOSプロジェクトの作成

HOSプロジェクトを作成します。手順に従い実施してください。

HEWを起動しワークスペースとプロジェクトを作ります。

HOSはライブラリとして生成するためプロジェクトタイプとして「Library」を選択することに注意してください。その他は目標のワークスペース構成のため次の内容で作成しましょう。

  • ワークスペース名:BeautoRoverRTOS
  • プロジェクト名:hos
  • ディレクトリ:C:\WorkSpace\BeautoRoverRTOS

ビュートローバーはH8/36064のため300Hシリーズを選択します。

H8/36064の動作モードはNormalモードとなります。 設定を変えずに完了を押します。

Readme.txtは不要のためチェックを外し、プロジェクトの生成を行います。

HOSプロジェクトへのファイル登録

HOSの圧縮ファイルを解凍しておきます。作成したHOSプロジェクトのフォルダにHOSのフォルダを全てコピーします。

HOSプロジェクトにコピーしたフォルダの中からカーネルソースに関わるファイルをHEWプロジェクトに登録します。フォルダを1つずつhosプロジェクトにドラッグしましょう。

チェックボックスを全て選択し[OK]を押してHOSプロジェクトに取り込みます。kernelフォルダとmknlフォルダを両方登録してください。

さらに追加でh83フォルダを追加します。h83フォルダはH8/300Hシリーズマイコン特有のプログラムが入ったフォルダです。

2つ不要なファイルがあるためチェックを外します。pacctx.srcとpacint.srcの2つはアドバンスモードというCPU向けのため使用しません。

今取り込んだh83/htc/pacintn.srcは、H8マイコン用ですが36064向けのプログラムになっていないので修正を行います。

pacintn.srcは割り込み関連の処理が記述されていますが、H8/36064マイコンの仕様に合わせて変更を行います。色付きの部分が変更箇所ですが、下記内容を丸ごと上書きしてよいです 。

; --------------------------------------------------------------------------- 
;  Hyper Operating System V4  μITRON4.0仕様 Real-Time OS                     
;    プロセッサ抽象化コンポーネント (日立 H8/300HN 用)                         
;    割り込みハンドラ                                                         
;                                                                             
;                                   Copyright (C) 1998-2003 by Project HOS    
;                                   http://sourceforge.jp/projects/hos/       
; --------------------------------------------------------------------------- 


        .CPU     300HN


        .SECTION D, DATA, ALIGN=2
        .SECTION X, DATA, ALIGN=2
        .SECTION P, CODE, ALIGN=2

        .EXPORT _hos_vector007
        .EXPORT _hos_vector008
        .EXPORT _hos_vector009
        .EXPORT _hos_vector010
        .EXPORT _hos_vector011
        .EXPORT _hos_vector012
        .EXPORT _hos_vector013
        .EXPORT _hos_vector014
        .EXPORT _hos_vector015
        .EXPORT _hos_vector016
        .EXPORT _hos_vector017
        .EXPORT _hos_vector018
        .EXPORT _hos_vector021
        .EXPORT _hos_vector022
        .EXPORT _hos_vector023
        .EXPORT _hos_vector024
        .EXPORT _hos_vector025
        .EXPORT _hos_vector026
        .EXPORT _hos_vector027
        .EXPORT _hos_vector028
        .EXPORT _hos_vector029
        .EXPORT _hos_vector032


;------------------------------------------------
; 割り込みハンドラ
;------------------------------------------------
_hos_vector007: push.w  r0
        mov.b   #7, r0l
        bra int_handler
          
_hos_vector008: push.w  r0
        mov.b   #8, r0l
        bra int_handler

_hos_vector009: push.w  r0
        mov.b   #9, r0l
        bra int_handler

_hos_vector010: push.w  r0
        mov.b   #10, r0l
        bra int_handler

_hos_vector011: push.w  r0
        mov.b   #11, r0l
        bra int_handler

_hos_vector012: push.w  r0
        mov.b   #12, r0l
        bra int_handler

_hos_vector013: push.w  r0
        mov.b   #13, r0l
        bra int_handler

_hos_vector014: push.w  r0
        mov.b   #14, r0l
        bra int_handler

_hos_vector015: push.w  r0
        mov.b   #15, r0l
        bra int_handler

_hos_vector016: push.w  r0
        mov.b   #16, r0l
        bra int_handler

_hos_vector017: push.w  r0
        mov.b   #17, r0l
        bra int_handler

_hos_vector018: push.w  r0
        mov.b   #18, r0l
        bra int_handler

_hos_vector021: push.w  r0
        mov.b   #21, r0l
        bra int_handler

_hos_vector022: push.w  r0
        mov.b   #22, r0l
        bra int_handler

_hos_vector023: push.w  r0
        mov.b   #23, r0l
        bra int_handler

_hos_vector024: push.w  r0
        mov.b   #24, r0l
        bra int_handler

_hos_vector025: push.w  r0
        mov.b   #25, r0l
        bra int_handler

_hos_vector026: push.w  r0
        mov.b   #26, r0l
        bra int_handler

_hos_vector027: push.w  r0
        mov.b   #27, r0l
        bra int_handler

_hos_vector028: push.w  r0
        mov.b   #28, r0l
        bra int_handler

_hos_vector029: push.w  r0
        mov.b   #29, r0l
        bra int_handler

_hos_vector032: push.w  r0
        mov.b   #32, r0l
        bra int_handler

; -----------------------------------------------
;          割り込み処理
;
;  割り込み発生時は er0 を push した後、r0l に
;  割り込み番号をセットして、ここにジャンプする
; -----------------------------------------------
        .IMPORT _kernel_sta_int     ; 割り込み処理開始
        .IMPORT _kernel_end_int     ; 割り込み処理終了
        .IMPORT _kernel_exe_int     ; 割り込み処理実行
        .IMPORT _kernel_int_sp      ; 割り込み用スタックアドレス
        .IMPORT _kernel_int_ssp     ; 割り込み用スタックアドレス
        .IMPORT _kernel_int_cnt     ; 割り込みネストカウンタ
        .IMPORT _kernel_h83_imsk    ; 現在の割り込みマスク値
        .IMPORT _kernel_h83_ibmsk   ; ベース割り込みマスク値

int_handler:
        push.w  e0
        ; ---- 割り込み番号の符合拡張
        extu.w  r0

        ; ---- レジスタ保存
        push.l  er1

        ; ----割り込みマスク設定
        stc.b   ccr, r1l
                and.b   #h'c0, r1l
        mov.b   r1l, @_kernel_h83_imsk

        ; -------- 多重割り込みの判別
        mov.w   @_kernel_int_cnt, r1
        bne mul_int

        ; ======== 最初の割り込み ========
        ; ---- 割り込みネストカウンタ設定
        mov.w   #1, r1
        mov.w   r1, @_kernel_int_cnt

        ; ---- スタックポインタの入れ替え
        mov.w   r7, @_kernel_int_ssp
        mov.w   @_kernel_int_sp, r7

        ; ---- 割り込み処理の開始
        push.w  r0
        jsr @_kernel_sta_int
        pop.w   r0

        ; -------- 割り込みハンドラの処理
        jsr @_kernel_exe_int

        ; -------- スタックポインタ復帰
        mov.w   @_kernel_int_ssp, r7

        ; -------- 割り込みネストカウンタクリア
        xor.w   r1, r1
        mov.w   r1, @_kernel_int_cnt

        ; -------- 割り込みマスク値の復帰
        mov.b   @_kernel_h83_ibmsk, r0l
        mov.b   r0l, @_kernel_h83_imsk  ; 割り込みマスク値をベース値に戻す

        ; -------- タスクコンテキストに移行
        jsr @_kernel_end_int

        ; -------- 復帰後のマスク値を設定
        mov.b   @_kernel_h83_ibmsk, r0l ; ベースマスク値取り出し
        mov.b   @(8, er7), r1l
                and.b   #h'3f, r1l      ; スタック上のCCRからIとUI以外を取り出し
        or.b    r0l, r1l    ; ベースマスク値を設定
        mov.b   r1l, @(8, er7)  ; スタック上のCCRを更新

        ; -------- 復帰
        pop.l   er1
        pop.w   e0
        pop.w   r0

        rte

        ; ======== 多重割り込み ========
mul_int:
        ; -------- 割り込みネストカウンタ加算
        inc.w   #1, r1
        mov.w   r1, @_kernel_int_cnt

        ; -------- 割り込みハンドラ呼び出し
        jsr @_kernel_exe_int

        ; -------- 割り込みネストカウンタ減算
        mov.w   @_kernel_int_cnt, r0
        dec.w   #1, r0
        mov.w   r0, @_kernel_int_cnt

        ; -------- 復帰
        pop.l   er1
        pop.w   e0
        pop.w   r0

        rte

        .END


; --------------------------------------------------------------------------- 
;  Copyright (C) 1998-2003 by Project HOS                                     
; ---------------------------------------------------------------------------

変更内容説明

  • 30行目:.EXPORT _hos_vector019 はh8/36064では予約領域のため削除
  • 35~39行目:.EXPORT _hos_vector026 ~ 032 の割り込みハンドラの外部参照を追加
  • 93行目:_hos_vector019: push.w r0 の割り込みハンドラ呼び出し処理を削除
  • 111~131行目:_hos_vector026: push.w r0 の割り込みハンドラ呼び出し処理を追加

この変更内容は現段階で理解できる必要はありません。かなり高度な知識が必要となる内容です。

HOSプロジェクトへのビルド設定

HOSをビルドできるように設定を行います。

HEWのメニューから[ビルド]-[H8S,H8/300 Standard Toolchain…]を選択しHOSのソースファイルから参照しているヘッダファイルに対してインクルードパスを設定します。

インクルードパスが何なのか忘れてしまった人はC言語入門編の『C言語 include【インクルードで起こる変化の正体を解説】』を参照してください。

インクルードパスの中に”$(WORKSPDIR)”という文字が登場しますが、これは環境変数と呼ばれるものです。WORKSPDIR はワークスペースディレクトリという意味であり、本環境ではワークスペースのフォルダ場所である”C:\WorkSpace\BeautoRoverRTOS”と等しくなります。

環境変数はこの後にもいくつか登場しますが、名前から想像できる内容になっていますので適宜解釈してください。

[全般]タブを選択し依存関係検索エラーメッセージ抑止を選択し、ビルド時に出力されるメッセージを軽減しておきます。

ここまで出来たらメニューから[ビルド]-[ビルド]を実行しましょう。

無事に設定ができていればエラー0となり、下記hos.libが出来ていればOKです。

C:\WorkSpace\BeautoRoverRTOS\hos\Debug\hos.lib

これでHOSのライブラリがまずは完成です。