|
▲gccおよびKPIT使用における承諾事項
・ |
GNU/gccおよびKPITに関するTel/Faxでのご質問に関してはお受けできませんが、メールでのご質問に関してはお答えするよう努力はします。ただし都合によりお答えできない場合もありますので予めご了承願います。 |
・ |
GNU/gccおよびKPIT関連ソフトの不具合が発見された場合の対応義務はありません。また、この関連ソフトの使用方法に関する質問の回答義務もありませんので承知の上ご利用下さい。 |
・ |
ソースデバッグ可能にする為のツール(シンボルコンバータ)は、GNUおよびKPITより公開された資料を参考にして作成しましたが、資料に記述されていないDwarfコードもありました。弊社としては出来る限りシンボルデバッグ可能にする為、分析により対応させていますが、C記述の書式の相違により、更に資料外のDwarfコードが出力される可能性があります。この場合、当ソフトの利用ユーザはシンボル不可の部分を抽出したソース及び結合オブジェクト(*.x/*.coff/*.elf)を提出して頂く協力を希望します。
より良いデバッガにする為、解決に出来る限りの努力をしますので協力の程よろしくお願い致します。
|
▲KPIT/GNU
・KPITのインストール方法に関する資料は作成しておりません。
・KPIT利用によりH-debuggerを使用する場合は、シンボルコンバータ「GCsymcon」が必要です。【VerUP】よりダウンロードして下さい。
・KPIT利用によりH-debuggerを使用する場合は、DEFバージョンを「6.00A」以上にして下さい。
・KPITで作成したソフトは、構造体・ローカル変数・配列等の対応が可能になります。
【注意事項】
・R8Cシリーズには対応していません。
▲KPIT使用におけるHow to
・ |
「long long」64bit宣言における注意事項(GCsymconv.exe[Ver2.00Aより対応]) KPIT-v1101までの確認事項
関数の引数に「long long a」等の数値を渡した場合、シンボル情報のフレームベースのオフセット値に不具合があるため、関数内部のローカル変数を正しく評価できません。対策として「long
long *a」のポインタ変数で渡すようにすれば正しく評価できます。
|
・ |
初期値のROM−>RAMへのコピーする設定方法が判りましたので、全説明書を改訂する。(Rev1.10)
1)「char string[]="Hello"」の場合は、RAM側に割り振られる。
2)「const char string[]="Hello"」の場合は、ROM側に割り振られる。
|
・ |
ビルド実行時に時々ライブラリが存在しているにも関わらず「NotFound」とエラー判定してしまう時がありました。
結果論的ですが、どうもWinFM等のファイラーが常駐しているとエラー判定してしまうようです。
|
・ |
関数内のローカル変数を参照する場合は、関数内の第一行目以降まで実行させてから参照して下さい。
|
・ |
関数内で2次元以上のローカル構造体を宣言するとシンボル情報が消滅する場合がありました。
例)
typedef struct {
char dt1;
short dt2;
} TEST;
// function
void func() {
TEST test[2][10];
......
} |
▲Cygwin
Cygwin+gccに関するHow to & FAQ |
付属CDのGNU/gccインストール方法
サービスパッケージのバージョンは、以下の通りです。
Cygwin関係 |
|
|
2.249.2.5 |
1.3.12-4 |
20020731-1 |
3.79.1-7 |
|
GNU/gcc関係 |
|
|
|
Cygwinは、 RedHatで行われているプロジェクトで、GNUツール(gcc等)をWindows上で動かすことを可能にするものです。
▲as(H8/300H & H8S)
・ |
アセンブラのソース表示デバッグは可能ですか?
GNUの場合は、ラインアドレス情報を得る方法がわかりません。弊社はC言語でのインラインASMでの方法を取っています。
サンプルをご覧下さい。 |
・ |
ldc.w @er1,ccr をasでアセンブリると、コードがldc @er0,ccrになります。
as(アセンブラ)のバグです。ソースオペランド側が@er0の場合は、問題ないのですが@er1->@er7の場合、@er0のコードを発生してしまいます。対策は、機械語を直接入力するしかありません。
例
word 0x0140,0x6910 ; ldc.w @er1,ccr
です。
なお、デスティネーションオペランドがexrの場合も同じ現象がでます。 |
・ |
dmac er0,maclをasで正しくアセンブリできません。
as(アセンブラ)のバグです。
対策は、機械語を直接入力するしかありません。
例
word 0x0320 ; ldmac er0,mach
です。
なお、デスティネーションオペランドがmaclの場合も同じ現象がでます。 |
・ |
stmac mach,er0をasで正しくアセンブリできません。
as(アセンブラ)のバグです。
対策は、機械語を直接入力するしかありません。
例
.word 0x0220 ; stmac mach,er0
です。
なお、デスティネーションオペランドがmaclの場合も同じ現象がでます。 |
▲as(SH-2)
・ |
アセンブラのソース表示デバッグは可能ですか?
GNUの場合は、ラインアドレス情報を得る方法がわかりません。弊社はC言語でのインラインASMでの方法を取っています。
サンプルをご覧下さい。 |
・ |
mov.l r0,@(15,r1)をasで正しくアセンブリできません。
as(アセンブラ)のバグです。
対策は、機械語を直接入力するしかありません。
例 .word 0x110f /* mov.l r0 ,@(15,r1 ) */です。
なお、レジスタ名が違うパターンでも正しくアセンブリできません。 |
・ |
mov.l @(2,r0),r1をasで正しくアセンブリできません。
as(アセンブラ)のバグです。
対策は、機械語を直接入力するしかありません。
例 .word 0x510f /* mov.l @(2,r0 ),r1 */です。 なお、レジスタ名が違うパターンでも正しくアセンブリできません。 |
▲gcc
How to |
H8 |
|
CPUは以下のスイッチで選択されます。
H8/300 -------> 無し
H8/300H ------> -mh
H8S ----------> -ms |
浮動小数点演算は、スタックエリアを使用しています。256byteぐらい確保して下さい。 |
long double/doubleで変数宣言しても4Byteのfloating pointにまとめられてしまいますので注意してください。 |
SH-2 |
|
CPUは以下のスイッチで選択されます。
SH-2 ------> -m2
|
浮動小数点演算は、スタックエリアを使用しています。512byteぐらい確保して下さい。 |
long doubleで変数宣言しても8Byteのdoubleにまるめられますので注意してください。 |
・ |
#define文が複数行になる場合は、”\”記号でつないだ記述をしていましたが、最近OSを変えたらエラーがでます。
WindowsXpでこの現象がでてきました。Windows98/2000ではこの症状がでていませんでした。
対策としては、gcc(Ver2.95.2)をバージョンUPするか、下記のようにソースを書き換えて下さい。
<従来の記述>
#define disable() asm(" mov.l r0,@-r15 "); \
asm(" stc sr,r0 "); \
asm(" and #0x0f,r0 "); \
asm(" or #0xe0,r0 "); \
asm(" ldc r0,sr "); \
asm(" mov.l @r15+,r0 ")
<記述変更例>
#define disable() asm("mov.l r0,@-r15;stc sr,r0;and #0x0f,r0;or #0xe0,r0;ldc r0,sr;mov.l @r15+,r0") |
・ |
const Uchar S1cmd[] = {"\x02D1command\x03"}; このステートメントが正しくコンパイルできません。
文字列中の¥xnnn(16進数表記)は、gccでは桁数が決めてないようです。ですから、gccは¥x02D1Cまで数値化しようとします。これを防ぐ方法は、
const Uchar S1cmd[] = {"\x02""D1command\x03"};
このような記述にして下さい。 |
・ |
関数のフレームポインタ部分を削除したいのですが、どうしたらいいですか?
コンパイル時に"-fomit-frame-pointer"を指定して下さい。 |
・ |
C言語用に作成した"#define"のマクロ名をインラインアセンブラでも使用したいのですが、どうしたらいいですか?
このように記述して下さい
例
#define MONJMP 0x200
asm("jmp @%c0 ":: "g" (MONJMP)); /* jmp @0x200 */
になります。 |
・ |
ある変数を単独で、別アドレスに指定したいのですが、どうしたらいいですか?
その変数のセクション名を別に定義した後、ロケート用のスクリプトファイルにアドレスを定義して下さい。
例
const short TBL[0x20] __attribute__ ((section (".envtbl"))) =
{
};
[ロケート スクリプトファイル *.x]
.envtabl 0xffe0a0 : { *(.envtbl) _eenv = . ;}
これで、"TBL"は0xffe0a0番地に割り振られます。 |
・ |
関数と関数の間に、"nop"を4個挿入したいのですが、どうしたらいいですか?
インラインアセンブラで対応して下さい。
例
#define Nop4() asm("nop\n nop\n nop\n nop\n"); // Pre facth Break
対策
/********************************************************/
void Aproc {
}
Nop4();<-----------ココ
/********************************************************/
void Bproc {
} |
・ |
グローバル変数を直接レジスタに割り振りたいのですがどうしたら良いですか?
このように宣言してください。
register long Moniter asm("r14");
これはSH-2の例ですが、Monitor変数をレジスタR14に割り振った事になります。
|
▲link(ld)
How to |
H8 |
|
CPUのアーキテクチャの指定が必要です。
H8300 -------> OUTPUT_ARCH(h8300)
H8300s ------> OUTPUT_ARCH(h8300s)
H8300h ------> OUTPUT_ARCH(h8300h) |
SH-2 |
|
CPUのアーキテクチャの指定が必要です。
SH-2 -------> OUTPUT_ARCH(sh) |
・ |
GNU/gccでモニターエリア0x200〜0x7FF番地を空けるにはどうしたらいいですか?
下記ファイルは、セクションごとのグループ指定および、アドレスを指定する定義ファイルです。
このファイルは、LDコマンド(リンクエディタ)の時に使用します。
|
file "h8s261x.x"
1: OUTPUT_FORMAT("coff-h8300")
2: OUTPUT_ARCH(h8300S)
3:
4: SECTIONS
5: {
6: .vect 0x0 : { *(.vector) ; }
7: .rom 0x800 : { *(.text) *(.rodata) *(.string) _etext = . ; }
8: .const . : { *(.data) _edata = . ;}
9: .bss 0xffe000 : { *(.bss) *(COMMON) *(.stack) _end = . ; }
10: }
11:
|
このように、”. rom 0x800”と指定するだけでモニタエリアの確保ができます。
詳細説明は、弊社製”H8S用の実践解説テキスト”をお読みください。 |
・ |
link(ld)実行後の結合オブジェクトファイルをもとに、逆アセンブラ情報がほしいのですが?
GNUツールの中の”objdump”を使ってください。
|
例)
オブジェクトファイルを”abc.coff”
逆アセンブラファイルを”abc.uasm”としますと、
h8300-hms-coff-objdump -d -S -l abc.coff > abc.uasm
です。 |
|
▲make
makeを実行したのにMakefileを読込まない。
デフォルトMakefile名は、大文字,小文字を区別して必ず"Makefile"として下さい。
▲その他
link(ld)実行後、不必要なアドレス部分を削除する方法がありますか?
objcopyのスイッチ「-R セクション名」を指定することで実現できます。
|
例)
objcopy -R .bss0 -Osrec $A.coff $*.mot
この例ですと、「.bss0」セクション名(0x400000番地に割付)の部分がHEXファイルより削除されます。 |
|
|