• ベストアンサー

【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

  • アセンブラを用いてマイコンを動かす

    私は研究でマイコンを使っています それを2値パターンのLCDに画像を表示させるといったことをしています しかしLCDのチップが壊れてしまい、これ以上表示できなくなってしまいました 今は大学生ですがこれでは卒業できないと言われてしまいました 動画の割り込みプログラムを作りそれをオシロで測定する研究にシフトしました がプログラムがわからないので厳しい状態になっちゃいました どのようなプログラムならいいんでしょうか?

  • アセンブラ マイコン

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1684787を見て アセンブラを学習するにはマイコンを購入したほうがいいみたいだけど、どんなマイコンがいいのでしょうか。 できるだけ安くて、買ってすぐwindows xp で動くものを教えていただけないでしょうか。

  • LCDを用いたカウントダウンプログラムについて

    今、PIC16F84AとLCDを用いて255からカウントダウンするところをLCDに表示するプログラムを作っています。 開発環境は ・MPLAB X IDE ・XC8コンパイラー ・PIC Kit3 を使っています。 プログラムはコンパイル、ビルドおよび書き込みは正常にできます。 しかし、いざ動かしてみるとカウントが「255」から「254」にならず「52」になってしまいます。 プログラムのどこがおかしいか全くわかりません。 また、プログラムにおいてLCDの表示ルーチンは、「Hi-Tech C」のサンプルを使用していて (Delay関数の個所をXC8用に書き換えています。)パスコンは、つけたほうが良いのですが、今回はつけていません。 参考のため回路図とプログラムを掲載しますので解決策がありましたら教えてください。 よろしくお願いいたします。 ////////////////以下ソースコード//////////////////// /* * File: main.c * * Created on 2015/12/24, 16:37 */ //#define _LEGACY_HEADERS #include <pic.h> #include <stdlib.h> #include "lcd.h" #define _XTAL_FREQ 4000000 #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is disabled) #pragma config CP = OFF // Code Protection bit (Code protection disabled) void ioport(void); void main(void) { unsigned char data; char str[2]; ioport(); lcd_init(); data=255; while(1){ lcd_clear(); lcd_goto(0x00); itoa(str,data,10); lcd_puts(str); if(data<0){ data=255; } __delay_ms(250); __delay_ms(250); data--; } } void ioport(void) { TRISA=0x00; PORTA=0x00; TRISB=0x00; PORTB=0x00; } //////////////////////////////////

  • EclipseでH8マイコンのHEWのコンパイラを使えるようにする方法

    現在、H8マイコンのプログラミングをEclipseでできないものかと調べているのですが、EclipseにH8マイコンの開発環境HEWで使用しているコンパイラをEclipseでも使えるようにする方法というのはありますでしょうか? どのように設定すればよいか教えていただけると助かります。

  • PICマイコンのアセンブラについて

    PICマイコンのアセンブラルーチンについて PICマイコンのアセンブラについて教えていただきたく投稿しました。 http://orange.zero.jp/electronics/pic/pic.html 上記のサイトについてです。 『●「整数演算」』の 『◇8×8=16ビットの乗算』についてです。 つまり、下記リンクの演算ルーチンについて、大まかな流れだけでいいので解説していただけないでしょうか。 http://orange.zero.jp/electronics/pic/mul816.txt よろしくお願い致します。

  • マイコンのアセンブラ学習

    教えてください。仕事で、マイコンを使ってある波形を作ることになりました。 マシン後のマニュアルを渡され、LDI, STB,EOR・・とかを使って作るんだ。といわれました。 RISCマイコン??とか言ってました。 全然分からないのですが、このRISCマイコン?のマシン後の組み方で学習できるURLとかあれば教えてください。 書籍でも結構です。 よろしくお願いします

  • SH-2AマイコンをHEWで動かすことについて

    SH-2AマイコンのLEDを点滅させるプログラムをHEWにて作成しデバッグをするのですが ダウンロードしたサンプルプログラムの場合、LED点滅が実行されプログラムを停止することもできます。 しかし自分で作成したワークスペースでは、デバックするとそこで固まり、LED点滅されずプログラムを停止することも出来ず毎回タスクマネージャーから強制終了しています。プログラムをサンプルプログラムと全く同じものにしても、自分のワークスペースでは固まってしまい困っています。

  • H8マイコン アセンブラ言語の乱数ルーチンについて

    H8マイコンでアセンブラ言語を使用しております。 アセンブラ言語で、ランダムに分岐するようにしたいのですが、乱数ルーチンをどのように作ればよいかわかりません。 下記は現在のメインプログラムです。ポート4の4の状態を調べ、真ならHYOJIに分岐するようにし、真でないならSTARTに戻るという風にしています。 START: MOV.B @P4DR,R0L MOV.B R0L,@SW_D MOV.B @SW_D,R0H BTST #4,R0H BEQ HYOJI JMP @START 5行目のBEQから乱数ルーチンにひとまず飛んで、そこからさらにランダムに選ばれた分岐に飛ぶというようにしたいです。 乱数ルーチンは現在時刻などから値を取得し、それからランダムな値を作ったりするのでしょうか? どなたかご協力お願いいたします。 ちなみに、下記は自分が参考にしている本です。 H8マイコン入門 堀桂太郎著 東京電機大学出版局発行

  • GDL(GCC DEVELOPER LITE)のコンパイルについて

    H8/3048Fマイコンのプログラミングをやりはじめた初心者です. これから、秋月製のコンパイラ、アセンブラ、リンカではなくGDLを使用しようと思って、今日から使用し始めたのですが、GDLはリンクまでを一気に行ってしまうのですね。 例えば、A.c,B.c,C.cの三つのC言語ソースファイルをコンパイルして3つをリンクさせようとする場合はどのようにしたらよいでしょうか? 一つ一つコンパイルしてオブジェクトファイルを作成する方法がよくわかりません(マニュアルやヘルプの説明が短い・・・)。 3048Fマイコンを買ったときについてきたサンプルプログラムをコンパイル、リンクしようと考えてるのですが、そこでつまづいています. 3つのC言語ソースファイルを1つにしてやったらできましたが、.MOT形式の出力ファイルがもともと存在していたファイルとサイズがぜんぜん違っているので、何かおかしいのではないかと考えています. 何かわかることがありましたら、何でも良いので教えてください.

  • H8マイコンに関して

    H8マイコンは、1つのプログラムで複数の周辺機器を同時に使うことができますか? 例えば、LCDとSCI(シリアル通信)を同時に動かしたい。または、AD変換とLCD・SCIを同時に走らす。 とかです。 変数の設定次第で、どうにかなると噂で聞きました。(例えば、グローバル変数を設定するとか?) ご回答をお願いします。