SDCCの研究
目次
SDCC for PIC ubuntu linux版の試用 2008.3.21
SDCC for PIC Win32版の試用 2008.3.12
SDCC for PIC ubuntu linux版の試用 2008.3.21
PIC16F84aのCコンパイルをフリーのコンパイラSDCCを使ってテストしてみました。
コンパイル、リンカはlinux版をインストールしました。(ubuntu 7.10でテスト)
sdcc は2.6.0をインストールしました。
gplinkは0.13.4をインストールしました。
PATHは通っているところにインストールされるので設定不要です。
ただし、gplinkを使って複数のオブジェクトをリンクする場合には、ライブラリPATHの指定は必須となります。makefile中で指定します。
gplinkではなくリンクにsdccを使用するとライブラリPATHが不要になります。新しいmakefileではgplinkを使用していません。 更新
赤字はコメントです。ファイルにはありません。
lcd16f84a.c ----------------
#include <pic16f84a.h>
extern int lcd(void);
extern int delay(void);
int main(void)
{
//int at 0x2007 __config = _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF;
return(lcd()+delay()); 特に何もしません、ダミーのリターン値です
}
lcd.c ----------------------
#include <pic16f84a.h>
int lcd(void)
{
return(1); 特に何もしません、ダミーのリターン値です
}
delay.c --------------------
#include <pic16f84a.h>
int delay(void)
{
return(1); 特に何もしません、ダミーのリターン値です
}
makefile --------------------
# Makefile PIC program for Linux SDCC
hex_name = lcdtest
sereis = pic14
device = 16f84a
CC = sdcc
CFLAGS = -m$(sereis) -p$(device) # -V を追加すると詳細表示します
RM = rm
#ソースを追加したときに以下に.oを付けて追加してください
OBJS = lcd16f84a.o delay.o lcd.o
#コンパイルとアセンブル
.c.o: # 下の行の -c はSDCCによるリンクをしません
$(CC) $(CFLAGS) -c $<
#リンク(gplinkを使用)
#$(hex_name).hex : $(OBJS)
# gplink -r -I"/usr/share/sdcc/lib/pic" \
# -o $(hex_name).hex pic16f84a.lib libsdcc.lib \
# $(OBJS)
#リンク(SDCCを使用、ライブラリパス、ライブラリの指定不要です)
$(hex_name).hex : $(OBJS)
$(CC) $(CFLAGS) -o $(hex_name).hex $(OBJS)
ls -l *.o *.hex
#lsは不要ならコメントにしてください
#クリーン(makeする前に実行してください)
clean :
$(RM) -f *.o *.d *.p *.cod *.lst *.asm *.hex *.bak *~
ソースとmakefile 2008.3.21 Rev2
SDCC for PIC Win32版の試用 2008.3.12
PIC16F88のCコンパイルをフリーのコンパイラSDCCを使ってテストしてみました。
コンパイル、リンカはWindows版をインストールしました。(WindowsXP Pro SP2でテスト)
sdcc-win32 2.7.0 をダウンロードしてください。 追記 2.8.0が出ました。
gputils-win32 0.13.5をダウンロードしてください。
両方ともデフォルトでインストールして、最後にPATHを設定するか聞いてくるので必ずYES
こちらのソースのCONFIGを使わせてもらいました。詳しくは、田中さんのページをみてください。
tect.cとして保存します。
#include <pic16f88.h>
int at 0x2007 __config = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _MCLR_OFF & _LVP_OFF & _BODEN_OFF;
void wait(unsigned int delay)
{
while(delay--)
{
_asm
NOP
_endasm;
}
}
void main(void)
{
int dat = 0;
OSCCON = 0x70;//internal 8MHz clock
TRISA = 0xfe;//RA0 output port
while(1)
{
dat = dat ^ 1;//bit 0 反転
PORTA = dat;//出力
wait(50000);//待ち時間
}
}
test.cのあるフォルダで以下を実行
sdcc -mpic14 -p16f88 test.c
コンパイルリンクが終わると以下のメッセージを表示します。message: using default linker script "C:\Program Files\gputils\lkr\16f88.lkr"
makeファイルの使用
test.cのあるフォルダにmakefileをコピーします。makeはGCCのものがインストールされていてパスが通っているとします。もしWinAVRがインストールされていてパスが通っているなら問題ないです。
makefileの内容:
# Makefile for PIC program compile
name = test
sereis = pic14
device = 16f88
SDCC = sdcc
MV = mv
RM = rm
All : $(name).hex
%.hex : %.c
$(SDCC) -V -m$(sereis) -p$(device) $<
clean :
$(RM) -f $(TMPFILE) *.o *.d *.p *.cod *.lst *.asm *.hex *~
test.cのあるフォルダで以下を実行
make clean
make
メイクが終わると以下のメッセージを表示します。sdcc -V -mpic14 -p16f88 test.c
・
・
・
message: using default linker script "C:\Program Files\gputils\lkr\16f88.lkr"