- ベストアンサー
SH2マイコンで
学校の実験でSH2マイコンを使って実験をしたのですが、 プログラムをつくった時に「double」で変数を宣言したら、プログラムがハードでうまく実行できませんでした。(プログラムのエラーはないです。) SH2マイコンでは「double」は使えないのでしょうか? 回答よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
「YCSH」はイエローソフト社のホームページによるとdoubleにも対応していると書いてますので、まず大丈夫だと思います。コンパイル時にリンクエラーとか出ていないですよね? たぶんですが、デバッガはイエローソフト社のイエロースコープを使ったと思いますので環境的にも問題ない気がします。 ソースコードは次の点が気になりました。 (1)変数syuの定義が何処にもないけどaの間違いですかね? (2)ソースがfloatですがfloatをdoubleに変えただけですか? (3)scanf("%f",&a);はdoubleの時はscanf("%lf",&a);としていましたか? まぁ、これらの問題を置いておいても「角度」で表示が止まった説明は出来ません。 なので調べて欲しいことがあります。、 1.イエローソフト社のホームページで「YCSH」が最新版であることを確認してください(コンパイラのバグの可能性もあるため)。 http://www.yellowsoft.com/download/qanda_03.html 2.デバッガでステップ実行してみてください。printfで問題が起きたのかscanfで問題が起きたのかはっきりさせる必要があります。
その他の回答 (4)
- zwi
- ベストアンサー率56% (730/1282)
SH7044にはFPU(浮動小数点演算回路)が搭載されいないので固定小数点を使って浮動小数点の演算を行いますので単精度でも重いですが、倍精度だとべらぼうに重いと思います。 それはそれとして、 >main関数にwhile文で無限ループをつくったのですが、「double」だとすぐにループを抜けてしまいました。でも「float」で変数宣言したらちゃんとループを抜けずに実行してくれました。 >実行すると、 > 角度 >と表示されてプログラムが終了してしまいました。(?すら表示されませんでした。) これは無限ループから抜けたんじゃなくて何らかの例外でCPUが停止したんです。ループを抜けるようだと無限ループとは言わない。デバッガで追いかけたらすぐ分る気がするんですけどね。 とりあえず前後も合わせてループの部分を掲載してください。
お礼
#include <stdio.h> //SH7044レジスタ #define PEIOR (*((volatile unsigned short *)0xFFFF83B4)) #define PECR1 (*((volatile unsigned short *)0xFFFF83B8)) #define TSTR (*((volatile unsigned char *)0xFFFF8240)) #define TSYR (*((volatile unsigned char *)0xFFFF8241)) #define TOER (*((volatile unsigned char *)0xFFFF820A)) #define TCR3 (*((volatile unsigned char *)0xFFFF8200)) #define TMDR3 (*((volatile unsigned char *)0xFFFF8202)) #define TIOR3H (*((volatile unsigned char *)0xFFFF8204)) #define TIOR3L (*((volatile unsigned char *)0xFFFF8205)) #define TSR3 (*((volatile unsigned char *)0xFFFF822C)) #define TCNT3 (*((volatile unsigned short *)0xFFFF8210)) #define TGR3A (*((volatile unsigned short *)0xFFFF8218)) #define TGR3B (*((volatile unsigned short *)0xFFFF821A)) #define TGR3C (*((volatile unsigned short *)0xFFFF8224)) #define TGR3D (*((volatile unsigned short *)0xFFFF8226)) float a, b; void pwm_init(void) //PWMの初期化 { TMDR3 = 0x02; //PWMモード1 PEIOR |= 0x0F00; //PE8-11:OUT PECR1 |= 0x0055; //PE8-11(TIOC3A-TIOC3D):MTU TSTR &= ~0x40; //カウンタストップ TCNT3 = 0; //カウンタクリア TCR3 |= 0x23; //TGR3A TCNTO CLEAR、CLOCK(24.576MHz)/64 TGR3A = 7680; //周期:(1/24.576MHz)*64*7680=20ms TGR3B = 768; // DUTY:(1/24.576MHz)*64*768=2ms TIOR3H = 0x16; //GRA初期出力1、コンペアマッチで出力1 //GRB初期出力0、コンペアマッチで出力0 TGR3C = 7680; //周期:(1/24.576MHz)*64*7680=20ms TGR3D = 768; // DUTY:(1/24.576MHz)*64*768=2ms TIOR3L = 0x16; //GRC初期出力0、コンペアマッチで出力0 //GRD初期出力1、コンペアマッチで出力1 TSTR |= 0x40; //カウンタ開始 } void main(void) { pwm_init(); while(1){ printf("角度は?\n"); scanf("%f",&a); b=(float)384+(float)syu*(float)384/(float)180; printf("%f\n",b); TGR3B = (unsigned short)b; TGR3D = (unsigned short)b; } } 見にくくてすいません
- Interest
- ベストアンサー率31% (207/659)
開発環境とコンパイラは? > SH2マイコンでは「double」は使えないのでしょうか? GCCでもルネサスの評価版C/C++コンパイラでも、浮動小数点はサポートされているので動かないわけではないと思います。が、「ふつうの」SH2は浮動小数点演算コプロセッサを持っていないので、doubleの演算をするとすごく重くなります。特に割り算なんかやらせたら目も当てられない・・・。 > プログラムがハードでうまく実行できませんでした。(プログラムのエラーはないです。) そういうときは、 1.何をして、 2.どういう結果になると思ったら 3.どうなったか を書いてください。
お礼
開発ソフトウェアは、イエローソフト社製YellowIDEです。 RCサーボモータを指定された角度に制御するプログラムなのですが、プログラムを実行したら、すぐにプログラムが終了してしまいました。 その時の状況は、角度を、 printf("角度は?\n"); scanf("%f",&a); b=(入力した角度aを変換して、doubleに型キャストした計算式) TGR3B = (unsigned short)b; TGR3D = (unsigned short)b; こんな感じでコンピュータから入力して制御するつもりだったのですが、実行すると、 角度 と表示されてプログラムが終了してしまいました。(?すら表示されませんでした。)
- zwi
- ベストアンサー率56% (730/1282)
SH2にはハードに浮動小数点回路搭載の有無やら色々バリエーションがあるはずです。 ラインナップ http://japan.renesas.com/fmwk.jsp?cnt=sh7280_series_landing.jsp&fp=/products/mpumcu/superh_family/sh7280_series/ 使用されたコンパイラの名称(HEWか?)とターゲットとなっているSH2の詳細な名称を書いてください。 たぶん、FPUのないSH2でFPUのあるSH2用のコンパイルオプションを指定してしまったとかと言うオチだとは思います(命令例外にならなかったのかが疑問ですが)。
お礼
コンパイラは「SH用Cコンパイラ YCSH」です。 SH2マイコンはSH7044です。
- jacta
- ベストアンサー率26% (845/3158)
コンパイラは何を使っていますか? > プログラムがハードでうまく実行できませんでした。 どううまくいかなかったのでしょうか?
お礼
コンパイラは「SH用Cコンパイラ YCSH」です。 どううまくいかなかったかというと、 main関数にwhile文で無限ループをつくったのですが、「double」だとすぐにループを抜けてしまいました。でも「float」で変数宣言したらちゃんとループを抜けずに実行してくれました。
お礼
すいません、aの間違いです; (2)はただfloatoをdoubleに変えただけです。 (3)はちゃんとdoubleの時はscanf("%lf",&a);にしていました。 調べてほしいことなんですが、もうこの項目の実験は終わってしまったのでもう調べられないんです。担当の先生に直接聞いています。 みなさん詳しく回答していただきありがとうございました。いろいろと勉強になりました。doubleが使えると分かったので満足です。 回答してくださったことを踏まえて、先生にいろいろと聞いてみたいと思います。