![]() |
![]() CqREEKのページへ戻る |
ここでは,よく寄せられるCQ RISC評価キット付属のコンパイラexeGCC-CQ版 および exeGCC評価版に関する質問についてお答えします.
なお,
exeGCC-CQ版とは…
→CQ RISC評価キット/SH-1 / SH-3 / V821 / Vr4300
に付属のコンパイラで,正確にはexeGCC-CQ版/Winと呼びます.ここでは単にexeGCC-CQ版と呼びます.
exeGCC評価版とは…
→CQ RISC評価キット/SH-4
に付属のコンパイラです.
Q1.
exeGCC-CQ版 および exeGCC評価版は,他のCPUボードで動作させるプログラムの開発に使用してもよいでしょうか?A1.
キット付属のコンパイラは,そのCPUボード上で動作させるプログラムを開発するためにご使用ください.他のCPUボード上で動作させるプログラムを開発することは,添付のソフトウェア使用許諾書に違反します.
Q2.
exeGCC-CQ版 および exeGCC評価版に共通した制限は何でしょうか?A2.
ユーザープログラムの配置アドレス空間を,キット付属のCPUボードのRAM領域(CqREEK/SH-4の場合はSDRAM領域)に固定しています.他のアドレス空間,たとえばROMアドレス空間で動作するプログラムを開発できません.よってROM化ができないことを意味します.
ROM化をサポートしたコンパイラでプログラムを開発されたい場合は,京都マイクロコンピュータから発売されている,exeGCCの製品版をご購入していただくことをおすすめしています.詳しくは,京都マイクロコンピュータへご質問ください.
京都マイクロコンピュータ(株)
TEL(075)953-0963
FAX(075)953-0935
Q3.
exeGCC-CQ版 および exeGCC評価版のライブラリ関数にはどのようなものがあるのでしょうか? また,printfなどの関数がある場合は,どこに対して表示されますか?A3.
基本的にはANSI Cに準拠しています.ライブラリ関数の一覧を以下に示します.
- メモリ管理ライブラリ
- malloc,realloc,free,calloc
- メモリ操作
- memset,memcpy,memmove,memcmp,memicmp,memchr,memccpy,setmem,movemem
- 文字列処理
- strcpy,strncpy,strcmp,strncmp,strcat,strncat,strlen,strchr,strrchr,strstr,strspn,strcspn,strpbrk,strtok,strcmpi,stricmp,strncmpi,strnicmp,strdup,strlwr,strupr,strrev,strset,strnset,strerror
- 文字処理
- touuper,tolower,_toupper,_tolower,toascii,__toascii,isalpha,isupper,islower,isdigit,isspace,isalnum,iscntrl,isgraph,isprint,ispunct,isxdigit,isascii,iskanji
- データ入出力
- putchar,getchar,puts,gets,printf,sprintf,scanf,sscanf
- 数学関数
- sin,cos,tan,asin,acos,atan,atan2,sinh,cosh,tanh,log,log10,exp,pow,sqrt,fabs,fmod,ceil,floor,modf,frexp,ldexp,matherr
- 可変引き数
- va_start,va_arg,va_end
- その他の関数
- abs,labs,_max,_nin,div,ldiv,atoi,atol,atof,strtol,strtoul,strtod,ecvt,fcvt,gcvt,itoa,ltoa,ultoa,rand,srand,qsort,bserch,assert,abort
データ入出力系の関数での出力結果は,デバッガのコマンドウィンドウに表示されます.また,入力系の関数はホストパソコンからのキーボード入力となります.
さらに,CQ RISC評価キットシリーズにおいて,I/O空間をもっているV821以外は,I/Oデバイスをメモリ空間に配置するメモリマップドI/Oになっています.これらのCPUではメモリポインタを使ってI/Oレジスタにアクセスするので,I/O入出力関数は不要です.
Q4.
exeGCC-CQ版 および exeGCC評価版で,アセンブラまたはインラインアセンブラは使用できますか?A4.
CqREEKシリーズは,基本的にC言語での開発を念頭に置いています.よって製品付属のマニュアルについても,アセンブラによる開発方法やアセンブラの制御/疑似命令,アセンブル手順,C言語の中にインラインでアセンブラを記述する場合の記述方法などの説明を入れておりません.
だからといって,インラインアセンブラや,アセンブラによる関数をリンクすることができないわけではありません.事実,割り込み処理の一部はアセンブラによる記述が必要な部分があります.
実際の記述方法などは,付属のサンプルプログラム,またはInterfaceに掲載された記事などを参照してください.
Q5.
exeGCC-CQ版 および exeGCC評価版ではx86系コンパイラにあるようなinterrupt修飾子はないのでしょうか? 割り込みを使うにはどうすればよいのでしょうか?A5.
exeGCC-CQ版 および exeGCC評価版ではinterrupt修飾子はサポートしておりません.よって割り込み制御の部分に関してはアセンブラの記述が必要になります.
実際の記述方法などは,付属のサンプルプログラム,またはInterfaceに掲載された記事などを参照してください.
Q6.
exeGCC-CQ版 および exeGCC評価版でよく聞く“疑似ROM化”とは何ですか?A6.
CqREEK/SH-1/SH-3/SH-4,CqREEK/V821やCqREEK/Vr4300は,CPUボードにROMエミュレーション機能などがありません.
よって,ROM領域に対してユーザのプログラムをダウンロードしたり,ブレークポイントを設定してデバッグを行うことができず,すべてCPUボード上のRAM領域に対してのみ行うことができます(CqREEK/SH-4はROM領域にブレークポイントを設定することは可能).
このようにデバッグがRAM領域に対してしか行えないので,同梱されているコンパイラであるexeGCC-CQ版またはexeGCC評価版では,ROM化のサポートを考えていません.
しかし,せっかく製作したアプリケーションを動作させるのに,いちいちパソコンと接続してプログラムをダウンロードする必要があるのは面倒ですね.
そこで,次のような方法で,ROM化をサポートします.作成したプログラムがRAM領域でしか動作しないのであれば,電源を切っても揮発しないようにROMに格納し,電源ONで動作が開始されたらROMからRAMにプログラムを転送してRAM上で実行を開始する,という仕掛けです.
プログラムはROMでは動作できませんからRAMに転送して動作します.しかもプログラムはROMに格納されているので電源を切っても消えません.これを本キットでは“疑似的ROM化”と呼んでいます.
CqREEK/SH-1/SH-3,CqREEK/V821,CqREEK/Vr4300の疑似ROM化ツールは,ここからダウンロードできます.CqREEK/SH-4についてはキットに標準添付されています.
Q7.
メモリ割り当て関数である malloc() の動作がおかしいようです.実装メモリより大きなメモリサイズを要求しても,正常にメモリが確保されたかのような値を返してきます(まさか仮想記憶が??).A7.
パソコン上などではOSが存在するため,malloc()関数はOSに問い合わせることで空きメモリを確保できます.しかし本キットが想定している環境にはOSが存在しないので,空きメモリ空間やサイズを知る手だてがありません.そこでソース上に確保できるメモリ空間を明示的に指定します.以下のプログラムを参照してください.#include <stdio.h> main() { int i,l; char *buffer; /* 0x80001000 から3Mバイトをheapに割り当てる */ _m_init(0x80001000,0x300000); ←CPUボードのメモリマップに合わせ任意に設定 i=0x100000; if ( (buffer=(char *)malloc(i)) == NULL ) { printf("malloc error!!\n"); } else { for(l=0;l<i;;l++){ *(buffer+l)=0xaa; } } }
Q8.
Cプログラムで浮動小数点演算をした場合は,CPU内蔵のFPUが使われますか?(もちろんFPU未搭載のCPUはソフトウェアライブラリで演算するでしょうが) また三角関数などの超越関数はどうでしょうか? さらに積和演算をさせた場合,専用命令が割り当てられ高速に実行してくれるでしょうか?A8.
浮動小数点演算については,CPUにFPUがあればそれを使用して高速に計算します.V821やVr4300,SH-4は浮動小数点演算をFPUで計算します.超越関数の演算にはソフトウェアライブラリを使います.
また積和演算に関しても,Cでプログラムする限りにおいてはソフトウェアによる演算となります.SHシリーズなどでMAC命令による高速積和演算をさせたい場合は,アセンブラで記述する必要があります.
Q9.
WORDPADでプログラムを書いてコンパイルするとエラーがでます.NOTEPADでプログラムを書いてコンパイルすると正常にコンパイルできます.なぜでしょう?A9.
WORDPADやNOTEPADでプログラムを入力されているのですか? 秀丸やWzエディタ,MIFES for Windowsといったような“テキストエディタ”を使われることを“強く”おすすめします.
エラーの出た原因は,コンパイルしようとしたソースがないのではっきりしたことはいえませんが,WORDPADはワープロ機能を装備したアプリケーションなので,飾り文字の属性コードが入ったり,全角文字を入れてしまった可能性が考えられます.
Q10.
次のようなプログラムをコンパイルすると,エラーが出てコンパイルできません.
(途中略) if (buffer[i-13] == 15) { (中省略) } if (buffer[i-13] == 3) { (中省略) } if (buffer[i-12] == 25) { (中省略) } if (buffer[i-12] == 10) { (中省略) } if (buffer[i-12] == 9) { (中省略) } if (buffer[i-11] == 50) { (中省略) } (このようなif文が数百行にわたって記述されている)A10.
“文法的に間違いがない”のと“実際にコンパイルできるかどうか”は別問題である場合が多々あります.コンパイラがソースを解釈中にメモリがなくなってコンパイルできなくなっているようです.一つの関数が長すぎる場合や,forやifなどのネストが深すぎるとコンパイルできない可能性が高くなります.プログラムの構造を見直してください.
またオプティマイズレベルをあげていると,最適化できるかどうかをあれこれ考えるためメモリが足らなくなって落ちる場合もあるようです.
SH-1やV821用のexeGCCは,DOSエクステンダにより内部メモリを確保していますが,仕様的にあまり大きなメモリを確保できません.これも原因の一つです.SH-3やVr4300用のexeGCCはWin32アプリとして動作するので,SH-1やV821よりは広いメモリを使ってコンパイルができるぶん,このようなコンパイルエラーの発生は少ないでしょう.
Q11.
次のようなバッチファイルでコンパイルすると,正常にコンパイルできません.
gcc -g -c -v -O1 TEST.C
A11.
GNU Cのコンパイラドライバの仕様で,大文字の拡張子が指定されると,C++のソースであると判定してしまいます.バッチファイルの中に記述しているコンパイルファイル名のファイル名の記述を小文字にしてください.
Q12.
exeGCC-CQ版 および exeGCC評価版ではデフォルトがビッグエンディアンだと思いますが,リトルエンディアンはサポートしていますか?A12.
exeGCC-CQ版 および exeGCC評価版のデフォルトはビッグエンディアンです.SH-3やSH-4などのように,エンディアンを変更できるCPUもありますが,exeGCC-CQ版 および exeGCC評価版ではサポートしていません.
Q13.
同じアドレスのレジスタへ数回連続してコマンドを書き込むプログラムを作成しました.しかしコンパイル後のアセンブラを見ると,最後の1回しか書き込み動作を実行していないようです.なぜこのようにコンパイルされてしまうのでしょうか?A13.
gccは全般的に,変数は変わりやすくない(volatileではない)という設定がデフォルトになっています.よって同じアドレスに対してのアクセスは,最適化によって最後のアクセスだけがコードに変換されます.レジスタへのアクセスを正しくコードに落とすには,たとえば次のように記述します.stat=*(volatile unsigned char *)IRQ_CTRL; *(volatile unsigned char *)IRQ_CTRL=stat & 0xfe; *(volatile unsigned char *)IRQ_CTRL=stat | 0xff;また書き込みだけでなく,グローバル変数を介して割り込み処理ルーチンとフラグをやりとりする場合も注意が必要です.たとえば int_flg がグローバル変数で,割り込みルーチン内で-1が代入されるとしましょう.メインルーチンではint_flg = 0; while ( int_flg != 0 );のようにウェイトしているとします.ところがこのプログラムは最初に int_flg の内容をリセットした後は,int_flg の内容が格納されているメモリをアクセスせずにループします.これでは割り込みルーチンで int_flg の内容を書き換えても,CPUのレジスタの内容は変わりませんから,無限ループに陥ってしまいます.これも変数を宣言するときに volatile をつけて,値が変化する可能性があるから参照するたびにメモリから読み込むように指示します.
Q14.
エラーが多いとエラーメッセージがスクロールしてしまってよくわかりません.エラーメッセージを止める方法などはないでしょうか?A14.
リダイレクトなどでテキストファイルにログファイルを出力するなどの方法はどうでしょうか?
Q15.
京都マイクロコンピュータの製品版のexeGCCをインストールしているマシンに,exeGCC-CQ版やexeGCC評価版などをインストールして問題ないでしょうか?A15.
本キット付属のコンパイラは製品版をインストールしたパソコンにはインストールしないでください.逆に本キット付属のコンパイラをインストールした後に製品版をインストールしないでください.コンパイラの設定がおかしくなってしまいます.
一つのマシンにはどちらかのコンパイラしかインストールできません.
Q16.
printfなどの関数はPARTNERのコマンドウィンドウに対して表示されるとありますが,SH-3やSH-4およびVr4300用のexeGCCでは,gets()関数などのコンソール文字列入力関数が正常に動作しないようです.原因は何でしょうか?A16.
申し訳ありません.コンソール入出力関数の一部に問題がありました.ライブラリのバージョンアップ版を公開しました.ここから説明を読んで新バージョンのライブラリをダウンロードしてください.
Q17.
Q3を見たのですが,open() や fopen() などのファイル入出力関数はないのでしょうか?A17.
CQ RISC評価キットシリーズのCPUボードには標準ではOSを用意していませんし,またファイルシステムも搭載していません.よってファイル入力ライブラリも用意されていません.
Q18.
exeGCC-CQ版やexeGCC評価版の出力コード形式は何でしょうか?A18.
CQ RISC評価キット/SH-1/SH-3/V821/Vr4300付属のexeGCC-CQ版は aout形式(より正確にはSH-3用が coff形式,Vr4300用が ecoff形式),CQ RISC評価キット/SH-4は ELF形式 となっています.コンパイル後のファイル名はどちらも ????.out となります.
ただし,本キットのコンパイラは本キット付属のデバッガでダウンロードおよびデバッグすることを想定しているので,aout形式およびELF形式を保証するものではありません.
Q19. Up Date!
キットにはコンパイラについての簡単なマニュアルしかついていないようですが,もっと詳しい日本語の詳しい解説書などはないでしょうか?A19.
GCCの日本語のマニュアルといえば,こちらの“私的 GNU マニュアル翻訳プロジェクト”のページが有用かと思われます.
また,Interface2002年8月号から,GNU系ツールの使い方を解説した連載が始まっています.ここでGCCについて解説されているので,こちらも参考になるかと思います.
Q20. New!!
キット付属のgccは制限があると聞きましたが,これはCQ RISC評価キット/SH-4PCI with Linuxも同様でしょうか?A20.
こちらのキットに添付されているgccには制限はありません.