2019独角兽企业重金招聘Python工程师标准>>>
摘要
本文简要介绍了contiki的makefile结构和添加新平台的方法。
正文
1.CPU
a. 建立需要支持的cpu目录contiki/cpu/cputype/
b.在../cputype/下放置以下文件:
CPU相关的底层代码和驱动
contiki移植与CPU相关的代码,例如clock.c rtimer-arch.c
链接文件
makefile
c. makefile文件解释:
文件名: Makefile.cputype
CONTIKI_CPU=$(CONTIKI)/cpu/cputype
CONTIKI_CPU_DIRS = . dev hal #定义与CPU有关的的文件夹
CONTIKI_TARGET_SOURCEFILES +=
CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) #定于与CPU有关的文件
#定义编译器
CC = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
AS = arm-none-eabi-gcc
NM = arm-none-eabi-nm
AR = arm-none-eabi-ar
OBJCOPY = arm-none-eabi-objcopy
STRIP = arm-none-eabi-strip
SIZE = arm-none-eabi-size
ifndef DEBUG
OPTI = -Os -ffunction-sections
#endif
#定义编译选项
CFLAGSNO = -mthumb -mcpu=cortex-m0 -D __SOURCEFILE__=\"$*.c\"
CFLAGS += $(CFLAGSNO) $(OPTI)
ASFLAGS = -mthumb -mcpu=cortex-m0 -c -g -Wall -Os -ffunction-sections \
-mlittle-endian -fshort-enums -x assembler-with-cpp -Wa,-EL
#定义链接选项
LDFLAGS += -mcpu=cortex-m0 \
-mthumb \
-Wl,-T -Xlinker $(CONTIKI_CPU)/gnu.ld \
-Wl,-static \
-u Default_Handler \
-nostartfiles \
-Wl,-Map -Xlinker contiki-$(TARGET).map
#定义依赖关系
%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(OBJECTDIR)/symbols.o
$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} -Wl,-\( ${filter %.a,$^} $(TARGET_LIBFILES) -Wl,-\) -o $@
@echo >> contiki-$(TARGET).map
@$(SIZE) $(SIZEFLAGS) $@ >> contiki-$(TARGET).map
$(OBJECTDIR)/%.o: %.s
$(AS) $(ASFLAGS) -o $@ $<
%.bin: %.$(TARGET)
$(OBJCOPY) $(OBJOPTS) $< $@
2.平台
a.建立需要支持的平台目录contiki/platform/plattarget/
b.在../plattarget/下放置以下文件:
平台相关驱动及应用
平台相关配置文件contiki-conf.h等
平台启动程序contiki-main.c 完成平台基本工作环境的初始化,具体的用户应用程序在用户应用文件夹中用户自己建立文件并以autostart process开始应用程序
makefile
c. makefile文件解释:
文件名:Makefile.plattarget
CONTIKI_TARGET_DIRS = . dev #定义platform要编译的与平台相关的文件夹
ifndef CONTIKI_TARGET_MAIN
CONTIKI_TARGET_MAIN = contiki-main.c #contiki-main.c也可以在其它地方定义
endif
CONTIKI_TARGET_SOURCEFILES += irq.c $(CONTIKI_TARGET_MAIN) #定于platform下需要编译的文件
include $(CONTIKI)/cpu/cputype/Makefile.cputype 引用cpu的makefile
3.用户应用
a.建立用户应用需要的目录contiki/examples/userapp/
b.在../userapp/下放置以下文件:
用户应用程序文件
makefile
c. makefile文件解释
指定平台的Makefile.target,指定使用的平台
TARGET = plattarget
指定编译目标的Makefile
CONTIKI_PROJECT = mb851-shell #contiki应用名称
PROJECTDIRS = $(CONTIKI)/platform/mb851/apps #指定其它应用所在目录
APPS = serial-shell #指定使用contiki提供的应用名
PROJECT_SOURCEFILES = shell-sensors.c #指定其它应用的文件名
all: $(CONTIKI_PROJECT)
CONTIKI = ../../.. #指定contiki的根目录
include $(CONTIKI)/Makefile.include 引用根目录下makefile规则
4. Makefile.include
该文件统领contiki的编译规则
a. 以下片段得到TARGET可以找到对应的platform
ifeq ($(TARGET),)
-include Makefile.target
ifeq ($(TARGET),)
${info TARGET not defined, using target 'native'}
TARGET=native
else
${info using saved target '$(TARGET)'}
endif
endif
b.以下获取所在platform的相关信息
获取应用文件夹目录
APPDIRS += ${wildcard ${addprefix $(CONTIKI)/apps/, $(APPS)} \
${addprefix $(CONTIKI)/platform/$(TARGET)/apps/, $(APPS)} \
$(APPS)}
获取platform makefile文件
target_makefile := $(wildcard $(CONTIKI)/platform/$(TARGET)/Makefile.$(TARGET) ${foreach TDIR, $(TARGETDIRS), $(TDIR)/$(TARGET)/Makefile.$(TARGET)})
获取编译和链接依靠规则
%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a
$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -o $@
总结
1. 在contiki内添加一个新的平台及应用可分为以下步骤(以nuc140为CPU和m0rime为platform为例):
step1: 在contiki/cpu/下建立nuc140目录,并在目录下建立Makefile.nuc140和CPU相关的代码
step2: 在contiki/platform/下建立m0rime目录,并在目录下建立Makefile.m0rime和platform相关的代码
step3: 在contiki/examples/下建立应用目录m0rime-app,并在目录下建立Makefile和Makefile.target,和应用相关的代码
2.Makefile的包含和依赖关系
m0rime-app:
Makefile.target 指定TARGET
Makefile 引用Makefile.include
contiki目录下有Makefile.include
Makefile 引用Makefile.target的TARGET, 找到Makefile.m0rime 并应用Makefile. m0rime
m0rime:
m0rime直接指定引用 Makefile.nuc140
nuc140:
Makefile.nuc140 内指定编译器,编译链接选项,依靠生成规则