ToppersDevel

TOPPERSの環境構築
 
&counter([total|today|yesterday]); - 0 - 0 - 17
 



お知らせ

皆様

TOPPERS/JSPカーネル Release 1.4.1 の配布を開始しました.TOPPERSのWEBサ
イトから入手可能です.

http://www.toppers.jp/jsp-download.html

1.4からの変更点は

・細かいバグ修正(主にターゲット依存部) 
・ターゲットサポートの追加(SH2,M16C,SC33,PowerPC32,Nios2)

です.

本田 晋也
豊橋技術科学大学/名古屋大学

TOPPERS概論

コンパイルの流れ

  1. コンフィギュレーションファイル(.cfg)に生成したいタスクの情報を書く
  2. 定義したタスクの処理本体である関数を(.c)に記述する。 プロトタイプは(.h)に記述する。
  3. コンフィギュレータがkernel_cfg.c, kernel_chk.c, kernel_id.hを生成する。
  4. make

システム構築の考え方

タスク管理機能

生成したタスクの状態は以下のように変化する

  1. 生成したタスクを、まずDORMANT状態にする
  2. act_tskサービスコールの発行で、指定したタスクがREADY状態になる
    起動時にREADY状態にするには、タスク生成オプション(CRE_TSK静的API内)でTA_ACTを指定する。
    一般的には唯一のタスクを自動起動にして、そのタスクからサブシステムのタスクを起動すると良い。
  3. 設定された優先順位に従って、タスクがRUINNING状態になる
  4. タスクへ制御を移す。タスクの処理をした後、以下の選択肢がある
    1. DORMANT状態に移行する->ext_tsk
    2. WAITING状態(起床待ち)->slp_tsk
    3. WAITING状態(資源待ち)->wai_sem
    4. WAITING状態(イベント待ち)->wai_flg
    5. WAITING状態(メッセージ待ち)->rcv_dtq
タスク管理機能
CRE_TSK(ID tskid, {ATR tskatr, VP_INT exinf, FP task, PRI itskpri, SIZE stksz, VP stk});静的API
ER act_tsk(ID tskid);タスク起動
ER iact_tsk(ID tskid);タスク起動(タスク外で使用)
ER_UINT can_act(ID tskid);処理要求キューの中にある、タスク起動要求のキャンセル
void ext_tsk(void);タスクの終了
ER ter_tsk(ID tskid);タスクの強制終了(DORMANT状態になる)
ER chg_pri(ID tskid, PRI tskpri);タスク優先度の変更
ER get_pri(ID tskid, PRI *p_tskpri);タスク優先度の参照
タスク付属同期機能
ER slp_tsk(void);起床待ち
ER tslp_tsk(TMO tmout);起床待ち(タイムアウトあり)
ER wup_tsk(ID tskid);タスクの起床
ER iwup_tsk(ID tskid);タスクの起床(タスク外で使用)
ER_UINT can_wup(ID tskid);タスクの起床要求を無効化
ER rel_wai(ID tskid);待ち状態の強制解除(READY状態になる)
ER irel_wai(ID tskid);待ち状態の強制解除(READY状態になる)(タスク外で使用)
ER sus_tsk(ID tskid);強制待ち状態への以降(WAITING状態になる)
ER rsm_tsk(ID tskid);強制待ち状態からの強制再開(READY状態になる)、frsm_tskと同じ
ER frsm_tsk(ID tskid);強制待ち状態からの再開(REDY状態になる)、rsm_tskと同じ
ER dly_tsk(RELTIM dlytim);自タスクの遅延
タスク例外処理機能
DEF_TEX(ID tskid, {ATR texatr, FP texrtn});静的API
ER ras_tex(ID tskid, TEXPTN rasptn);タスク例外処理の要求
ER iras_tex(ID tskid, TEXPTN rasptn);タスク例外処理の要求(タスク外で使用)
ER dis_tex(void);タスク例外処理の禁止
ER ena_tex(void);タスク例外処理の許可
BOOL sns_tex(void);タスク例外処理の禁止状態の参照

同期・通信機能

セマフォ
CRE_SEM(ID semid, {ATR sematr, UINT isemcnt, UNIT maxsem});セマフォ生成の静的API
ER sig_sem(ID semid);セマフォの返却
ER isig_sem(ID semid);セマフォの返却(タスク外)
ER wai_sem(ID semid);セマフォ獲得待ち
ER pol_sem(ID semid);セマフォのポーリング(WAITING状態にならない)
ER twai_sem(ID semid, TMO tmout);タイムアウト付きセマフォ獲得待ち
イベント・フラグ
CRE_FLG(ID flgid, {ATR flgatr, FLGPTN iflgptn;});イベント・フラグ生成の静的API
ER set_flg(ID flgid, FLGPTN setptn);イベント・フラグのセット
ER iset_flg(ID flgid, FLGPTN setptn);イベント・フラグのセット(タスク外)
ER clr_flg(ID flgid, FLGPTN clrptn);イベント・フラグのクリア
ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn);イベント・フラグ待ち
ER pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn);ポーリング(WAITING状態にならない)
ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout);タイムアウト付き待ち
データ・キュー
CRE_DTQ(ID dtqid, {ATR dtqatr, UINT dtqcnt, VP dtq});データ・キュー生成の静的API
ER snd_dtq(ID dtqid, VP_INT data);データキューへの送信
ER psnd_dtq(ID dtqid, VP_INT data);ポーリング送信(WAITING状態にならない)
ER ipsnd_dtq(ID dtqid, VP_INT data);ポーリング送信(タスク外)
ER tsnd_dtq(ID dtqid, VP_INT data, TMO tmout);タイムアウト送信
ER fsnd_dtq(ID dtqid, VP_INT data);強制送信
ER ifsnd_dtq(ID dtqid, VP_INT data);強制送信(タスク外)
ER rcv_dtq(ID dtqid, VP_INT *p_data);データ・キューの受信
ER prcv_dtq(ID dtqid, VP_INT *p_data);ポーリング受信
ER trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout);タイムアウト受信
メール・ボックス
CRE_MBX(ID mbxid, {ATR mbxatr, PRI maxmpri, VP mprihd});メール・ボックス生成の静的API
ER snd_mbx(ID mbxid, T_MSG *pk_msg);メール・ボックスへの送信
ER rcv_mbx(ID mbxid, T_MSG **ppk_msg);メール・ボックスからの受信
ER prcv_mbx(ID mbxid, T_MSG **ppk_msg);ポーリング受信
ER trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout);タイムアウト受信

メモリプール管理機能

固定長メモリプール管理機能
CRE_MPF(ID mpfid, {ATR mpfatr, UINT blkcnt, UINT blksz, VP mpf});メモリプールの生成(静的API)
ER get_mpf(ID mpfid, VP *p_blk);獲得
ER pget_mpf(ID mpfid, VP *p_blk);ポーリング獲得
ER tget_mpf(ID mpfid, VP *p_blk, TMO tmout);タイムアウト獲得
ER rel_mpf(ID mpfid, VP blk);返却

システム状態管理機能

μITRON4.0仕様
ER rot_rdq(PRI tskpri);タスクの優先順位の回転
ER irot_rdq(PRI tskpri);タスクの優先順位の回転(タスク外)
ER get_tid(ID *p_tskid);実行状態のタスクIDの参照
ER iget_tid(ID *p_tskid);実行状態のタスクIDの参照(タスク外)
ER loc_cpu(void);CPUロック状態への移行
ER iloc_cpu(void);CPUロック状態への移行(タスク外)
ER unl_cpu(void);CPUロック状態の解除
ER iunl_cpu(void);CPUロック状態の解除
ER dis_dsp(void);ディスパッチ(READYをRUNNINGにする)の禁止
ER ena_dsp(void);ディパッチの許可
BOOL sns_ctx(void);コンテキストの参照
BOOL sns_loc(void);CPUロック状態の参照
BOOL sns_dsp(void);ディスパッチ禁止状態の参照
BOOL sns_dpn(void);ディスパッチ保留状態の参照
TOPPERS/JSP
BOOL vsns_ini(void);カーネル動作状態の参照

割込み管理機能

割込み管理機能
DEF_INH(INHNO inhno, {ATR inhatr, FP inthdr});割込みハンドラの定義(静的API)
DEF_EXC(EXCNO excno, {ATR excatr, FP exchdr});CPU例外ハンドラの定義(静的API)

そのほかの処理

その他の処理
ATT_INI({ATR iniatr, VP_INT exinf, FP inirtn});初期化ルーチンの追加(静的API)
VATT_TER({ATR teratr, VP_INT exinf, FP terrtn});終了処理ルーチンの追加(静的API)

main()とコンフィギュレータ

そもそも組込みソフトでmain()は意味が無い。
最初のタスクの起動は、静的に(コンパイル時に)行う。
静的に行うのは面倒なので、コンフィギュレータが導入された。 コンフィギュレーションファイル(.cfg)の記述は静的APIを使う。
sample1.cfgを参照すると良い。

/*
 *  @(#) $Id: sample1.cfg,v 1.7 2003/01/06 08:08:26 hiro Exp $
 */

/*
 *  サンプルプログラム(1)のシステムコンフィギュレーションファイル
 */

#define _MACRO_ONLY
#include "sample1.h"

INCLUDE("\"sample1.h\"");
CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY,
			STACK_SIZE, NULL });
DEF_TEX(TASK1, { TA_HLNG, tex_routine });
DEF_TEX(TASK2, { TA_HLNG, tex_routine });
DEF_TEX(TASK3, { TA_HLNG, tex_routine });
CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 });
#ifdef CPUEXC1
DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} );
#endif /* CPUEXC1 */

#include "../systask/timer.cfg"
#include "../systask/serial.cfg"
#include "../systask/logtask.cfg"

周期起動タスク

メールボックスの使い方

割込みハンドラからタスクへの情報通知

シリアルインターフェースドライバ


コンパイル方法

ファイルのダウンロード

カーネルcfgソフトウエア作成

cd jsp/cfg
make depend
make

サンプルプログラムの構築

あまり用はない気がするコンパイルの確認やプログラム作成方法の習得に重要
jsp直下で下記を実行

mkdir akih8     //適当なディレクトリ
cd akih8
../configure -C h8 -S akih8_3069f

sample1.hとsample1.cが生成される。sample1.cは下記の機能を持つ

/* 
*  サンプルプログラム(1)の本体
*
*  JSPカーネルの基本的な動作を確認するためのサンプルプログラム.
*
*  プログラムの概要:
*
*  ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,
*  優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID:
*  TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周
*  期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
*
*  並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク
*  が実行中であることをあらわすメッセージを表示する.
*
*  周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY,
*  LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
*  周期ハンドラは停止状態になっている.
*
*  メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を
*  待っている間は,並列実行されるタスクが実行されている),入力された
*  文字に対応した処理を実行する.入力された文字と処理の関係は次の通り.
*  Control-C または 'Q' が入力されると,プログラムを終了する.
*
*  '1' : 以降のコマンドは TASK1 に対して行う.
*  '2' : 以降のコマンドは TASK2 に対して行う.
*  '3' : 以降のコマンドは TASK3 に対して行う.
*  'a' : タスクを act_tsk により起動する.
*  'A' : タスクに対する起動要求を can_act によりキャンセルする.
*  'e' : タスクに ext_tsk を呼び出させ,終了させる.
*  't' : タスクを ter_tsk により強制終了する.
*  '>' : タスクの優先度を HIGH_PRIORITY にする.
*  '=' : タスクの優先度を MID_PRIORITY にする.
*  '<' : タスクの優先度を LOW_PRIORITY にする.
*  'G' : タスクの優先度を get_pri で読み出す.
*  's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる.
*  'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる.
*  'w' : タスクを wup_tsk により起床する.
*  'W' : タスクに対する起床要求を can_wup によりキャンセルする.
*  'l' : タスクを rel_wai により強制的に待ち解除にする.
*  'u' : タスクを sus_tsk により強制待ち状態にする.
*  'm' : タスクの強制待ち状態を rsm_tsk により解除する.
*  'M' : タスクの強制待ち状態を frsm_tsk により強制解除する.
*  'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる.
*  'x' : タスクにパターン 0x0001 の例外処理を要求する.
*  'X' : タスクにパターン 0x0002 の例外処理を要求する.
*  'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する.
*  'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する.
*  'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の
*        レディキューを回転させる.
*  'c' : 周期ハンドラを動作させる.
*  'C' : 周期ハンドラを停止させる.
*  'z' : CPU例外を発生させる.
*  'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する).
*  'V' : vxget_tim で性能評価用システム時刻を2回読む.
*  'v' : 発行したシステムコールを表示する(デフォルト).
*  'q' : 発行したシステムコールを表示しない.
*/

TINETコンフィギュレータを生成する

cd jsp/tinet/cfg
make

nservのコンパイル

cd jsp/nserv
make tinet
make depend
make

高橋メモ

FDAU TOPPERS memo 2004/9/29 takahashi

  1. target
    AKI-H8/3069F-LAN
    CPU: H8-3069F CLK20MHz MODE5
    ROM: 内蔵512KB 000000h-007FFFh
    RAM: 内蔵 16KB FFBF20h-FFFF1Fh
    RAM: 外部DRAM 8bit幅 CS2 2MB 400000h-5FFFFFh
    RS232C: SCI0(JP1、線を引き出しDsub9を半田付け), SCI1(Dsub9)
    LAN: RTL8019AS 8bit幅 CS1 32B 200000h-20001Fh
  2. tool-chains
    elf形式の、CとC++のコンパイラをつくろうとしたが、 コンパイルできなかったので、あきらめる。 coff形式のCコンパイラを作成する。 TOPPERS/JSP kernel をコンパイルするには、これがあればいいらしい。 Cygwin環境にて構築
     binutils-2.13.2.tar.bz2
     gcc-3.2.1-core.tar.bz2
     h8300-hms-gcc-3.1-1.patch	http://h8300-hms.sourceforge.net/
     newlib-1.11.0.tar.gz
     gdb-5.2.1.tar.bz2
    1. binutils
      オプション --disable-nls (国際化メッセージ無効)はTOPPERS/JSPのカーネルの コンパイルに必要。
      tar xfj binutils-2.13.2.tar.bz2
      cd binutils-2.13.2
      mkdir objdir
      cd objdir
      ../configure --prefix=/usr/local --target=h8300-hms --disable-nls
      make CFLAGS="-O2 -fomit-frame-pointer" all
      make install
    2. gcc and newlib
      Cコンパイラ以外は必要ないのでgcc-coreを使う。 newlibは組み込み用ライブラリ コンパイルには、かなり時間がかかる。
      export PATH=$PATH:/usr/local/bin
      tar xfj gcc-3.2.1-core.tar.bz2
      tar xfz newlib-1.11.0.tar.gz
      cd gcc-3.2.1
      ln -s ../newlib-1.11.0/newlib .
      patch -p1 < ../h8300-hms-gcc-3.1-1.patch
      mkdir objdir
      cd objdir
      ../configure \
              --prefix=/usr/local --target=h8300-hms \
              --enable-languages=c --with-newlib
      make CFLAGS="-O2 -fomit-frame-pointer" all
      make install
    3. gdb
      TOPPERS/JSPカーネル構築に必要ないので後回しにしてよい。
       
      GDBのソースコードを展開したディレクトリ以下の ./gdb/config/h8300/tm-h8300.h を以下のように修正
      L62	#define TARGET_INT_BIT  32
      L155	#define ARGLAST_REGNUM	1
       
      tar xfj gdb-5.2.1.tar.bz2
      cd gdb-5.2.1
      mkdir objdir
      cd objdir
      ../configure --prefix=/usr/local --target=h8300-hms
      make CFLAGS="-O2 -fomit-frame-pointer" all
      make install
  3. TOPPERS/JSP kernel
    jsp-1.4.tar.gzを入手する。 http://www.toppers.jp/jsp-download.html documentはjsp/docにある。
    とりあえずコンパイルしてみる。
    最初にjsp/cfgに移動し、make cfg(.exe) と chk(.exe) を生成する。
    cd ../
    mkdir akih83hms
    cd akih83hms
    ../configure -C h8 -S akih8_3069f
    でコンフィグレーションされる。 configureはperlスクリプトなのでperlつかえないとダメ。
    make depend
    make
    で、カーネル(jsp.exeとjsp.srec)がmakeされる。
  4. TOPPERS/JSP-tinet
    tinet-1.2.tar.gzを入手する。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS