(toppers-users 1161) Re: hello world 的なもの

Honda Hiroki hhonda @ ipflex.com
2003年 9月 2日 (火) 20:29:16 JST


お世話になります。アイピーフレックス株式会社の本田です。

> >  例えば "hello world" を表示するプログラムを作る場合には、まず
> > ソースファイル名を決めてそれを何処に置いて、先頭の行に
> > #include <stdio.h> を書いて、コンパイラが動作するように path を
> > 正しく設定してコマンドラインから cc と入力して...
>
> なるほど。プログラムの作法以前に開発環境(プログラムを作るための)
> 作法に関わるところのように思います。確かに、どこにソースファイルを
> 置いて、どのようにプログラムを書いていけばよいかという点では、
> 弱いかもしれません。

私も TOPPERS に取り組み始めたときにそう感じました。μITRON4.0 を既に
熟知している人が取り組むのなら現状で十分だろうけど、μITRON4.0 の学習
題材として使うにはキビシイかな、と。

sample1 をはじめて見たとき「あぁ、これはけっこうリッチなサンプルだから
Makefile もこんなに複雑なんだな。hello world ならもっと簡単な Makefile 
でいいんだろうな」と思いましたが、学習を進めていくうちに、hello world 
でも sample1 と同じくらい複雑な Makefile が必要だとわかってびっくり。

# とくに、カーネルコンフィグレーションのハードルが高いです。
# 一度理解してしまえば、合理的な仕掛けだと賛同できるのですが。

組み込み向け RTOS である TOPPERS にとって、hello world プログラムは
「動作サンプル」としては無意味だと思いますが、特殊なビルド手順を必要と
する TOPPERS にとって、hello world プログラムは「ビルド手順サンプル」
として有効だと思います。

以下のように段階をふんでビルド手順をマスターできるようなチュートリアル
があればうれしいかも、と感じました。

  Step 1: 単発 hello world プログラムをビルドしよう。

    void main_task(VP_INT exinf) {
      syslog(LOG_NOTICE, "Hello, world");
      kernel_exit();
    }

    ポイント:
      ・main() じゃない。printf() じゃない。exit() じゃない。
      ・Makefile の CFLAGS に -I 指定がたくさん必要。
      ・Makefile の OBJS に hello.o 以外にたくさん必要。
      ・コンフィグレーション記述ファイルが必要。
      ・Makefile にコンフィグレーション手順の記述が必要。

  Step 2: 連発 hello world プログラムをビルドしよう。

    void main_task(VP_INT exinf) {
      UINT count = 0;
      while (1) {
        syslog(LOG_NOTICE, "Hello, world %u", count++);
        dly_tsk(1000);
      }
    }

    ポイント:
      ・コンフィグ記述ファイルで #include "timer.cfg" が必要。

  Step 3: マルチタスク hello world プログラムをビルドしよう。

    void main_task_A(VP_INT exinf) {
      UINT count = 0;
      while (1) {
        syslog(LOG_NOTICE, "Task A %u", count++);
        dly_tsk(1000);
      }
    }
    void main_task_B(VP_INT exinf) {
      UINT count = 0;
      while (1) {
        syslog(LOG_NOTICE, "Task B %u", count++);
        dly_tsk(800);
      }
    }

    ポイント:
      ・CRE_TSK() でマルチタスク、ということを理解する。

  Step 4: コード共有マルチタスクプログラムをビルドしよう。

    void main_task(VP_INT exinf) {
      UINT count = 0;
      ID tskid;
      get_tid(&tskid);
      while (1) {
        syslog(LOG_NOTICE, "Task %d: %u", tskid, count++);
        dly_tsk((INT)exinf);
      }
    }

    ポイント:
      ・CRE_TSK() の引数の意味を理解する。

  等々…。

  # こうやって並べてみても Step 1 が一番難しい、ってのが
  # 敷居が高いと言われる一因なんでしょうね。

あまり具体的に要望すると言い出しっぺの法則を適用されそうなので(^^)、
この辺で失礼いたします。

====
アイピーフレックス株式会社
R&D センター
本田広樹 (hhonda @ ipflex.com)