ブログ移転しました。新しいサイトはこちらです。
http://eng-notebook.com/blog-entry-79/
1秒後に自動的にジャンプします。
  

  


SDCCでEZ-USB(8051)開発 Keilコンパイラからの移植


 
 
Keil μVision試用版でEZUSB FX2LPの開発をしてたんですが、試用版の4KBの壁にぶつかってしまい、別のコンパイラに移植する事にしました。

今回使ったのはSDCCというオープンソースのコンパイラです。
SDCC - Small Device C Compiler


公開されているSDCCには2.x版と3.x版があります。
Keil C51コンパイラ(μVisionに付属の8051コンパイラ)からの移植を考えると、2.x版の方が若干楽です。

Keil C51コンパイラにはANSI-Cに無い独自キーワードとして
 bit
 sfr
 sbit
 interrupt
 xdata
 code
などが用意されています。

SDCC 2.xではこれらをそのまま使用する事が出来ます。

補足

SDCC 3.xではANSI-Cに無いキーワードには__(アンダースコア2つ)を先頭に付ける必要があります。

つまり、SDCC 3.xでは
 __bit
の様に書かないといけません。

まぁ、#define bit __bitの様にすればいいんですけどね。

ちなみに、この__を付けたキーワードはSDCC 2.xでも使用する事が出来ます。どちらでも使える2.xから、3.xでは『ANSI-Cに無いキーワードは“__”を付ける』と厳格化されたという事でしょうね。


なので、今回はSDCC2.9.0を使う事にしました。
μVisionからSDCC 2.9.0に移植する際のポイントは以下の通りです。


_at_の記述


Keil C51コンパイラでは

int hoge _at_ 0x1000;

と書きますが、SDCCでは

int __at (0x1000) hoge;

と書きます。


fx2regs.hなど_at_を使用しているファイルは全てこの形式に書き直します。


sfr, sbitの記述


sfr,sbitも同様に書き換えが必要です。

Keil C51コンパイラでは

sfr hoge = 0x80;

と書きますが、SDCCでは__atを使って

sfr __at (0x80) hoge;

と書きます。


fx2regs.hなどsfr,sbitを使用しているファイルは全てこの形式に書き直します。


interruptの記述


Keil C51コンパイラでは割り込みルーチンを記述する際に、全ての割り込みルーチンをinterrupt 0指定する事が可能です(割り込みテーブルを自動生成しない場合)。

SDCCでは、割り込み番号の重複が許されないので全ての割り込みルーチンにユニークな番号を付ける必要があります。

また、main()のあるファイル中に割り込みルーチンの定義か宣言が必要になる様です。割り込みルーチンを別ファイルに記述した際には割り込みルーチンのextern宣言をmain()のあるファイルに書けば(もしくは、extern宣言したヘッダをincludeすれば)OKです。


バイトオーダー


Keil C51コンパイラはBig-Endian、SDCCはLittle-Endianでコードを生成します。
これがKeil C51コンパイラとSDCCの一番大きな違いです。

記述方法が違うだけなら、Syntax errorが出ますから簡単に修正できるんですが、バイトオーダーの違いによるものはコンパイラじゃ検出できませんからね。

これが問題になるのは、外部機器との通信データ処理や、intやlongなどを共用体でcharに分割する場合などです。


ライブラリの移植


μVisionとSDCCではライブラリに互換性はありません(そもそもバイトオーダーも違いますしね)。ですので、ライブラリなどは再ビルドする必要があります。

EZ-USBの場合、ezusb.libというライブラリが付属しています。このライブラリもSDCCで再ビルドする必要があります(ソースはezusb.libと同じディレクトリにあります)。


アセンブラの記述


Keil A51アセンブラ(μVisionに付属のアセンブラ)とasx8051(SDCC 2.9に付属のアセンブラ)では若干、描き方が違います。詳しくは、SDCCのドキュメントを参照してください。


ディスクリプタの配置アドレス


EZ-USBでは_DeviceDscrなど、ディスクリプタのデータは偶数アドレスに配置する必要がありますが、SDCCではそれをリンカに指定する術がありません。

そこで、.orgディレクティブを使って絶対アドレスを指定し、偶数アドレスに配置しました。




今回の移植に当たり、こちらのサイトを参考にさせて頂きました。有益な情報ありがとうございます。
sdccKnowHow (Japanese)
Fenrir's BLog: EZUSB FX2LP Keilからsdccへ


追記

Keil以外ではIAR Systemsから8051のIDE(統合開発環境)がでています。こちらは、一ヶ月間フル機能が使える評価版がありますので、開発期間が一ヶ月以内ならこちらを使うのもいいかもしれません。
一ヶ月間フル機能が使える8051開発環境 IAR Embedded Workbench for 8051評価版





Sponsored Link


 
◆◇◆この記事が役に立ったらポチッとお願いします◆◇◆

 

テーマ : ソフトウェア
ジャンル : コンピュータ

コメントの投稿

非公開コメント

No title

Win7上のEclipse+cdt+sdcc+gputilsでAT89S52(MPU51)のプログラムを作りたい者です。
日本語での情報を見つけることが、なかなかできず困っていた所でこのページを見つけました。
自分の環境(cdt)では、sbit/sfrが「構文エラー」と言われ原因が判りません。
どこかハマるところ心当たりが有りましたら教えて頂きたいです。

Re: No title

> 自分の環境(cdt)では、sbit/sfrが「構文エラー」と言われ原因が判りません。
SDCCのバージョンは何ですか?
もし、3.x.xを使用されているのでしたら、記事中にも書いているようにANSI-Cに無いキーワードには__(アンダースコア2つ)を付ける必要があります。

なので、sbit/sfrではなく__sbit/__sfrと書いてみてください。

詳しくは、SDCCマニュアルで。
http://sdcc.sourceforge.net/doc/sdccman.pdf
おすすめ







 



カテゴリ