<span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Simsun; font-size: 34px;">0. 目标</span>
<p style="margin-top: 0px; margin-bottom: 22px; padding-top: 0px; padding-bottom: 0px; color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Simsun; font-size: 17px;">了解Contiki的编译配置方法。</p><p style="margin-top: 0px; margin-bottom: 22px; padding-top: 0px; padding-bottom: 0px; color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Simsun; font-size: 17px;"></p><pre name="code" class="html">make TARGET=srf06-cc26xx BOARD=srf06/cc26xx
1. 使用环境:
Contiki3.0: "git clone https://github.com/contiki-os/contiki.git"得到,官方提供的ubuntu虚拟机中用的是2.7版本。
CC26xxware:Contiki3.0 git中不包含此文件,进入contiki->cpu-cc26xx-cc13xx->lib文件夹,“git clone https://github.com/contiki-os/cc26xxware.git”获取相关文件。
2. 逐步深入:
2.1 CC26XX工程编译
一开始时是在example->cc26xx文件夹下执行make,makeclean。发现可以得到hex文件。
之后发现example->helloworld,当然是从这里(cc2650鼓捣教程-2.一切的开始 Hello world程序!)发现的,博文上用的是make TARGET=srf06-cc26xx hello-world命令来编译的。奇怪为什么选择这个TARGET,这个是在多个地方见过的,那么还可以是什么,怎么指导用哪个呢。
所以就找到了Contiki build system,里面介绍Contiki中的makefile是复用型的,通过配置可以得到不同的结果,并且每个工程的makefile文件中必须包含contiki/Makefile.include,这个与helloworld的makefile内容一致,内容较短粘贴如下:
CONTIKI_PROJECT = hello-world
all: $(CONTIKI_PROJECT)
CONTIKI = ../..
include $(CONTIKI)/Makefile.include
Contiki build system中还介绍说复用通过TARGET指定平台进行,tareget可以是各种值,具体怎么选择需要看contiki/platform目录下有那些文件夹,默认是native。
CC26XX为例,make TARGET=srf06-cc26xx BOARD=srf06/cc26xx,其中srf06-cc26xx是contiki/platform/srf06-cc26xx的一个文件夹
user@instant-contiki:~/contiki/platform/srf06-cc26xx$ ls
common contiki-conf.h contiki-main.c launchpad Makefile.srf06-cc26xx README.md sensortag srf06
srf06-cc26xx文件夹包含了一类处理器例如CC2650,CC2630,CC1310等。类似的plantform还有很多:
<span style="word-spacing: normal; color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Simsun; font-size: 17px; background-color: rgb(255, 255, 255);"></span><pre name="code" class="plain">ser@instant-contiki:~/contiki/platform$ ls
apple2enh avr-raven avr-rcb c128 cc2538dk econotag exp5438 mbxxx native seedeye stm32nucleo-spirit1 wismote atarixl avr-ravenlcd avr-rss2 c64 cooja ev-aducrf101mkxz galileo micaz nrf52dk sky stm32test z1 avr-atmega128rfa1 avr-ravenusb avr-zigbit cc2530dk cooja-ip64 eval-adf7xxxmb4z jn516x minimal-net openmote-cc2538 srf06-cc26xx win32 zoul
<span style="word-spacing: normal; color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Simsun; font-size: 17px; background-color: rgb(255, 255, 255);">除了TARGET还有BOARD参数,即同一种处理器对应的不同开发板,因为不同的硬件设计提供的外设不同,例如:LED的数量,LED绑定的管脚,按键的数量,按键使用的管脚等。主要用于区分外设的使用。当然还有不同的同样是CC2650,不同的封装提供的IO数量不一样,也是通过BOARD进行区分。</span>
contiki/platform/srf06-cc26xx/srf06/cc26xx$文件夹下只有board.h Makefile.cc26xx两个文件。其中*.h文件中主要定义板子的外设,例如:
#undef LEDS_GREEN
#undef LEDS_YELLOW
#undef LEDS_RED
#undef LEDS_CONF_ALL
#define LEDS_RED 1
#define LEDS_YELLOW 2
#define LEDS_GREEN 4
#define LEDS_ORANGE 8
#define BOARD_IOID_LED_1 IOID_25
#define BOARD_IOID_LED_2 IOID_27
#define BOARD_IOID_LED_3 IOID_7
#define BOARD_IOID_LED_4 IOID_6
#define BOARD_LED_1 (1 << BOARD_IOID_LED_1)
#define BOARD_LED_2 (1 << BOARD_IOID_LED_2)
#define BOARD_LED_3 (1 << BOARD_IOID_LED_3)
#define BOARD_LED_4 (1 << BOARD_IOID_LED_4)
#define BOARD_LED_ALL (BOARD_LED_1 | BOARD_LED_2 | BOARD_LED_3 | \
BOARD_LED_4)
#define BOARD_IOID_UART_RX IOID_2
#define BOARD_IOID_UART_TX IOID_3
#define BOARD_IOID_UART_CTS IOID_UNUSED
#define BOARD_IOID_UART_RTS IOID_UNUSED
#define BOARD_UART_RX (1 << BOARD_IOID_UART_RX)
#define BOARD_UART_TX (1 << BOARD_IOID_UART_TX)
#define BOARD_UART_CTS (1 << BOARD_IOID_UART_CTS)
#define BOARD_UART_RTS (1 << BOARD_IOID_UART_RTS)
以上代码定义了LED和串口,代码来自board.h,文件中还有其它SPI,SDIO,LCD,ADC等外设接口声明。
Makefile.cc26xx中制定了处理器型号
### Will allow the inclusion of the correct CPU makefile
CPU_FAMILY = cc26xx
### Include the common makefile
include $(PLATFORM_ROOT_DIR)/srf06/Makefile.srf06
CONTIKI_TARGET_DIRS += srf06/cc26xx
结论:
通过TARGET和BOARD两个选型可以选择不同的处理器平台,不同的开发板。使得编译出的可执行文件能够下载到处理器进行运行。
不错的链接诶:
http://anrg.usc.edu/contiki/index.php/Contiki_tutorials
http://cgbluesky.blog.163.com/blog/static/24123558201601011818480/