カテゴリー「HOS」の13件の記事

2011年12月19日 (月)

本物のシリコンOS

HOSの続編として本物のシリコンOSを考え中である。
大雑把にコンセプトだけ書いておく。

  あくまでイメージのデフォルメだが、ITRON-APIのようなものを
用いてモジュール間同期する、ハードウェア記述言語を考えている。
ブログにあまり壮大な例を載せてもアレなので超デフォルメした言語を書く。

下記のようなものを、次のようにVerilog変換するようなイメージだ。

=====元ソース======

CRE_FLG(FLG_ID, {TA_WSGL, 0, 1});    // 初期値0, BIT幅1

module hoge
{
  input  unsigned int [1:0] port_in;
  output unsigned int       port_out;

  task {
    while (1) {
      while ( port_in[0] ) {
        dly_tsk(1);
      }

      while ( port_in[1] ) {
        dly_tsk(1);
      }
      set_flg(FLG_ID, 1);
    }
  }

  task {
    port_out = 0;
    while (1) {
      wai_flg(FLG_ID, 1, TWF_ANDW);
      clr_flg(FLG_ID, 0);
      port_out = 1;
      dly_tsk(1);
      port_out = 0;
    }
  }
}

=====変換後Verilog======

module hoge
  (
     input  wire        clk,
     input  wire        reset,
     input  wire [1:0]  port_in,
     output reg         port_out
  );

  // CRE_FLG
  wire FLG_ID_set;
  wire FLG_ID_clr;
  wire FLG_ID_flg;
  flg
      #(
        .WIDTH(1)
      )
    i_FLG_ID
      (
        .set  (FLG_ID_set),
        .clr  (FLG_ID_clr),
        .flg  (FLG_ID_flg)
      );

  // task1
  reg  [0:0]  task1_state;
  always @(posedge clk) begin
    if ( reset ) begin
      task1_state <= 0;
    end
    else begin
      case (task1_state) begin
      0: begin
           if ( port[0] ) begin
             task1_state <= 1;
           end
         end

      1: begin
           if ( port[1] ) begin
             task1_state <= 0;
         end
      endcase
    end
  end
  assign FLG_ID_set = ((task1_state == 1) && port[1]);

  // task2
  reg  [0:0]  task2_state;
  always @(posedge clk) begin
    if ( reset ) begin
      task2_state <= 0;
    end
    else begin
      case (task2_state) begin
      0: begin
           if ( (FLG_ID_flg & 1) == 1 ) begin
             task2_state <= 1;
           end
         end

      1: begin
         task1_state <= 0;
      endcase
    end
  end
  assign FLG_ID_clr = ((task2_state == 0) && ((FLG_ID_flg & 1) == 1 ));

endmodule

=====ここまで======

  たとえば Verilog の always文は、計算機科学的にはタスク(スレッド)に他ならない。
  スレッドには待ちという状態が発生するが、ステートマシンの状態数に他ならない。
  ここまでの変形は、普通の高位合成ツールがやってのける。

  が、スレッド間同期に、ITRON的APIを使うなんて試みは多分あまりないと思う。

  静的APIで同期オブジェクトを生成して、タスク間を連携させていくなどRTL化しやすい。
  もちろんH/Wモジュール同士でなく、S/WのAPIとも直結可能なはずだ。

  他にもセマフォ、データキューなど非常に相性がよさそうだ。

  H/Wでは、演算器などリソースを排他制御で使いまわすことも多い。
  タスクに優先度を与えて、スケジューリング理論に則ったアサインが簡単自在に書ければ非常に面白そうだ。

  一般の RTL 言語はモジュール階層を木構造でしか許していないが、IDなどでフラットな結線を許す言語を作ることは難しいことではないはずだ。

  夢が膨らむ。もっとも現在FlexとBISONお勉強中だがいつになることやら。

2011年7月28日 (木)

HOS APLFW

HOS-V4A のリポジトリの中で APLFW というものを作成中だが、現在大改造をもくろんでいる。

ITRONというのはいわゆるスケジューラであって、OSと呼ぶにはいろいろと機能が不足している。もちろんスケジューリング問題自体、組み込みに置いて非常に重要な問題であって、それに特化したOSであるといえる。
一方で、近代的なOSと比べるといろいろと物足りないケースが出てくることもしばしばである。

今更、車輪の再発明をするつもりはあまり無いのだが、主に2つの機能を目的にITRONに皮をかぶせようとしている。

  1) 大雑把なコマンドラインベースのデバッグ環境
  2) 安全なタスク停止

  1)については今さら言うまでもない。組み込みに置いてはPCのようにデバッガでステップ実行できないケースが非常に多い。割り込みを受けて、制御タスクがぶん回っている状態でないと中身を覗く意味がないケースが多いからだ。
  UARTなどからやり取りをして、デバッグを進めている組み込み屋は実に多いはずだ。特にメモリだけはふんだんにあるケースも増えてきたので、 簡易シェルのような環境は便利だ。

問題は2)である。ITRONでは tar_tsk というAPIがあるが、安全に使うのは非常に難しい。というか緊急停止以外で使い込んでいる人は少数ではないかと思う。

なぜなら、停止させられるタスクからすれば突然止められてしまうわけで、その時に持っていたリソースを正確に返却するのは非常に難しいからである。

で、今回その辺に切り込んでみようと考えている。

要は、各オブジェクトをいきなり使うのではなく、まずオープンさせてからハンドル経由で使うようにする。ハンドルにはリスト構造を持たせてタスクにリンクさせていき、オープン中のオブジェクトがわかるようにする。

同一オブジェクトを複数のタスクから扱う場合ももちろんあるので、オブジェクト側にも参照カウンタを設けて、0になるまでは開放しないなどの仕組みが必要だ。

いろいろとメモリを食う機構になりそうだが、まあ近年メモリに余裕のあるシステムも増えてきたし(もっとも筆者が画像処理関係が多いので、画像用にでっかいメモリがついてることが多いだけなのですが)。

なかなかしっくりくる機構にならないので試行錯誤中ですが、組み込み特化で、少し遊べるものができればよいなと思っております。

2011年7月 5日 (火)

MicroBlaze移植

HOS-V4AのMicroBlaze対応が大体目処が立っしました。
こちらのページのおかげで SMM(Simple MicroBlaze Microcontroller)がSpartan-3E Starter Kit で動いてくれました。WebPackのみで遊べます。
http://www.aquaxis.com/microblaze_impliment.html

netgen っていろいろ使えますね。VHDLを一度合成してからVerilogに戻して Veritak に入れるとかしてもなかなか高速快適に動いてくれます。
こんな技があるとは

ただし上のページの移植は、Writeのバイトレーンがケアされていないのでちょっとだけ書替えが必要です(簡単ですが)。

とりあえず、哲学者が元気に動いているので今日はここまで。

2011年6月22日 (水)

MicroBlazeで遊び中

WebPackで遊べるSMM(SimpleMicroBlaze Microcontroler)ですが、メモリ拡張含めたなかなか素敵なネタを見つけてしまいました。

http://www.aquaxis.com/microblaze_impliment.html

JellyみたいなMIPS互換だと、イマイチFPGAにフィットしない部分もあって、他にgccが存在するMicroBlazeクローンの自作も考えましたが、こういうハッキングも楽しそうだなぁ。

2011年4月 5日 (火)

Cortex-M0(トラ技増刊号)でHOS

相変わらずチュートリアル系の弱いHOS(ITRON互換OS)なので、動かし方をさらっと書いてみる。

最近トランジスタ技術増刊号 の付録基板(MARY)のLPC1114(ARM Cortex-M0)に対応した。

まず、http://sourceforge.jp/projects/hos/ から hos-v4a-20110405.zip を落としてくる。

筆者の環境は Windows XP + Cygwin である。
ネイティブのgccが必要なのでCygwin のインストールの際はDevelop系のインストールを忘れないように。試してはいないが、Cygwin でなくとも、MinGW などでも大丈夫と思う。

まず、ARMのコンパイラが必要なので、自分でビルドするか、http://www.codesourcery.com/sgpp/lite/arm/download.html などのパッケージを利用させてもらう。

hos-v4a-20110405.zip を解凍後、bashシェルから、/sample/arm/lpc1114/gcc に移動しておもむろに

make

これで、 sample.hex が出来上がる

これを FlashMagic で焼きこみ。
Flashmagic

その後、TeraTerm などで接続(115200bps)

このとき、MARYの場合ポートを開くと制御線でプログラムモードに入ってしまうので、制御が必要。

TeraTermの場合

setdtr 0
setrts 0

というマクロファイルを作っておいて読ませればOK。
コマンドライン引数で起動時に読むようにしておけば楽。

その後ボードのリセットボタンを押せば、動作開始。
ターミナルに以下のように表示されれば成功。
Sample

サンプルはいわゆる「食事する哲学者の問題

哲学者に見立てた5本のタスクと、フォークに見立てた5個のセマフォがあり、各タスクはランダムな時間「考えてみたり」、「食事したり」するが、食事をしようとしてフォークが取れないとお腹をすかせてしまう。

上記は状態をprintしているだけだが、MARYらしく表示させてみるのも楽しそうだ。

ひとまずITRONは動き出したということで、今日はこれまで。

2011年3月28日 (月)

Cortex-M3対応状況

トランジスタ技術の増刊号は発売日に手元に来たものの、未だDesignWaveおまけのCortex-M3対応が終わらず開封できない状況。
まあ、Cortex-M0 はほとんど同じなんで、動き出せば早いはず(多分)。

今回は、DEF_INH のみに限定して、ベクタ割り込みをそのままマッピングの予定。
PendSV の実装で悩んでいたりする。というかマニュアルわかりにくい(汗)。

ハンドラモードとスレッドモードの切り替えって意外と面倒ぽいですね。特権モードでどっかのbit立てれば遷移できるのかと思ってましたがどうもそうではなさそう。
まあ、少々ややこしい手順踏むにしても後はここだけであらかた片付きそうですね。

ARMの GNU AS で .syntax unified してやらないと、いろいろThumb2命令嵌るのにやっと気がついた今日この頃...

2011年3月20日 (日)

STM32F103 + HJ-LINK/USB

いろいろ嵌りつつも OpenOCD と繋がったは良いのだが

Warn : Invalid ACK 0x7 in JTAG-DP transaction

のようなエラーが頻発する。JTAGクロックを落とすとやや落ち着くようだが、Flash焼きがVerifyを通らない。

で、半田付けを疑っていろいろいじっていたら TDO を指で触るとエラーが出る。
オシロ当てると、通信中以外で浮いてるような感じ...

半田不良なのかどうかわからないが、1kΩのプルアップを入れたら落ち着いた。
HJ-LINK/USB はPullUP などは入っていないようだが、そもそも非結線時のケアであって、TDOって繋いでる分にはpullupなんかいらんよなぁ...???

うむむ...

2011年2月22日 (火)

Cortex-M0ボード

トランジスタ技術の増刊でCortex-M0のボードが出るらしく、わりと興味を持っている人がまわりに多かったりする。

久しぶりにARMでもいじってみるかと、DesignWaveの付録(Cortex-M3)を、開封.. する前にコンパイラを...

今回、OpenOCD が使えるJTAGも手元にあるので、これも立ち上げたい。

で、HOS-V4Aへの実装を考え始める。

折角のベクタ割り込みなので、isr系は未実装にして、def_inh のテーブルをそのままベクタにマップできないか思案中。xxx_isr は同じ割り込み番号に複数ハンドラを設定できたり exinf が渡せたりするが、どうしてもテーブルが動的管理になってよろしくない。

割り切ればハードウェアでの割り込み機能は充実しているので、遅延ディスパッチ専用のハンドラをひとつ用意すれば、割り込みの中で必要に応じて蹴飛ばしておけば、最後の割り込みの後で自動的にロスレスで呼ばれるというのはいい感じ。

後は、プロセッサ属性を増やしたりしないとなぁ。
現在、コンテキスト状態や、ディスパッチ遅延はフラグ管理だけど、プロセッサ側のレジスタで管理するようマクロを切り替えるのは難しくはないはず。

かつてのARMの面影がまったくないですが、これはこれで楽しそうですね。ARM7や9あたりが懐かしい。

2011年1月 7日 (金)

shcのデバッグ情報絶対パス化

HJ-LINK/USBは快適なのだが、shc利用時にライブラリのデバッグ時にソースの相対パスをうまく探せないことがあるようだ。
アセンブラはなぜか絶対パスで記録されているし。

そこで、とりあえず下記のような超やっつけな、絶対パス変換版 my_shc を作ってみた。
「my_shc.exe」をダウンロード

HOSの場合
make DEBUG=Yes KERNEL_DEBUG=Yes CMD_CC=my_shc
などとでもして、コンパイラを差し替えてmakeすればいい塩梅にデバッグ情報がすべて絶対パスに切り替わり、カーネルも快適にデバッグできるようになる。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

int main(int argc, char *argv[])
{
    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    DWORD exitCode=0;
    char szCmd[8192] = "shc";
    char szBuf[8192];
    int    i;

    for ( i = 1; i < argc; i++ )
    {
        if ( argv[i][0] == '-' )
        {
            strcat(szCmd, " ");
            strcat(szCmd, argv[i]);
        }
        else
        {
            _fullpath(szBuf, argv[i], sizeof(szBuf));
            strcat(szCmd, " ");
            strcat(szCmd, szBuf);
        }
    }

    if ( !CreateProcess(NULL, (LPTSTR)szCmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi) )
    {
        return 1;
    }

    WaitForSingleObject(pi.hProcess, INFINITE);
    GetExitCodeProcess(pi.hProcess, &exitCode);
    CloseHandle(pi.hProcess);

    return exitCode;
}

2010年11月 6日 (土)

SH2A バンクレジスタ

いろいろ調べ中だが、バンクレジスタなかなかいい感じである。
なにより、ハードウェアバンクを使い切ると、そこから先は自動でソフトウェアスタックに退避してくれるあたりが非常によい。
また、VTOが取得できるのもOS的に非常に便利だし、多重割り込みのカウンタもソフトで持つ必要がないのがなおよい。

これはなんとか使えるようにマッピングしたいものだ。

より以前の記事一覧