Appendix: FM3基板 Cortex-M3開発環境の構築 ■ 方針 ・開発用ホストとして debian6.0 squeeze (以下 squeezeと記載)を使用する。PCにsqueezeをインストールするか、仮想PCエミュレータを用いて squeezeを準備する ・ツールチェインのソースはなるべく debian のものを使う ・target=arm-none-eabi ・prefix=/usr/local/gnu あらかじめ /usr/local/gnu/bin に PATH を通しておく (~/.bash_profile に記述するなりして) $ は一般ユーザのプロンプト、 # はrootユーザのプロンプトを意味する。# で示すコマンドは rootユーザになって作業する。 ■ debianでの必要なパッケージのインストール -------------------------------------------------- $ su - # apt-get update # apt-get build-dep gcc binutils # apt-get install unzip libboost-dev libboost-system-dev \ libboost-filesystem-dev libboost-program-options-dev -------------------------------------------------- ■ binutils ソース取得 -------------------------------------------------- $ mkdir binutils-work $ cd binutils-work $ apt-get source binutils -------------------------------------------------- ビルド -------------------------------------------------- $ mkdir build $ cd build $ ../binutils-2.20.1/configure --target=arm-none-eabi --prefix=/usr/local/gnu \ --enable-interwork --enable-multilib $ make -j8 インストール -------------------------------------------------- $ su - # make install -------------------------------------------------- ■ newlib ソース取得 -------------------------------------------------- # apt-get install newlib-source # cd /usr/src/newlib # tar xf newlib-1.18.0.tar.lzma -------------------------------------------------- ■ gcc-4.4 ソース取得 -------------------------------------------------- $ mkdir gcc-work $ cd gcc-work $ apt-get source gcc-4.4 $ cd gcc-4.4-4.4.5 -------------------------------------------------- パッチをあてる -------------------------------------------------- $ export GCC_TARGET=armel $ ./debian/rules control -------------------------------------------------- ソースに移動して newlib の symlinkを作る -------------------------------------------------- $ cd src $ ln -s /usr/src/newlib/newlib-1.18.0/newlib/ . -------------------------------------------------- ビルド -------------------------------------------------- $ cd ../ $ mkdir build $ cd build $ ../src/configure --target=arm-none-eabi --prefix=/usr/local/gnu \ --enable-interwork --enable-multilib --enable-languages="c,c++" \ --with-newlib --disable-nls --with-system-zlib $ make -j8 インストール -------------------------------------------------- $ su - # make install -------------------------------------------------- ■ newlib ビルド -------------------------------------------------- $ mkdir newlib-work $ cd newlib-work $ export CFLAGS_FOR_TARGET='-DREENTRANT_SYSCALLS_PROVIDED -mlittle-endian -mcpu=cortex-m3 -Wl,--build-id=none -mthumb' $ /usr/src/newlib/newlib-1.18.0/configure --target=arm-none-eabi --prefix=/usr/local/gnu \ --enable-interwork --enable-multilib --disable-libssp --disable-nls $ make -------------------------------------------------- CFLAGSに -DREENTRANT_SYSCALLS_PROVIDED を付けると、syscall.c を自作する意味になる。FM3は cortex-m3 なので -mcpu=cortex-m3 も必要となる。 インストール -------------------------------------------------- $ su- # make install -------------------------------------------------- 出来あがった arm-none-eabi-gcc がコンパイラとなる。 ■ Toppers/ASP 本誌2012年7月号P82を参考に、少し手順を変更している。 ソースの取得 Toppersの公式サイトから http://www.toppers.jp/asp-kernel.html 開発成果物 → STBEE(Strawberry Linux)簡易パッケージ asp_stbee_gcc-20120310.tar.gz gcc版 を取得 FM3対応のための追加 本誌2012年7月号 付録DVDから、 \IF1207\MP3\asp_cqbbel_mp3.zip を取り出す。上記2つのファイルを作業ディレクトリに置く -------------------------------------------------- $ mkdir asp_work $ cd asp_work/ $ ls asp_cqbbel_mp3.zip asp_stbee_gcc-20120310.tar.gz -------------------------------------------------- Toppers/ASPソースの展開 -------------------------------------------------- $ unzip asp_cqbbel_mp3.zip asp_cqbbel_mp3 `-- asp `-- target `-- cq_frk_fm3_gcc ↑が必要 $ tar xzfv asp_stbee_gcc-20120310.tar.gz 展開すると asp/ が出てくるので cq_frk_fm3_gcc を asp/target/ にコピーする $ cp -a asp_cqbbel_mp3/asp/target/cq_frk_fm3_gcc/ asp/target/ -------------------------------------------------- cfgのビルド ビルドするときは必ず -O0 でビルドする。でないとcfgはビルドできるが実行時に Segmentation fault する -------------------------------------------------- $ cd asp/cfg $ ./configure Makefile.configのLIBBOOST_SUFFIX=を少し直す LIBBOOST_SUFFIX=.so.1.42. 変更前 LIBBOOST_SUFFIX= -------------------------------------------------- ディレクトリの奥から順にビルドしないとうまくいかない -------------------------------------------------- $ cd toppers/itronx/ Makefile の -O2 を -O0 に変更、-I../../ を追加 CPPFLAGS := $(CPPFLAGS) -I$(BOOST_DIR) -I$(PROJDIR) -I../../ CXXFLAGS := $(CXXFLAGS) -O0 -g $ make -j $ cd ../ 同様に Makefile の -O2 を -O0 に変更 $ make -j $ cd ../ 同様に Makefile の -O2 を -O0 に変更 $ make -j -------------------------------------------------- FM3ターゲットの向けのソース変更 gccのプリフィックス変更 target/cq_frk_fm3_gcc/Makefile.target -------------------------------------------------- GCC_TARGET = arm-none-eabi -------------------------------------------------- binutils-2.20 のクセを直す target/cq_frk_fm3_gcc/cq_frk_fm3_rom.ld に追加 -------------------------------------------------- .ARM.attributes 0 : { *(.ARM.attributes) } -------------------------------------------------- target/cq_frk_fm3_gcc/Makefile.target に -Wl,--build-id=none を追加 -------------------------------------------------- COPTS := $(COPTS) -mlittle-endian -mcpu=cortex-m3 -Wl,--build-id=none -------------------------------------------------- シリアルの変更 サンプルではシリアルが同時には1chしか動かないので、3ch同時に動くようにする target/cq_frk_fm3_gcc/target_serial.cfg -------------------------------------------------- /* * SIOドライバ(cq_frk_fm3用)のコンフィギュレーションファイル */ #include "target_serial.h" ATT_INI({ TA_NULL, 0, sio_initialize }); /* 属性, 引数, IRQ番号, 関数, 優先度 */ ATT_ISR({ TA_NULL, 1, INTNO_SIO_RX1, sio_rx_isr, 1 }); ATT_ISR({ TA_NULL, 1, INTNO_SIO_TX1, sio_tx_isr, 1 }); ATT_ISR({ TA_NULL, 2, INTNO_SIO_RX2, sio_rx_isr, 1 }); ATT_ISR({ TA_NULL, 2, INTNO_SIO_TX2, sio_tx_isr, 1 }); ATT_ISR({ TA_NULL, 3, INTNO_SIO_RX3, sio_rx_isr, 1 }); ATT_ISR({ TA_NULL, 3, INTNO_SIO_TX3, sio_tx_isr, 1 }); /* IRQ番号, { 属性, 優先度} */ CFG_INT(INTNO_SIO_RX1, { TA_ENAINT|INTATR_SIO, INTPRI_SIO }); CFG_INT(INTNO_SIO_TX1, { TA_ENAINT|INTATR_SIO, INTPRI_SIO }); CFG_INT(INTNO_SIO_RX2, { TA_ENAINT|INTATR_SIO, INTPRI_SIO }); CFG_INT(INTNO_SIO_TX2, { TA_ENAINT|INTATR_SIO, INTPRI_SIO }); CFG_INT(INTNO_SIO_RX3, { TA_ENAINT|INTATR_SIO, INTPRI_SIO }); CFG_INT(INTNO_SIO_TX3, { TA_ENAINT|INTATR_SIO, INTPRI_SIO }); -------------------------------------------------- target/cq_frk_fm3_gcc/target_serial.h -------------------------------------------------- /* * SIOの割込みハンドラのベクタ番号 */ #define INHNO_SIO_RX1 IRQ_VECTOR_MFS4RX #define INHNO_SIO_TX1 IRQ_VECTOR_MFS4TX #define INTNO_SIO_RX1 IRQ_VECTOR_MFS4RX #define INTNO_SIO_TX1 IRQ_VECTOR_MFS4TX #define INHNO_SIO_RX2 IRQ_VECTOR_MFS0RX #define INHNO_SIO_TX2 IRQ_VECTOR_MFS0TX #define INTNO_SIO_RX2 IRQ_VECTOR_MFS0RX #define INTNO_SIO_TX2 IRQ_VECTOR_MFS0TX #define INHNO_SIO_RX3 IRQ_VECTOR_MFS3RX #define INHNO_SIO_TX3 IRQ_VECTOR_MFS3TX #define INTNO_SIO_RX3 IRQ_VECTOR_MFS3RX #define INTNO_SIO_TX3 IRQ_VECTOR_MFS3TX -------------------------------------------------- 以上でToppers/ASP の準備完了 ■ syscall.c newlib に下請けルーチンとなる syscall.c を用意してボードへのフィッティングを行う。FM3基板用の syscall.c 置き場は Toppers/ASP の asp/target/cq_frk_fm3_gcc/syscall.c となる。 同ディレクトリのMakefil.target に syscall.o を追加して組み込む -------------------------------------------------- # # システムサービスに関する定義 # SYSSVC_DIR := $(SYSSVC_DIR) SYSSVC_COBJS := $(SYSSVC_COBJS) target_serial.o syscall.o -------------------------------------------------- syscall.c に用意した関数は次の通り -------------------------------------------------- int _open_r(struct _reent *r, const char *file, int flags, int mode); int _close_r(struct _reent *r, int fd); long _read_r(struct _reent *r, int fd, void *_buf, size_t cnt); long _write_r(struct _reent *r, int fd, const void *buf, size_t cnt); off_t _lseek_r(struct _reent *r, int fd, off_t pos, int whence); int _fstat_r(struct _reent *r,int fd, struct stat *pstat); char *_sbrk_r(struct _reent *r, int incr); --------------------------------------------------