perry_peng的个人空间 https://passport2.21ic.com/?717779 [收藏] [复制] [RSS]

日志

PIC单片机学习(2)

已有 1005 次阅读2014-6-18 15:30 |系统分类:单片机| 单片机



对于编译器我喜欢用命令行模式的,因为可以写成makefile编译。基本上我所用的软件开发工具都做成这种模式,除了有些特别的开发工具比如labview。其它的像asm, C,C++等都是用编译器+makefile+notepad2。以前写windows程序这是这么玩的。




在网上找了下支持PIC 8bit单片机的免费编译器,


下载sdcc和gputils。


这两个软件都可以在sourceforge.net上下载。




首先就要研究下各种开发工具命令行模式下的参数。


像gpasm的参数:


       
  1. # gpasm options:
  2. # -a FMT, --hex-format FMT Select hex file format. [inhx32]
  3. # -c, --object Output relocatable object.
  4. # -C, --old-coff Use old Microchip COFF format.
  5. # -d, --debug Output debug messages.
  6. # -D SYM=VAL, --define SYM=VAL Define SYM with value VAL.
  7. # -e [ON|OFF], --expand [ON|OFF] Macro expansion.
  8. # -g, --debug-info Use debug directives for COFF.
  9. # -h, --help Show this usage message.
  10. # -i, --ignore-case Case insensitive.
  11. # -I DIR, --include DIR Specify include directory.
  12. # -l, --list-chips List supported processors.
  13. # -L, --force-list Ignore nolist directives.
  14. # -m, --dump Memory dump.
  15. # --mpasm-compatible MPASM compatibility mode
  16. # -M, --deps Output dependency file.
  17. # -o FILE, --output FILE Alternate name of output file.
  18. # -p PROC, --processor PROC Select processor.
  19. # -P FILE, --preprocess FILE Write preprocessed asm file to FILE
  20. # -q, --quiet Quiet.
  21. # -r RADIX, --radix RADIX Select radix. [hex]
  22. # -u, --absolute Use absolute pathes.
  23. # -v, --version Show version.
  24. # -w [0|1|2], --warning [0|1|2] Set message level. [0]
  25. # -y, --extended Enable 18xx extended mode.
复制代码


gplink参数:


       
  1. # gplink options:
  2. # -a FMT, --hex-format FMT Select hex file format.
  3. # -c, --object Output executable object file.
  4. # -d, --debug Output debug messages.
  5. # -f VALUE, --fill VALUE Fill unused program memory with value.
  6. # -h, --help Show this usage message.
  7. # -I DIR, --include DIR Specify include directory.
  8. # -l, --no-list Disable list file output.
  9. # -m, --map Output a map file.
  10. # -o FILE, --output FILE Alternate name of output file.
  11. # -O OPT, --optimize OPT Optimization level [1].
  12. # -q, --quiet Quiet.
  13. # -r, --use-shared Use shared memory if necessary.
  14. # -s FILE, --script FILE Linker script.
  15. # -t SIZE, --stack SIZE Create a stack section.
  16. # -u, --macro symbol[=value] Add macro value for script.
  17. # -v, --version Show version.
  18. # -w, --processor-mismatch Disable "processor mismatch" warning.
  19. #
复制代码



以下是我编写的makefile文件:


##########################################################################
# 配置MCU类型。必须同实际的硬件一致。
CPU = 16f877a
ARCH = pic14
# 配置外部晶振的频率。

XTAL  = 12000000


##########################################################################
# 启用调式模式。
DEBUG = TRUE


# 输出文件名。
ifeq (, $(PROJECT))
  PROJECT = $(ARCH)-$(CPU)
endif
TARGET    = $(PROJECT)
FIRMWARE  = $(PROJECT).hex


# 编译器选择。
CCNAME  = sdcc-x86-3.4.0
GPNAME  = gputils-x86-1.2.0


##########################################################################
# 源代码所在目录。
ROOT      = .
CCROOT    = \home\cc
# 导出一些环境变量。

export SDCC_HOME           := $(CCROOT)\$(CCNAME)
export SDCC_INCLUDE        := $(SDCC_HOME)\include
export SDCC_LIB            := $(SDCC_HOME)\lib
export GPUTILSDIR          := $(CCROOT)\$(GPNAME)
export GPUTILS_HEADER_PATH := $(GPUTILSDIR)\header
export GPUTILS_LKR_PATH    := $(GPUTILSDIR)\lkr
export GPUTILS_LIB_PATH    := $(GPUTILSDIR)\lib
##########################################################################
# 获取当前目录下所有.c文件。
# 获取${src}中每个文件名的基本名称然后追加.o在每个文件名之后。
SCAN      = *.c
SCAN     += *.cc
SCAN     += *.cpp
SCAN     += *.cxx
SCAN     += *.S
ifeq (mcs51, $(ARCH))
  OXX     = .rel
else
  ifeq (pic14, $(ARCH))
    OXX   = .o
  else
    $(error CPU "$(ARCH)" dosn't support.)
  endif
endif
OBJS      := $(addsuffix $(OXX), $(basename $(wildcard $(SCAN))))


##########################################################################



##########################################################################
# 库搜索路径。
CCBIN     = $(SDCC_HOME)\bin
GPBIN     = $(GPUTILSDIR)\bin


CCINC     = -I"$(ROOT)"
CCINC    += -I"$(SDCC_INCLUDE)"
ifeq (mcs51, $(ARCH))
CCINC    += -I"$(SDCC_INCLUDE)\mcs51"
CCINC    += -I"$(SDCC_INCLUDE)\asm\mcs51"
endif
ifeq (pic14, $(ARCH))
CCINC    += -I"$(SDCC_INCLUDE)\pic14"
CCINC    += -I"$(SDCC_INCLUDE)\asm\pic14"
CCINC    += -I"$(SDCC_HOME)\non-free\include\pic14"
endif


ifeq (pic14, $(ARCH))
ASINC     = -I"$(GPUTILSDIR)\header"
endif


ifeq (mcs51, $(ARCH))
CCLIB     = -L"$(ROOT)"
CCLIB    += -L"$(SDCC_LIB)\small"
endif
ifeq (pic14, $(ARCH))
CCLIB     = -I"$(ROOT)"
CCLIB    += -I"$(SDCC_LIB)\pic14"
CCLIB    += -I"$(SDCC_HOME)\non-free\lib\pic14"
endif



##########################################################################
# 编译器路径。
CC        = "$(CCBIN)\sdcc"
CP        = "$(CCBIN)\sdcpp"
LIB       = "$(CCBIN)\sdcclib"
HEX       = "$(CCBIN)\packihx"
SIZE      = size
ifeq (mcs51, $(ARCH))
AS        = "$(CCBIN)\sdas8051"
LD        = "$(CCBIN)\sdcc"
SIM       = "$(CCBIN)\s51"
endif
ifeq ("$(ARCH)", "pic14")

# 汇编器执行文件。
AS        = "$(GPBIN)\gpasm"

# 连接器执行文件。
LD        = "$(GPBIN)\gplink"

# 模拟器执行文件。
SIM       = gpsim
endif


OCFLAGS   = -o
OLFLAGS   = -o
CCFLAGS     = --std-sdcc99
CCFLAGS    += --fverbose-asm
CCFLAGS    += -D_XTAL=$(XTAL)
CCFLAGS    += -D_$(ARCH)_
CCFLAGS    += -D_$(CPU)_
CCFLAGS    += -p$(CPU)
CCFLAGS    += -m$(ARCH)
CCFLAGS    += --vc


ifeq (pic14, $(ARCH))
  ASFLAGS   = -c
  ASFLAGS  += -i
  ASFLAGS  += -w0
# 仅编译。
  CCFLAGS  += -S

# 使用non-free库。
  CCFLAGS  += --use-non-free
  CCFLAGS  += --nojtbound
#  CCFLAGS  += --nolabelopt
# 输出格式。
  LDFLAGS   = -ainhx32
  LDFLAGS  += -f255


  ifeq (TRUE, $(DEBUG))
    ASFLAGS+=
#    CCFLAGS+= --debug
    CCFLAGS+= --Werror
    CCFLAGS+= --debug-xtra
    LDFLAGS+= -m
  else
    ASFLAGS+=
    CCFLAGS+= --peep-asm
    CCFLAGS+= --opt-code-speed
    LDFLAGS+= -O3
  endif
  
  LDFLAGS  += -s"$(GPUTILS_LKR_PATH)\$(CPU)_g.lkr"
  SMFLAGS   = -s $(TARGET).cod
endif


all: clean build


sim: clean build

# 当编译完成后开始运行模拟器。
$(SIM) $(SMFLAGS)


%.rel: %.c
$(CC) $(CCFLAGS) $(CCINC) $(OCFLAGS)$@ $<


%.rel: %.cc
$(CC) $(CCFLAGS) $(CCINC) $(OCFLAGS)$@ $<


%.rel: %.cpp
$(CP) $(CCFLAGS) $(CCINC) $(OCFLAGS)$@ $<


%.rel : %.cxx
$(CP) $(CCFLAGS) $(CCINC) $(OCFLAGS)$@ $<


%.rel: %.asm
$(AS) $(ASFLAGS) $(ASINC) $(OCFLAGS)$@ $<


%.rel: %.S
$(AS) $(ASFLAGS) $(ASINC) $(OCFLAGS)$@ $<


%.o: %.c
$(CC) $(CCFLAGS) $(CCINC) $(OCFLAGS)$@.as $<
$(AS) $(ASFLAGS) $(ASINC) $(OLFLAGS)$@ $@.as


%.o: %.cc
$(CC) $(CCFLAGS) $(CCINC) $(OCFLAGS)$@.as $<
$(AS) $(ASFLAGS) $(ASINC) $(OLFLAGS)$@ $@.as


%.o: %.cpp
$(CC) $(CCFLAGS) $(CCINC) $(OCFLAGS)$@.as $<
$(AS) $(ASFLAGS) $(ASINC) $(OLFLAGS)$@ $@.as


%.o : %.cxx
$(CC) $(CCFLAGS) $(CCINC) $(OCFLAGS)$@.as $<
$(AS) $(ASFLAGS) $(ASINC) $(OLFLAGS)$@ $@.as


%.o: %.asm
$(AS) $(ASFLAGS) $(ASINC) $(OLFLAGS)$@ $<


%.o: %.S
$(AS) $(ASFLAGS) $(ASINC) $(OLFLAGS)$@ $<


build: $(OBJS)
$(LD) $(LDFLAGS) $(CCLIB) $(OLFLAGS)$(FIRMWARE) $(OBJS) $(ADDLIB)
@gecho
$(SIZE) $(FIRMWARE)
@gecho

路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)