[H8-ML(4401)] machine.h補足
From: hamayan <hamayan@xxxxxxxxxxxxxxxx>
Date: 2004年02月03日(火)22時44分17秒
hamayan です。

勿論元ネタは別のスレッドなのですが、タイトル見て興味の無い人が判る様に別ス
レッドにしてみました。多分この辺でこのメールを閉じている人が八割位・・・。

元ネタでは、machine.hを使う事はお勧めできない、色々悩むくらいなら、アセン
ブラで記述した方が良いのでは!。と言う趣旨の発言をしていました。
ちょっと言葉足らずなので補足すると、コンパイラに秋月のコンパイラを使ってい
る状況で、machine.hはルネサスのコンパイラに依存すると思われるので、これを
インクルードすると、問題が有るかもしれないし、どうなるか判らない!という事
です。

じゃあmachine.hは何の為に有るのか?
別にルネサスの人が洒落で作ったのではなく、ルネサス純正コンパイラを使ってい
るなら、使うだけの理由は十分に有ります。

元ネタのスレッドにも書いた様に、machine.hはCPUに依存する処理をC言語で記述
する為に存在するのであって、このヘッダーファイルが有効なのは、勿論ルネサス
のコンパイラを使用した時のみです。

ではどんな利点が有るのでしょうか。
その良い例が
set_imask_ccr(0);
ですね。何度か登場しています。

この関数は関数に見えますが、実はルネサスのコンパイラに掛かると、インライン
展開されて、割り込みマスクレジスタを0にクリアするコードを埋め込みます。
インラインアセンブルで行われているのと同じ事を、もっと使い易い形で提供してい
るのです。
下が埋め込まれたコードです。
 ANDC.B      #127,CCR

別スレッドのアセンブラ関数をCからコールする方法は、とても原始的ですが、普遍
的で、まずマスターしたい方法です。
が、わざわざ開発環境にHEWを選んだのなら、最速のコードを出力して欲しいですよね。
埋め込み関数は実際に関数コールをしない為、最速です。
しかも、インラインアセンブルに比べて遥かに可読性、生産性が高い!
そもそも生産効率を高くしたいから、多少の実行効率が落ちてもアセンブラよりC言
語を選んでいるので、その辺の兼ね合いは、まあ使う人が選んで下さい。

さてこれは全く個人的な考えなのですが、汎用OS上のプログラムとは異なり、組み込
みマイコンでの優先すべき事は、移植性より、可読性だと思います。
移植性の問題はコンパイラを使う前に、マニュアルをよく読めば解決できる問題ばか
りです。エンディアンとか、ビットフィールドの並びなんて、コンパイラのスイッチ
一つで解決できたりしかねません。
しかし、可読性の悪いプログラムが内包するバグは、発見し難く、コンパイラのスイ
ッチ一つで直ったりもしません。

勿論、移植性を軽視しているのではありません。実際GCCでもHEWでも動くプログラム
を作っていたりもしますから。

machine.hで提供される埋め込み関数は、思いっきり移植性を無視していますが、可
読性は高くなる事が判ったと思います。
 ANDC.B      #127,CCR
よりは、
set_imask_ccr(0);
の方が何をやっているのか判り易いという事です。

C言語良いですよね。関数名の文字制限なんて256文字とかだったりして、もう関数名
に、一体この関数は何をする関数で、入力は何で、出力は何ですよー!ってのを記述
できるじゃあないですか。もう8文字位で暗号の様なラベルにしなくてもいい!

なるべくC言語で書けるなら、書こうよ!を拡張させて来たのが、今のルネサスのコ
ンパイラとも言えます。
ただし!コンパイラのマニュアルは良く読むか、セミナーに参加して、講師の方に聞
いて下さいね。

同様にビットフィールドも、私は、『有る物は使え!』派なのです。
ビットフィールドも、とても可読性を良くしてくれます。
例えば、
ITU.TSTR.BIT.STR0 = 1; /*俺はITU0だけスタートさせたいんだー*/
と言う記述と、
ITU.TSTR.BYTE &= 0xfe; /*俺はITU0だけスタートさせたいんだー*/
では、勿論ビットフィールドを使った方が理解し易いですよね。

そもそも、ITU0とITU1は別の目的のタイマーとして使われる事が多いと思いますが、
ITU0だけ見た時は、ITU1のビットはまるで関係無いのに、それを意識して、書き換え
ない様に"&="に続く数値を考慮する必要が有ります。
ここに気付かないバグを内包し易くなります。

しかも、この二つのコードをルネサスのコンパイラが出力すると、どっちも同じコード
を吐きます。どっちもビット操作命令に置き換わります。

ところで今月号のトラ技の何処かの記事に、ビットフィールドは移植性が無い!とか、
実行が遅くなる!とか、否定的な記事が掲載されていましたが、

移植性が無い!のは事実です。実際、H8の内蔵タイマーのレジスタをいじったプログラ
ムをARMに持って行っても、動く事は全く期待できません。

実行が遅くなる!のはルネサスに限れば、ビットフィールドを使っても、使わなくても
同じコードが生成されるので、嘘と言う事になります。

BSET命令と、AND等の演算命令を比較すると、実行ステートでBSET命令の方が遅いのです
が、最近のルネサスのコンパイラは、前後の文脈まで考慮してコードを吐くので、下手
をすると、BSETを使った方が実行が早くなる事が有ります。

そもそもトラ技の記事は、どのコンパイラの、どのバージョンの話なのでしょう?
この様な都市伝説みたいな話に惑わされずに、アセンブル出力させたりして、実際に自
分で確かめてみる事が大切ではないでしょうか。



え!、秋月のコンパイラなのでアセンブル出力できない!
大丈夫です。そんな貴方の為に、幾つかのデバックモニタを作って用意してあります。
http://hamayan.ddo.jp/~hamayan/so-net/download.html
からどうぞ。

------------------------------------------------------------
)^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^(
☆☆☆☆☆☆☆☆☆☆☆☆designed by hamayan☆☆☆☆☆☆☆☆☆
from はまやん
アドレスは
	webmaster@xxxxxxxxxxxxxxxx
URL
	http://hamayan.ddo.jp/~hamayan/so-net/
The Embeded Protocol Engine
    Navajoデモ中!続行中!!
	http://hamayan.ddo.jp:8080/
★★★★★★★★★end of message and thank you★★★★★★★

スレッド概略
[表示中](起点)
 └[4402(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]