- ベストアンサー
【H8マイコン】HEWで埋め込みアセンブラ
タイトル通りHEWでCソースに一部アセンブラを使いたいのですが、Webにサンプルとなる物がほとんどなく、マニュアルを読んで試してみたところやはり上手くいきません。用途はLCDを使う時の短い遅延です。__asm {}で囲うだけではだめで、#pragma asmを入れてみてもだめでした。陥りやすい盲点だけでも結構ですのでよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ルネサステクノロジのサイトから、コンパイラパッケージのドキュメントを見ると、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()関数を利用することで、すっきり簡単に実現できることが読み取れます。
その他の回答 (1)
- R32C
- ベストアンサー率39% (115/290)
マニュアルに記載のある通りです。 #pragma asmを有効にするには -code=asmcode のオプションが必要です。 設定方法は、 HEWから、 メニュー 「ビルド」->「H8S H8/300 standerd tool chain」->「コンパイラ」タブ カテゴリを プルダウンで「オブジェクト」指定 出力ファイル形式 「アセンブリプログラム(*.src)」 に変えてみるとコンパイルオプションに、-code=asmcodeが 設定されます。
お礼
自分で気づいてNo.2さんがおっしゃる事を設定しました。pragma asm内ではエラーがでても必ず1行目を示すようでそれで少し悩まされましたが無事解決できました。 ありがとうございました。
お礼
調べていただき感謝しています。 おかげで__asm{}が私の使っているH8/300Hでは使えないことを発見できました。 ありがとうございました。