Contiki 配置参数“技巧”说明

前言
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 */


你可能感兴趣的:(makefile,contiki)