• ベストアンサー

【H8マイコン】HEWで埋め込みアセンブラ

タイトル通りHEWでCソースに一部アセンブラを使いたいのですが、Webにサンプルとなる物がほとんどなく、マニュアルを読んで試してみたところやはり上手くいきません。用途はLCDを使う時の短い遅延です。__asm {}で囲うだけではだめで、#pragma asmを入れてみてもだめでした。陥りやすい盲点だけでも結構ですのでよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ルネサステクノロジのサイトから、コンパイラパッケージのドキュメントを見ると、Cソースにアセンブラコードを記述する拡張機能を利用する場合、これらが有効となる条件が各拡張機能毎に異なる仕様になっていることが記載されているのが読み取れます。 1) __asmが利用できる条件は 「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.1 #pragma 拡張子、キーワード」→「(3)その他の拡張機能」→「アセンブラ埋め込み機能」→「__asm」→「備考」に記載されているとおり、H8SX及びH8SのCPUを指定した場合 2) #pragma asm,#pragma endasmが利用できる条件は 「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.1 #pragma 拡張子、キーワード」→「(3)その他の拡張機能」→「アセンブラ埋め込み機能」→「#pragma asm」→「備考」に記載されているとおり、code=asmcodeオプションを指定した場合 3) #pragma inline_asmが利用できる条件は 「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.1 #pragma 拡張子、キーワード」→「(2)関数に関する拡張機能」→「アセンブラ記述関数のインライン展開」→「#pragma inline_asm」→「備考」に記載されているとおり、code=asmcodeオプションを指定した場合 それぞれの詳細はマニュアルの項目を参照してください。 なお、Cソース上でNOP命令を埋め込むだけなら、「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.3 組み込み関数」→「NOP命令」の項目に記載されているように、ヘッダ<machine.h>をincludeして、nop()関数を利用することで、すっきり簡単に実現できることが読み取れます。

参考URL:
http://documentation.renesas.com/jpn/products/tool/rjj10b0166_h8s.pdf
wsh2240
質問者

お礼

調べていただき感謝しています。 おかげで__asm{}が私の使っているH8/300Hでは使えないことを発見できました。 ありがとうございました。

その他の回答 (1)

  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

マニュアルに記載のある通りです。 #pragma asmを有効にするには -code=asmcode のオプションが必要です。 設定方法は、 HEWから、 メニュー 「ビルド」->「H8S H8/300 standerd tool chain」->「コンパイラ」タブ カテゴリを プルダウンで「オブジェクト」指定 出力ファイル形式 「アセンブリプログラム(*.src)」 に変えてみるとコンパイルオプションに、-code=asmcodeが 設定されます。

wsh2240
質問者

お礼

自分で気づいてNo.2さんがおっしゃる事を設定しました。pragma asm内ではエラーがでても必ず1行目を示すようでそれで少し悩まされましたが無事解決できました。 ありがとうございました。

関連するQ&A

専門家に質問してみよう