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

时间: 2024-10-04 20:44:37

Contiki 配置参数“技巧”说明的相关文章

Nginx return 关键字配置小技巧

Nginx的return关键字属于HttpRewriteModule模块: 语法:return http状态码 默认值:无 上下文:server,location,if 该指令将结束执行直接返回http状态码到客户端. 支持的http状态码:200, 204, 400, 402-406, 408, 410, 411, 413, 416 , 500-504,还有非标准的444状态码. 使用方法: #不符合规则的返回403禁止访问 location /download/ {     rewrite 

关于ntp时间同步理论及配置参数-20170804

[原创]关于ntp时间同步理论及配置参数20170804 前言 NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议.无论是平时使用的私人计算机还是在工作中搭建的服务器集群,时间的统一性和准确性是十分重要的.它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要求就非常地高,是按照A这台计算机的时间,还是按照B这台计算机的时间?NTP就是用来解决这个问题的,NT

linux学习笔记——搭建基于nginx的web服务器、多核配置、nginx配置参数

############ 认识nginx #############Nginx:(发音同 engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用.  其优点是轻量级(占有内存少),高并发(并发能力强),事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用ngi

思科命令配置小技巧三:alias 命令

大家都用过手机上的快捷拨号设置 思科设备是否支持命令的快捷键定义呢 答案是肯定的 suzhouxiaoniu(config)#alias exec xx show ip inter bri  xx是自定义的快捷键名称,可以是数字 suzhouxiaoniu#xx 直接敲定义好的名称Interface                  IP-Address      OK? Method Status                ProtocolFastEthernet1/0          

思科命令配置小技巧四:用ACL控制debug 输出

使用debug命令可以帮助我们TS,但是使用debug命令往往会输出一大堆信息,很多是我们不需要用的,也会造成CPU高负荷,这种情况下我们可以限制debug的输出 可以应用ACL到debug以限定仅输出要求的debug信息. 如仅查看从1.1.1.1到1.1.1.2的ICMP包: Router(config)# access-list 100 permit icmp host 1.1.1.1 host 1.1.1.2 Router# debug ip packet detail 100 思科命令

网站前端_KindEditor.基础入门.0001.KindEditor_3.4.2配置参数?

初始方式: 说明: 在快速入门中使用KE.show({ .. .})来初始化了一个编辑器,具体进入js/kindeditor.js下可以看到KE对象下的show方法先调用了KE的init方法然后又调用了其event事件对象的ready方法,内部其实是调用的KE的create方法,传递的参数为args的id属性,所以可通过2种方式来初始化编辑器 # 方式一 : # 方式二 : 注意: 无论使用哪种方式初始化编辑器,都需要传递配置对象{ ... },配置对象中id属性是必须配置的,其它的属性默认采用

项目中Zookeeper配置参数笔记

ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos.因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解. ZooKeeper的基本运转流程: 1.选举Leader. 2.同步数据. 3.选举Leade

笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <filter>     <filter-name>struts2</filter-name>     <filter-class>org.apache.struts2.di

【原创】MySQL性能优化-I/O相关配置参数

本文介绍InnoDB和MyISAM两种存储引擎的I/O相关参数配置. 1.InnoDB  I/O相关配置 Innodb是一种事务型的存储引擎,为了减少提交事务时产生的io开销,innodb采用了写日志的方式,也就是在事务提交的时候会先写入事务日志中 ,而不是每次都把修改或者数据刷新到数据文件中,这样做是为了提高io的性能,因为事务的修改,使数据和索引文件通常都会映射到表空间随机的位置,所以刷新数据变更到数据文件会产生大量随机io,而记录日志是顺序io,一旦事务日志安全的写到磁盘中,数据就算是持久