3、第三部分

这里我们假设TARGET为native

(1)

OBJECTDIR = obj_$(TARGET)

LOWERCASE = -abcdefghijklmnopqrstuvwxyz
UPPERCASE = _ABCDEFGHIJKLMNOPQRSTUVWXYZ
TARGET_UPPERCASE := ${strip ${shell echo $(TARGET) | sed y!$(LOWERCASE)!$(UPPERCASE)!}}
CFLAGS += -DCONTIKI=1 -DCONTIKI_TARGET_$(TARGET_UPPERCASE)=1

定义OBJECTDIR变量为obj_native,这个是存放object文件的目录

定义LOWERCASEUPPERCASE变量,分别存放字母的小写,大些。

TARGET_UPPERCASE看名字就知道,应该是将native转换为NATIVE,看怎么实现的。

echo $(TARGET)  这个命令输出TARGET变量的值,我们这里假定为native,故输出native。

| 是管道,连接上个指令的标准输出,做为下个指令的标准输入,即sed命令的输入是echo $(TARGET)的输出native。

sed命令:

y/source/dest/
              Transliterate the characters in the pattern space which appear in source to the corresponding character in dest.

LOWERCASE和UPPERCASE所对应的位置,就是字母的小写和大写,所以native被转换成了NATIVE。

shell是make内置的函数,参数是Shell命令,将Shell命令的输出作为返回值,故这里的返回值为NATIVE。

strip是make内置的函数,返回去掉空格的字符串值。这里的NATIVE没有空格,故返回NATIVE。

CFLAGS追加 -DCONTIKI=1 -DCONTIKI_TARGET_NATIVE=1

(2)

include $(CONTIKI)/core/net/rime/Makefile.rime
include $(CONTIKI)/core/net/mac/Makefile.mac

导入两个Makefile文件。

$(CONTIKI)/core/net/rime/Makefile.rime: 
ifeq ($(UIP_CONF_IPV6),1)
#RIME_UIP6 = rime-udp.c
RIME_BASE = rimeaddr.c timesynch.c rimestats.c
else
RIME_CHAMELEON = chameleon.c channel.c chameleon-raw.c chameleon-bitopt.c
RIME_BASE = rimeaddr.c rime.c timesynch.c \
rimestats.c announcement.c polite-announcement.c \
broadcast-announcement.c
RIME_SINGLEHOP = broadcast.c stbroadcast.c unicast.c stunicast.c \
runicast.c abc.c \
rucb.c polite.c ipolite.c
RIME_MULTIHOP = netflood.c multihop.c rmh.c trickle.c
RIME_MESH = mesh.c route.c route-discovery.c
RIME_COLLECT = collect.c collect-neighbor.c neighbor-discovery.c \
collect-link-estimate.c
RIME_RUDOLPH = rudolph0.c rudolph1.c rudolph2.c
endif # UIP_CONF_IPV6 CONTIKI_SOURCEFILES += $(RIME_BASE) \
$(RIME_SINGLEHOP) \
$(RIME_MULTIHOP) \
$(RIME_MESH) \
$(RIME_COLLECT) \
$(RIME_RUDOLPH) \
$(RIME_CHAMELEON) \
$(RIME_UIP6)

这里根据UIP_CONF_IPV6的值来决定Rime模块中有哪些文件需要包含进CONTIKI_SOURCEFILES(源文件)。

这里的变量基本都可以从字面上的意思看得明白。

注:UIP_CONF_IPV6为1时,走ipv6。

 $(CONTIKI)/core/net/mac/Makefile.mac

CONTIKI_SOURCEFILES += cxmac.c xmac.c nullmac.c lpp.c frame802154.c sicslowmac.c nullrdc.c nullrdc-noframer.c mac.c
CONTIKI_SOURCEFILES += framer-nullmac.c framer-802154.c csma.c contikimac.c phase.c

包含Mac模块中所有源文件进 CONTIKI_SOURCEFILES(源文件)

(3)

SYSTEM  = process.c procinit.c autostart.c elfloader.c profile.c \
timetable.c timetable-aggregate.c compower.c serial-line.c
THREADS = mt.c
LIBS = memb.c mmem.c timer.c list.c etimer.c ctimer.c energest.c rtimer.c stimer.c trickle-timer.c \
print-stats.c ifft.c crc16.c random.c checkpoint.c ringbuf.c settings.c
DEV = nullradio.c include $(CONTIKI)/core/net/Makefile.uip
include $(CONTIKI)/core/net/rpl/Makefile.rpl CTK = ctk.c
CTKVNC = $(CTK) ctk-vncserver.c libconio.c vnc-server.c vnc-out.c ctk-vncfont.c ifndef CONTIKI_NO_NET
CONTIKIFILES = $(SYSTEM) $(LIBS) $(NET) $(THREADS) $(DHCP) $(DEV)
else
CONTIKIFILES = $(SYSTEM) $(LIBS) $(THREADS) $(DEV) sicslowpan.c fakeuip.c
endif CONTIKI_SOURCEFILES += $(CONTIKIFILES)

定义SYSTEM THREADS LIBS DEV等变量,这些都很容易理解,这是Contiki系统存储系统运行,多进程,库,设备等源文件的变量

导入$(CONTIKI)/core/net/Makefile.uip

NET =                        \
dhcpc.c \
hc.c \
nbr-table.c \
netstack.c \
packetbuf.c \
packetqueue.c \
psock.c \
queuebuf.c \
resolv.c \
sicslowpan.c \
simple-udp.c \
tcpdump.c \
tcpip.c \
uaodv-rt.c \
uaodv.c \
uip-debug.c \
uip-ds6-route.c \
uip-ds6-nbr.c \
uip-ds6.c \
uip-fw-drv.c \
uip-fw.c \
uip-icmp6.c \
uip-nd6.c \
uip-neighbor.c \
uip-over-mesh.c \
uip-packetqueue.c \
uip-split.c \
uip-udp-packet.c \
uip.c \
uip6.c \
uip_arp.c \
uiplib.c

定义uIP所需的源文件,并存放在NET变量中。

导入$(CONTIKI)/core/net/rpl/Makefile.rpl

CONTIKI_SOURCEFILES += rpl.c rpl-dag.c rpl-icmp6.c rpl-timers.c \
rpl-mrhof.c rpl-ext-header.c

将rpl模块的源文件包含进 CONTIKI_SOURCEFILES(源文件)

CTK     = ctk.c
CTKVNC = $(CTK) ctk-vncserver.c libconio.c vnc-server.c vnc-out.c ctk-vncfont.c

定义CTKCTKVNC等变量。这是跟GUI相关。

ifndef CONTIKI_NO_NET
CONTIKIFILES = $(SYSTEM) $(LIBS) $(NET) $(THREADS) $(DHCP) $(DEV)
else
CONTIKIFILES = $(SYSTEM) $(LIBS) $(THREADS) $(DEV) sicslowpan.c fakeuip.c
endif

根据是否定义了CONTIKI_NO_NET这个变量,来决定是否将NET变量中的源文件包含进CONTIKIFILES(源文件)。

即决定是否要包含uIP中的源文件。

CONTIKI_SOURCEFILES += $(CONTIKIFILES)

将上个步骤定义好的CONTIKIFILES变量的值添加到CONTIKI_SOURCEFILES(源文件)中去。

CONTIKIDIRS += ${addprefix $(CONTIKI)/core/,dev lib net net/mac net/rime \
net/rpl sys cfs ctk lib/ctk loader . }

定义Contiki操作系统,源文件目录。

addprefix为make的内置函数,即为后边的字符串添加$(CONTIKI)/core/。

最后为$(CONTIKI)/core/dev,  $(CONTIKI)/core/lib, $(CONTIKI)/core/net, $(CONTIKI)/core/net/mac, $(CONTIKI)/core/net/rime, $(CONTIKI)/core/net/rpl, $(CONTIKI)/core/sys, $(CONTIKI)/core/cfs, $(CONTIKI)/core/ctk, $(CONTIKI)/core/lib/ctk, $(CONTIKI)/core/loader, $(CONTIKI)/core/.

这些都是Contiki操作系统的内核源文件目录。

最新文章

  1. CF 405B Domino Effect(想法题)
  2. Codeforces 653D Delivery Bears(最大流)
  3. Nbimer族助手 部分控件不能用的解决方法(转)
  4. C#编写的多生产者多消费者同步问题
  5. Linux下如何保持gnome-terminal窗口执行命令后停留而不立刻关闭(gnome-terminal -x)
  6. scp 在不同主机之间数据传输
  7. pragma指令简介
  8. silverlight visifire控件图表制作——silverlight 后台方法ControlChart.xaml.cs
  9. Java基础笔记-异常总结,包
  10. 【WPF】三维模型中的“照相机”
  11. C语言之linux内核实现平方根计算算法
  12. 笔记javascript
  13. WSL Windows subsytem linux 的简单学习与使用
  14. javascript&&jquery编写插件模板
  15. python中用selenium调Firefox报错问题
  16. How to write threats to validity?
  17. js的字符串代码库及讲解
  18. linux python虚拟环境 相关的
  19. Linux 时间矫正命令
  20. mybatis调用存储过程的两种方式

热门文章

  1. mock平台架构及实现
  2. 点击页面li显示li中文字
  3. SAS学习笔记之函数应用
  4. Java数组去掉反复的方法集
  5. django orm高级查询 F表达式和Q表达式以及分组annotate
  6. Vue避免 v-if 和 v-for 用在一起
  7. intel电源管理技术中I2C和SVID
  8. android 自己定义组件随着手指自己主动画圆
  9. 小白学习python之路(一):安装python3
  10. linux下安装redis报错问题。