前言
contiki中有很多的参数设置,这些参数设置包括uIP、6lowpan、通用驱动和具体平台等等,contiki的配置参数散落在Demo makefile文件、Demo project_conf.h、平台 contiki_conf.h和contiki_default_conf.h中,弄清楚这四个文件的相互关系,将更好的理解contiki的工作机制。
下面以CC2538DK平台为例,说明Contiki中参数的配置技巧
文件名称 |
位置说明 |
简要描述 |
Makefile |
contiki-3.0\examples\cc2538dk |
cc2538-demo.c的makefile文件,用于生成cc2530固件。 该文件一般用于选择选择project_conf.h、设置网络协议栈等 |
project_conf.h |
contiki-3.0\examples\cc2538dk |
设置具体Demo的参数,一般包括具体的网络设置、开发板管脚设置等等 |
contiki_conf.h |
contiki-3.0\platform\cc2530dk |
cc2538dk平台contiki配置参数 |
contiki_default_conf.h |
contiki\contiki-3.0\core |
contiki默认配置参数,与平台无关 |
优先级说明
在contiki编译链接的过程中,上述四个文件的优先级依次为
【1】Makefile
【2】project_conf.h
【3】contiki_conf.h
【4】contiki_default_conf.h
请注意,C语言中为了防止常数宏重复定义,一般采用先判断后定义的方式,例如
#ifndef UART_CONF_ENABLE #define UART_CONF_ENABLE 1 /**< Enable/Disable UART I/O */ #endif
例如contiki-3.0\examples\cc2538dk\Makefle
DEFINES+=PROJECT_CONF_H=\"project-conf.h\" CONTIKI_PROJECT = cc2538-demo timer-test all: $(CONTIKI_PROJECT) CONTIKI = ../.. CONTIKI_WITH_RIME = 1 include $(CONTIKI)/Makefile.include
例如contiki-3.0\examples\cc2538dk\udp-ipv6-echo-server\Makefile
CONTIKI_PROJECT = udp-echo-server all: $(CONTIKI_PROJECT) CONTIKI = ../../.. CONTIKI_WITH_IPV6 = 1 include $(CONTIKI)/Makefile.include
这两个makefile文件有以下功能
【1】指定目标文件,在这里使用了makefile的一条隐含规则目标文件由同名的C文件编译链接生成。
【2】指定了Contiki文件夹位置,并通过$(CONTIKI)/Makefile.include引入contiki操作系统的makefile文件,而Makefile.include包含了更多的内容。
定义协议栈。contiki支持两种网络协议栈,一种为RIME协议栈,另一种为6lowPAN/IPv6协议,从Makefile的参数可以看出,两个Demo选择了不同的网络协议栈。
若选择了CONTIKI_WITH_IPV6参数,将会影响$(CONTIKI)/Makefile.include中的相关设置。
ifeq ($(CONTIKI_WITH_IPV6),1) CFLAGS += -DNETSTACK_CONF_WITH_IPV6=1 ifneq ($(CONTIKI_WITH_RPL),0) CONTIKI_WITH_RPL = 1 endif MODULES += core/net/ipv6 core/net/ip endif
从这段makefile文件中可以看出,增加了一个NETSTACK_CONF_WITH_IPV6宏定义,并且该常数宏的值为1。也就是说CONTIKI_WITH_IPV6和NETSTACK_CONF_WITH_IPV6是等价的,在makefile中使用CONTIKI_WITH_IPV6,而在头文件中使用NETSTACK_CONF_WITH_IPV6。
project_conf.h
project_conf.h是一个非常有用的配置文件,例如在开发过程中多个工程师使用同一个开发板(测试平台),可使用project_conf.h设置不同的配置参数,测试不同的Demo,但这些不同的配置并不会影响该开发板(测试平台)的配置参数,也就不会影响其他工程师的Demo。
例如contiki-3.0\examples\cc2538dk\project_conf.h
#ifndef PROJECT_CONF_H_ #define PROJECT_CONF_H_ #define NETSTACK_CONF_RDC nullrdc_driver #endif /* PROJECT_CONF_H_ */
例如contiki-3.0\examples\cc2538dk\sniffer\project_conf.h
#ifndef PROJECT_CONF_H_ #define PROJECT_CONF_H_ #define CC2538_RF_CONF_SNIFFER 1 #define CC2538_RF_CONF_AUTOACK 0 #define NETSTACK_CONF_RDC stub_rdc_driver #define UART0_CONF_BAUD_RATE 460800 #endif /* PROJECT_CONF_H_ */
project_conf.h中可以设定一些和工程相关的具体配置,而这些配置可以与平台的默认配置或contiki操作系统的默认配置不同。
例如可以关闭节点的路由功能
#undef UIP_CONF_ROUTER #define UIP_CONF_ROUTER 0
例如修改网络ID和信道编号
/* RF Config */ #ifndef IEEE802154_CONF_PANID #define IEEE802154_CONF_PANID 0xD5C8 #endif #ifndef CC2538_RF_CONF_CHANNEL #define CC2538_RF_CONF_CHANNEL 19 #endif /* CC2538_RF_CONF_CHANNEL */
contiki_conf.h
该文件中包含了平台相关的所有配置参数,一般情况下该文件并不需要修改。如果在开发过程中创建新的平台可参考该文件中设置内容。但是该文件的使用过程中需要注意,由于该文件的优先级低于Makefile文件,所有部分常数宏已经在Makefile中定义,而在C文件或H文件中往往找不到,例如
/* Don‘t let contiki-default-conf.h decide if we are an IPv6 build */ #ifndef NETSTACK_CONF_WITH_IPV6 #define NETSTACK_CONF_WITH_IPV6 0 #endif
请注意不能简单的认为NETSTACK_CONF_WITH_IPV6被定义为0,应该结合Demo中的makefile文件,如果在makefile文件中存在“CONTIKI_WITH_IPV6 = 1",那么NETSTACK_CONF_WITH_IPV6已经被定义为1,contiki_conf.h中之后的参数选择都将按照NETSTACK_CONF_WITH_IPV6=1的情况选择,例如
#ifndef NETSTACK_CONF_NETWORK #if NETSTACK_CONF_WITH_IPV6 #define NETSTACK_CONF_NETWORK sicslowpan_driver #else #define NETSTACK_CONF_NETWORK rime_driver #endif /* NETSTACK_CONF_WITH_IPV6 */
contiki_default_conf.h
该文件中保存contiki操作系统的默认参数,例如router配置和RPL配置等。
/* NETSTACK_CONF_WITH_IPV6 specifies whether or not IPv6 should be used. If IPv6 is not used, IPv4 is used instead. */ #ifndef NETSTACK_CONF_WITH_IPV6 #define NETSTACK_CONF_WITH_IPV6 0 #endif /* NETSTACK_CONF_WITH_IPV6 */ /* UIP_CONF_BUFFER_SIZE specifies how much memory should be reserved for the uIP packet buffer. This sets an upper bound on the largest IP packet that can be received by the system. */ #ifndef UIP_CONF_BUFFER_SIZE #define UIP_CONF_BUFFER_SIZE 128 #endif /* UIP_CONF_BUFFER_SIZE */ /* UIP_CONF_ROUTER specifies if the IPv6 node should be a router or not. By default, all Contiki nodes are routers. */ #ifndef UIP_CONF_ROUTER #define UIP_CONF_ROUTER 1 #endif /* UIP_CONF_ROUTER */ /* UIP_CONF_IPV6_RPL specifies if RPL is to be used for IPv6 routing. */ #ifndef UIP_CONF_IPV6_RPL #define UIP_CONF_IPV6_RPL 1 #endif /* UIP_CONF_IPV6_RPL */ /* UIP_CONF_MAX_ROUTES specifies the maximum number of routes that each node will be able to handle. */ #ifndef UIP_CONF_MAX_ROUTES #define UIP_CONF_MAX_ROUTES 20 #endif /* UIP_CONF_MAX_ROUTES */