ラベル 開発 の投稿を表示しています。 すべての投稿を表示
ラベル 開発 の投稿を表示しています。 すべての投稿を表示

2009年2月17日火曜日

Unreachable

自前の開発環境を構築するのに色々と敷居が高い事もあり、リモートのサーバ上で直接コーディングを行うという作業をしていたのだけれど、先ほどからサーバが非常に不安定な模様。

まずSSHでのリモート接続が遮断され、その際はpingは通っていて、5分ほどでSSH接続は回復したのだけれど、10分ほどで再度SSHが切断、今度はpingも通らなくなった。

作業を止めて寝なさい、という神のお告げかも知れない。。。

2009年2月12日木曜日

マイコンプログラムの修正対応

以前開発したPICマイコンのプログラムに修正依頼が来た。1つはロジック上の問題(抜け)で、もう1つはプログラム上の問題。

ロジック上の問題は、原因がすぐに分かったので対応も容易だった。1つ関数を追加して完了。

プログラム上の問題は、ロジックには問題が無いと思われたのでとりあえずシミュレータでプログラムを走らせてみて、挙動を確認してみることに。すると、4ビットの数値同士の比較で、ケアしていなかった上位4ビットに変な値が設定されている事が判明。比較時に上位ビットをマスクするマクロを書いて対応。

普段は4ビット数値の取り扱いなんてやっていないので、こういうところは非常に勉強になりますです。

このプログラムを仕上げる時は、試行錯誤で二日ほど徹夜仕事にもなったりして大変だったんだけれど、その時苦労した分上がってきたバグは非常に簡単なもので、その点では良かったと思う。まぁ、簡単なバグなんだから最初から潰しておけって言う突っ込みもありそうだけれど(^^

もうバグが無いと良いな~。

2009年2月9日月曜日

PHPでグローバル変数

かつて書いたPHPのコードが動かないなあ、と悩んでいたが色々調べて解決した。

PHPはバージョン4からクラスの概念が導入されて、バージョン5ではスコープも色々と使えるようになりました(public / protected / private)が、相変わらずグローバル変数を使うことも出来ます。

例えば、あるファイル(aaa.inc)に以下の様に書いておき、

$_VAR['key'] = 'val';

これを別のファイル(bbb.php)から読み込む。bbb.phpではクラスが定義されており、そのメソッドの中で上記のグローバル変数にアクセスする。

require_once("aaa.inc");

class Hoge
{
 public function fuga()
 {
  global $_VAR;
  echo $_VAR['key'];
 }
}

さて、以前PHP5で上記のコードを開発し実行したのだが、その時はうまく動いていた。PHPの細かなバージョンは覚えていないが。

しかし、久々にPHPの環境を変えてからこれを動かすと、うまく動かない。PHP5の環境は、MacOS XデフォルトからMacPortsの物に変えただけである。

何故だろうと色々と調べていたところ、「PHP5 CLI でのグローバル変数の扱い [PHP Tips]」を発見して、解決方法が分かった。

要するに、この様にスコープを飛び越えてグローバル変数にアクセスしたければ、そもそも変数をグローバル変数だと宣言しなければいけないということなのである。具体的には、上記のaaa.incで、

global $_VAR;
$_VAR['key'] = 'val';

という風に「グローバル変数でございます」と宣言してやれば良いわけだ。試してみたところ、確かにこれで動いた。

いつからこれが必要になったのか、正直良く分かっていない。。。

2009年1月30日金曜日

XSLT

言語コンパイラーとしての XSLT

IBM developerWorksはいつもいつも秀逸な記事が多くて、内容も濃いので時々どっぷり浸かって読むのに良いんですが、これまた面白い記事です。

JavaBeanの定義を書いたXMLファイルからXSLTでJavaBeanのソースコードを生成する、というのは面白いなと思いました。

最近はJavaはあまりやらなくて、ウェブ系はもっぱらPHPなんですが、データベースに関してはテーブル定義のXMLからMySQL or PostgreSQLのDDLやPHPのクラスを自動生成するXSLTがあっても良いなって思いました。

2002年頃の案件以来XSLTはご無沙汰なんですが、久しぶりに使ってみたいです。XSLTのランタイム(何て呼ぶんでしたっけ??忘れちゃいました)は今だと何が主流なんですかね。以前は確かXalan (=ザランと読む)だった気が。。。

.NETのiPhoneアプリ!?

普通に聞くと「何じゃそりゃ!?」と思ってしまうのだが、記事によると色々特殊なやり方はしているものの事実の模様だ。

iPhoneでC#アプリが審査に通るワケ

イメージとしては、昔懐かしいVisual J++でJavaのバイトコードをネイティブコードにコンパイルしてしまうというアプローチが存在した(Sunに禁止される前の)頃の(Windows上の)Javaみたいなものだろうか。

それにしても、.NET Frameworkのオープンソース実装であるMONOの存在は聞いていたけれど、ここまで実用的だとは知らなかった。意外といけそうだ。

2009年1月28日水曜日

MacOS XのPHP

いわゆるLAMP (Linux, Apache, MySQL, and PHP) ならぬMAMP (MacOS X, Apache, MySQL, and PHP) な環境でソフト開発をしていたんですが、今度はMySQLの代わりにPostgreSQLを使うことになり、早速MacOS X用のインストーラを落としてきて入れました。

ところが、何とMacOS XデフォルトのPHP5はPostgreSQLに対応していません。phpinfo()で見ると、ビルド時のconfigureオプションでPostgreSQLを有効にしていないのです。

何たる割り切り・・・orz

というわけで、何とかしてMySQLもPostgreSQLも使えるPHP5を導入しなければいけなくなりました。MA(M|P)Pって感じです。(←分かり辛っ)

2009年1月23日金曜日

PIC開発完了

昨日PICプログラムの開発が何とか完了しました。

初めての経験だったので色々とはまりましたが、これで一息といったところです。今回の経験で得られたTIPSは以下のような感じでしょうか。

  • 変数を使い過ぎてバンク0の空き領域を使い切らない様にする
  • MPLAB IDEのエディタはアセンブラのソースファイルが更新されている事は検知してくれるが、再ビルド(=アセンブル)はしてくれない

いやいや、それにしてもアセンブラをステップ実行してデバッグするのは本当にしんどいです。。。

2009年1月21日水曜日

Perl連想配列の入れ子

Perlの連想配列が入れ子に出来るかもって話を仕入れた。

具体的には、

%hoge = (x => y, ...);

と書くと hoge には連想配列の実体が格納されるが、

$hoge = {x => y, ...}

と書くと hoge には連想配列の参照が格納されるという話。違いは、丸括弧か中括弧かということである。

まだ実際にコードを書いて試してみたわけではないが、備忘録代わりに書いておくことに。

非同期

PIC16のアセンブラをIDEでデバッグしててハマった。

ステップ実行しているのにサブルーチンに何故かジャンプ・インしない・・・と思って悪戦苦闘していたのだけれど、実はマシン語にアセンブルされたバージョンのアセンブラコードと、IDEのビューアでデバッグ用に見ていたアセンブラコードのバージョンが違ったというお粗末なミス・・・orz つまり、アセンブラコードとマシン語の実行コードが同期していなかったんですわ。

IDEが新しいバージョンのアセンブラソースをリロードしてくれるのに、マシン語への再ビルドはしてくれないのです。ちょっと不親切だな~とも思うんですが、ともあれミスはミスですわ。

寝る前に解決してくれて嬉しいんだけれど、しょーも無い話で1時間以上無駄にした感がある。ちょっと勿体無かった。まぁ、何事も経験と言えば経験なのですが。

今度はPICマイコン

8ビットPICマイコン (PIC16F874) 向けのコードを書いています。人生初PIC体験です。

と言いつつ、昨年まで書いていたH8 3069向けのコードでGPIOを使っていたので、そういった意味での敷居は高くありませんでした。

敷居が高いのは、アセンブラ!人生初アセンブラです。H8向け開発でもアセンブラコードを読む機会がありましたが(TOPPERS/JSPのモニタプログラムとか)、今回はまさに開発対象がアセンブラです。一応、Cライクな独自言語を書いてそれをコンパイラに掛けるというスタイルで開発しているんですが、出力されたアセンブラをPICベンダの配っているアセンブラ向けIDEでデバッグしてます。

う~む、どんどんとプリミティブになってきた。。。

それにしても、アセンブラ読むの大変です。かなり大変です。

2009年1月19日月曜日

Perl

なんか、久々にPerlを書こうとすると色々と敷居が高い。
連想配列の値に連想配列を入れる、という初期化の仕方が出来ないらしい。
つまり、

my %hoge = ("key1" => ("key11" => "val11", "key12" => "val12"), ...);

みたいな感じのコードが書けない。
う~、じれったい!

Perlは連想配列があるので構造体は無いらしい。
うぅぅ・・・クラスを作ってオブジェクト指向しろと、そういうことですか・・・。

あ、ちなみに処理系はCygwinのPerl 5.10.0です。。。

2009年1月18日日曜日

PHPのinclude_pathで

paperboy & co.のHeteml (ヘテムル) というホスティングサービスを個人的に契約して使っているのですが、ここのPHPがイマイチ使いにくい。とは言ってもPHPはPHPなのでどこで使おうが一緒なのだけれど、問題は各ユーザが個別にinclude_pathを設定できない点。

通常、.htaccessでphp_valueディレクティブを使ってinclude_pathを設定すれば、各ユーザが個別にinclude_pathの設定が出来るのだと思われるが、これが出来ない為にrequireやincludeに指定するパスをどうすれば良いのか、非常に悩ましいのだ。

ちなみに、今はrequire / include対象のファイルを絶対パスで指定することでこの問題を避けているが、これははっきり言ってダサい。あまりにもダサい。

もっとスマートにどうにか出来ないものかなあ。

2009年1月2日金曜日

久々のJava

久しぶりにプライベートでJavaコードを書いています。

ところが、Java SE 5を前提としたサンプルコードで未知のノーテーションを発見!

for(Folder f : fol.list()){
}

これって、いわゆるPerlやPHPのforeachなんだと思うんですが、Javaでは初めて見ました。ああ、私の知識はJ2SE 1.4で止まっている・・・orz 仕事でJavaのコードを読んでいたのは3年以上前なので、仕方のない事かも知れませんが。。。

それにしても、Javaはまだまだ進化し続ける言語なんですね。あらためて実感しました。

2008年12月18日木曜日

TOPPERS/JSP for秋月電子H8 3069 LANボード (6)

前回からだいぶ間が空いてしまいました。

ブレーク信号を受信するとTOPPERS/JSPカーネルがハングしてしまっていたのですが、これは受信割込ハンドラだけでなくエラー受信割込ハンドラを有効にすることで回避できました。また、実際はブレーク受信時の処理を書く必要はなかったのです・・・まったく、一体何のためにあれだけ苦労したのかと。

ちなみに、今回この問題が起きたわけは、もっと深いところにありました。深いとは言ってもソフトではなく、ハードです。

実は、H8 3069 LANボードに載っているH8 3069には3チャネルのシリアルコントローラが載っているんですが、チャネル0とチャネル1はRS-232C用に信号レベルの変換を行うチップが接続され、そのチップ経由でチャネル1がD-sub 9ピンの雌コネクタに接続されています。このチャネル1をシリアルコンソールとして利用するわけです。

ところで、今回はまっていたのはこのRS-232C向けに出力されているチャネル0を使った通信だったのですが、RS-232C用に信号レベルを変換されてしまうと都合の悪いデバイスに接続をしなければならなかったので、このH8からレベルシフタへの配線パターンをカットして、そこからリード線を引き出す様な使い方をしていたんですね。

ちなみに、RS-232Cとはシリアル通信に対してHIGHとLOWの電圧を定めたもので、HIGHが+12V、LOWが-12Vで作動します。通常のシリアル通信(UART)にはHIGHレベルの電圧についての規定はなく、LOWレベルはグラウンドで動作します。

TOPPERS/JSPのシリアルドライバは、チャネル0のUARTがレベルシフタに直結している事を想定していた為に、今回の問題が起こった様でした。

ま、基板に直接手を入れる様な事をすれば、この様な想定外の事態が起こる、ということなんでしょうな。ともかく良い勉強になりました。

2008年11月27日木曜日

TOPPERS/JSP for秋月電子H8 3069 LANボード (5)

さてさて、H8向けのTOPPERS/JSPには、シリアルインタフェースドライバ内にシリアル受信割込ハンドラとシリアル受信エラー割込ハンドラの2つが定義可能です。しかし、後者は #ifdef の条件分岐によってコメントアウトされており、前者内でエラーの割込も処理するようになっています。

ちなみに、実装は jsp/config/h8/hw_serial.c 内の SCI_in_handler です。

さて、SCI_in_handler の実装を見てみましょう。

void SCI_in_handler(ID sioid)
{
SIOPCB *pcb;
UB status;

pcb = get_siopcb(sioid);
status = sil_reb_mem((VP)(pcb->inib->base + H8SSR));

if (status & (H8SSR_ORER | H8SSR_FER | H8SSR_PER)) {

/* エラー処理 */

/* エラーフラグをクリア */
sil_wrb_mem((VP)(pcb->inib->base + H8SSR), status & ~(H8SSR_ORER | H8SSR_FER | H8SSR_PER));
}

if (status & H8SSR_RDRF) {
if (pcb->openflag) {
/* 受信可能コールバックルーチンを呼出す。*/
SCI_ierdy_rcv(pcb->exinf);
} else {
sil_wrb_mem((VP)(pcb->inib->base + H8SSR), status & ~H8SSR_RDRF);
}
}
}

ううむ・・・真ん中当たりに「エラー処理」と書かれて放置されている(っぽい)辺りが怪しい。ここに書けば良いのかな。

とりあえず、フレーミングエラーの場合はシリアルチャネルのRxDを調べて、ブレーク信号かどうかを判断すれば良いそうです。こんな処理を入れちゃいましょう。

/* フレーミングエラー発生時 */
if (status & H8SSR_FER){
/* RDR (Receive Data Register) がブレーク信号受信状態 (全ビットがLOW = 0x00) であるかどうかをチェック */
if (sil_reb_mem((VP)(pcb->inib->base + H8RDR)) == 0x00){
/* ブレーク信号受信時には SCR (Serial Control Register) の RE (Receive Enable) フラグを落とす */
sil_wrb_mem((VP)(pcb->inib->base + H8SCR),
sil_reb_mem((VP)(pcb->inib->base + H8SCR)) & ~H8SCR_RE);
}
}

RxDを調べるとブレーク信号かどうか分かるって言うんですが、それってRDR (Receive Data Register) の値を調べれば良いって事と等価ですよね?RSR (Receive Shift Register) は直接CPUから読み書きできませんので、これで合ってると思うんですが。

そして、このコード修正をカーネルに反映してアプリを再コンパイルします。カーネルをアプリとは別にコンパイルしている場合は、

% cd jsp/(kernel_build_dir)
% make realclean
% make depend
% make libkernel.a

とかやっときましょう。たぶん最後の行の「make libkernel.a」だけで良い筈ですが、チキンな私は「make realclean」からやっときました(^^;)

さて、アプリをコンパイルしてH8に転送し、実行します。そして、シリアルコンソールのminicomから「Ctrl-a f」でブレーク信号を送信しますが・・・あ、シリアルコンソールからのデバッグ出力が止まった。カーネルがハングしたっぽい。

何でやねん!!

今入れたコードは何だったんだ・・・orz

(苦悩は続く・・・)

2008年11月26日水曜日

TOPPERS/JSP for秋月電子H8 3069 LANボード (4)

あああ、、、やってしまった。

前回のエントリでは、一生懸命SH2向けのTOPPERS/JSP実装をベースにH8 3069F向けのブレーク信号検出時の割り込みハンドラについて想定しましたが、やってしまいました。そもそも、H8にはブレーク信号検出割り込みというものは無いのです。代わりに、受信エラー割り込みの割り込みハンドラ内で、ブレーク信号の検出時の挙動を書いてやる必要が有りそうです。

ちなみに、受信エラー割り込みハンドラは既に jsp/config/h8/hw_serial.c 内に実装されており、シリアルステータスレジスタ(SSR)の3つのフラグ(ORER: オーバーランエラー, FER: フレーミングエラー, 及び PER: パリティエラー)をチェックし、フラグが立っていれば単にそれらをクリアする、という実装になっています。

ここに何かを実装すれば良い気がします。


TOPPERS/JSP for秋月電子H8 3069 LANボード (3)

引き続き備忘録です。

TOPPERS/JSPカーネルのH8向け実装には、シリアルインタフェースの受信時にブレーク信号を検出した際の割り込みハンドラが実装されていない様です。これで相当にハマりました。しょうがないので、自分で作ることにします。

幸いな事に、TOPPERS/JSPカーネルのソースツリーを調べると、SH2プロセッサのSH7615向けにはブレーク信号検出の割り込みハンドラが実装されていますので、それを参考にします。というか、他のプロセッサ/プラットフォーム向けにはブレーク信号検出の割り込みハンドラが実装されていない様に見受けられます。みんな必要なかったんでしょうか。。。謎だ。

さて、以下は作業予定ですので、実際にこの通りやってうまくいかない可能性も有ります。作業が終わったらまたアップデートする予定です。

作業のレシピはこんな感じ。

ソース:

  1. jsp/config/sh2/sh7615scif.c
    • 割り込みハンドラの実体である sh2scif_isr_siop_brk 関数があります
    • シリアルチャネル0向けの割り込みハンドラである sh2scif_isr_brk 関数があります(その実体は sh2scif_isr_siop_brk 関数です)
    • シリアルチャネル1向けの割り込みハンドラである sh2scif_isr2_brk 関数があります(その実体は sh2scif_isr_siop_brk 関数です)
  2. jsp/config/sh2/hsb7616it/hw_serial.h
    • 割り込みハンドラの名前を付け変える以下の#defineディレクティブがあります
      • #define sio_handler_brk sh2scif_isr_brk
      • #define sio_handler2_brk sh2scif_isr2_brk
  3. jsp/config/sh2/hsb7616it/hw_serial.cfg
    • 割り込みハンドラを登録する以下の静的APIがあります
      • DEF_INH(INHNO_SERIAL_BRK, { TA_HLNG, sio_handler_brk });
      • DEF_INH(INHNO_SERIAL2_BRK, { TA_HLNG, sio_handler2_brk });

なんか、これだけ材料があったら負ける気がしません(笑)。

さて、私がターゲットにしているのはH8 3069を搭載した秋月電子製マイコンボード(H8 3069F LANボード)ですので、上記のレシピで以下の様な読み替えを行います。

  • sh2 => h8
  • hsb7616it => akih8_3069f

また、シリアルチャネルの数が最大3に増えます。

この読み替えを行うと、H8 3069F LANボード向けには以下の作業をすることになります。

作業:
  1. jsp/config/h8/akih8_3069fscif.c を作成する
    • 割り込みハンドラの実体である h8scif_isr_siop_brk 関数を実装する
    • シリアルチャネル0向けの割り込みハンドラである h8scif_isr_brk 関数を実装する(その実体は h8scif_isr_siop_brk 関数である)
    • シリアルチャネル1向けの割り込みハンドラである h8cif_isr2_brk 関数を実装する(その実体は h8scif_isr_siop_brk 関数である)
    • シリアルチャネル2向けの割り込みハンドラである h8cif_isr3_brk 関数を実装する(その実体は h8scif_isr_siop_brk 関数である)
  2. jsp/config/h8/akih8_3069f/hw_serial.h を作成する
    • 割り込みハンドラの名前を付け変える以下の#defineディレクティブを定義する
      • #define sio_handler_brk h8scif_isr_brk
      • #define sio_handler2_brk h8scif_isr2_brk
      • #define sio_handler3_brk h8scif_isr3_brk
  3. jsp/config/h8/akih8_3069f/hw_serial.cfg を作成する
    • 割り込みハンドラを登録する以下の静的APIを記述する
      • DEF_INH(INHNO_SERIAL_BRK, { TA_HLNG, sio_handler_brk });
      • DEF_INH(INHNO_SERIAL2_BRK, { TA_HLNG, sio_handler2_brk });
      • DEF_INH(INHNO_SERIAL3_BRK, { TA_HLNG, sio_handler3_brk });
ここで、H8プロセッサ、及びH8 3069F LANボードにおける、TOPPERS/JSPのファイル構成を考慮して、少し修正を施します。

  1. jsp/config/h8/akih8_3069fscif.c を作成する
    • 既存の jsp/config/h8/hw_serial.c に追記する
  2. jsp/config/h8/akih8_3069f/hw_serial.h を作成する
    • 既存の jsp/config/h8/hw_serial.h に追記する
  3. jsp/config/h8/akih8_3069f/hw_serial.cfg を作成する
    • 既存の jsp/config/h8/hw_serial.cfg に追記する

さらに、既存のH8向けシリアルインタフェースドライバの関数名を踏襲しましょう。修正された作業内容は以下の通りです。

  1. 既存の jsp/config/h8/hw_serial.c に追記する
    • 割り込みハンドラの実体である SCI_brk_handler 関数を実装する
    • シリアルチャネル0向けの割り込みハンドラである sio_brk_handler 関数を実装する(その実体は SCI_brk_handler 関数である)
    • シリアルチャネル1向けの割り込みハンドラである sio_brk2_handler 関数を実装する(その実体は SCI_brk_handler 関数である)
    • シリアルチャネル2向けの割り込みハンドラである sio_brk3_handler 関数を実装する(その実体は SCI_brk_handler 関数である)
  2. 既存の jsp/config/h8/hw_serial.h に追記する
    • 割り込みハンドラの名前付け変えは不要
  3. 既存の jsp/config/h8/hw_serial.cfg に追記する
    • 割り込みハンドラを登録する以下の静的APIを記述する
      • DEF_INH(INHNO_SERIAL_BRK, { TA_HLNG, sio_brk_handler });
      • DEF_INH(INHNO_SERIAL2_BRK, { TA_HLNG, sio_brk2_handler });
      • DEF_INH(INHNO_SERIAL3_BRK, { TA_HLNG, sio_brk3_handler });

さて、これでやることが決まりました。
作業を始めますか。。。

2008年11月24日月曜日

Vine Linuxでマイコン開発(2)

その後、すっかり記述がご無沙汰してしまいました。

結局、Vine 4.2ではRPMによるクロス開発環境構築を諦め、通常の様にソースからconfigure & make & make installを行いました。但し、インストール先はユーザのホームディレクトリ以下です。

これで、binutilsとgcc、そしてnewlibが揃いました。

次は、開発に用いる組込向けOSを用意します。今回はμITRON 4.0に準拠したオープンソースのOSである、TOPPERS/JSPを用います。

TOPPERS/JSPは、実はOSと言うよりも大きなライブラリです。ソースが公開されていますし、既に様々なCPUやプラットフォームに移植済です。当然、今回のターゲットであるルネサスH8 3069Fプロセッサや、秋月電子 H8 3069F LANボードに対応しています。

ところで、TOPPERS/JSPを使うプログラムは、TOPPERS/JSPカーネル(実体はソースをビルドする事で得られるlibkernel.aという静的ライブラリ)とリンクされ、H8 3069Fの内部フラッシュROMに書き込まれることで、実行可能となります。

しかし、H8 3069のフラッシュROMは100回の書き込みしか保証されていません。そこで、毎回毎回フラッシュROMに書き込まなくても良い様に、フラッシュROMには簡易モニタプログラムを書き込むことにします。H8用の簡易モニタプログラムはこちらからダウンロードできます。

H8簡易モニタは、既にコンパイル済のバイナリが配られているアーカイブに含まれていますし、それをビルドするためのソースも同梱されています。特にバイナリ版で問題が無ければ、バイナリ版をH8 3069のフラッシュROMに転送します。

ちなみに、転送するにはROMライタプログラムが別途必要です。今回は、ソースが手に入るOpen H8/SH Writeを利用することにします。ソースファイル「h8write.c」をダウンロードし、そのまま例えば以下の様なコマンドラインでコンパイルします。

% gcc -o h8write h8write.c

出来上がったROMライタを使って簡易モニタをH8 3069のフラッシュROMに転送します。

% h8write -3069 -f20 mon3069.mot /dev/ttyUSB0

但し、簡易モニタプログラムのモトローラSレコード形式ファイルのファイル名をmon3069.mot、また今回はUSB/シリアル変換ケーブルを用いているので、シリアルポートのデバイスファイルを/dev/ttyUSB0としています。

これでとりあえずH8簡易モニタが起動する様になります。H8 3069ボードのシリアルポートコネクタにUSB/シリアル変換ケーブルを接続し、Vine上でrootにsuしてからminicomを起動します。root権限が無いとシリアルポートのデバイスファイル/dev/ttyUSB0がオープン出来ませんので、ご注意下さい。また、ターミナルソフトはminicomじゃなくても構いません。

minicomを起動する場合は、まず最初にシリアルポートの接続設定を行う必要がありますので、コマンドラインオプションに”-s”を指定します。

% su -
% minicom -s

もしくは、普通にオプション無しでminicomを起動し、”Ctrl-a s”で設定画面を呼び出しても同じです。

シリアルポートの設定は、以下の通りです。

  • 通信速度: 38,400bps
  • データサイズ: 8ビット
  • パリティ: 無し
  • ストップビット: 1

H8 3069ボードに接続し、簡易モニタの起動が確認出来ればひと段落です。

2008年11月21日金曜日

TOPPERS/JSP for秋月電子H8 3069 LANボード (2)

引き続き備忘録です。

  1. 特定のI/OポートのHigh/Lowを見る方法。
    • 例えばポート4に属する8つのI/Oポート(H8 3069のピン配置では#18-21, #23-26)の値は、H8P4DRマクロを使ってアクセスします。
    • ポート4の1ビット目は(*((UB *) H8P4DR) & 0x01)でRead/Writeアクセスできます。
    • 電圧Highは1、電圧Lowは0となります。
  2. 特定のI/Oポートの入出力方向の取得/設定方法
    • まず、H8ではI/Oポートの入出力方向を設定するレジスタ(DDR: Data Direction Register)が書き込み専用です。その為、現在の設定値を保持する為にTOPPERS/JSPでは特別にカーネル内部に設定値保持の為の変数を設けています。
    • 入出力方法の設定には、sil_wrb_ddrサービスコールを用います。例えば、ポート2の1ビット目から6ビット目までは出力、7ビット目と8ビット目は入力、と設定する場合は、sil_wrb_ddr(IO_PORT2, 0x3F)とコールします。出力に設定するI/Oポートのビットは1を、入力に設定するI/Oポートのビットは0を指定します。
    • 設定済みの値を読み出したい場合は、sil_reb_ddr(IO_PORT2)とコールし、その返り値をチェックします。
    • 設定済みの値に対して特定のビットだけをON/OFFしたい場合は、sil_anb_ddr (既存値とのAND演算)、sil_orb_ddr (既存値とのOR演算)を用います。
  3. タスクのウエイト
    • 通常のCプログラムにおけるsleep関数のような事をしたい場合は、dly_tskサービスコールを用います。引数は1つだけで、ミリ秒単位の時間を表す整数です。
    • 例えば、1秒間ウエイトしたい場合は、dly_tsk(1000)とコールします。

2008年11月18日火曜日

TOPPERS/JSP for秋月電子H8 3069 LANボード

本エントリは備忘録です。

μITRON4の実装であるTOPPERS/JSPを使って、秋月電子製のルネサステクノロジH8 3069を搭載したボード上で稼働するプログラムを書いています。

H8 3069はH8 300Hファミリ、最大クロック25MHz (但し当該ボードでは20MHzで駆動)、内部フラッシュROM 512KB、内部RAM 15KB、外部RAM 2MB (16Mbits)といったところです。シリアルインタフェースは3ch搭載されています。

  1. シリアルポートI/O
    • ER_UINT serial_rea_dat(ID portid, char * buf, UINT len)
      • portidのシリアルポートからbufが先頭アドレスのバッファにlen文字読み出す
    • ER_UINT serial_wri_dat(ID portid, char * buf, UINT len)
      • portidのシリアルポートにbufが先頭アドレスのバッファからlen文字書き出す
  2. ログ出力
    • void syslog(UINT prio, const char * format, ...)
      • prioのプライオリティでログを出力する
      • format以降の引数については標準Cライブラリのprintf関数と同様
      • 但し、formatより後ろの引数は最大5個まで