摘要shell
本文簡要介紹了contiki的makefile結構和添加新平臺的方法。app
正文spa
1.CPU.net
a. 創建須要支持的cpu目錄contiki/cpu/cputype/code
b.在../cputype/下放置如下文件:orm
CPU相關的底層代碼和驅動ip
contiki移植與CPU相關的代碼,例如clock.c rtimer-arch.cget
連接文件編譯器
makefileit
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 內指定編譯器,編譯連接選項,依靠生成規則