在contiki-ng-release-v4.5\os\lib里面,是OS的lib内核库,其实用户可以在这里面增自己的私有库.
我们试验一下,首先在contiki-ng-release-v4.5\os\lib里面建立mycounter.h和mycounter.c令my
counter.h如下:
1 #include <string.h> 2 #include "contiki.h" 3 4 #ifndef MYCOUNTER_H 5 #define MYCOUNTER_H 6 int next_counter(int current); 7 #endif
令mycounter.c如下:
1 #include "contiki.h" 2 #include "mycounter.h" 3 4 int next_counter(int current) 5 { 6 if(current>7) 7 current = 1; 8 else 9 current++; 10 return current; 11 }
然后,我们进入\contiki-ng-release-v4.5\examples建立一个文件夹demo-counter,文件夹里
面编写demo-counter.c和Makefile俩个文件,令demo-counter.c如下:
1 #include "contiki.h" 2 #include "sys/etimer.h" 3 #include "mycounter.h" 4 #include <stdio.h> /* For printf() */ 5 6 PROCESS(counter_process, "Counter process"); 7 AUTOSTART_PROCESSES(&counter_process); 8 static struct etimer timer; 9 static int counter = 0; 10 11 PROCESS_THREAD(counter_process, ev, data) 12 { 13 PROCESS_BEGIN(); 14 printf("Demo Counter\n"); 15 while(1) { 16 etimer_set(&timer, CLOCK_SECOND/2); 17 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); 18 counter = next_counter(counter); 19 printf("Counter: %d\n", counter); 20 } 21 PROCESS_END(); 22 }
其实就是在hello-world例子的复制过来,少量改动一下就可以了,主要是文件层次是一样的,可
以直接使用原有的Makefile文件如下:
CONTIKI_PROJECT = demo-counter all: $(CONTIKI_PROJECT) CONTIKI = ../.. include $(CONTIKI)/Makefile.include
最后,我们打开InstantContiki3.0,进行测试,直接看图吧,打字太慢了.


上面就是我们例子中的printf("Counter: %d\n",counter)输出,说明我们自己的建立的lib库已
经用上了.这是一个很简单很典型的方法,在这个基础之上可以打开coniki NG无限之门.
时间:2020-12-13
今天又测试了一下这个DEMO,又有了新的收获,真不错.我们来聊聊CONTIKI下的Makefile
// lib的.h文件 就这样 不用加入任何头文件了 #ifndef MYCOUNTER_H #define MYCOUNTER_H int next_counter(int current); #endif // lib的.c文件 #include "mycounter.h" int next_counter(int current) { if(current>7) current = 1; else current++; return current; } // demo-counter.c测试文件 #include "contiki.h" #include "sys/etimer.h" #include "mycounter.h" #include <stdio.h> /* For printf() */ PROCESS(counter_process, "Counter process"); AUTOSTART_PROCESSES(&counter_process); static struct etimer timer; static int counter = 0; PROCESS_THREAD(counter_process, ev, data) { PROCESS_BEGIN(); printf("Demo Counter\n"); while(1) { etimer_set(&timer, CLOCK_SECOND/2); PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); counter = next_counter(counter); printf("Counter: %d\n", counter); } PROCESS_END(); }
我们来看一下,这个Makefile:
CONTIKI_PROJECT=demo-counter all: $(CONTIKI_PROJECT) PROJECT_SOURCEFILES += mycounter.c CONTIKI=../.. include $(CONTIKI)/Makefile.include
————>>CONTIKI_PROJECT 它就是目标文件(伪目标).它不是文件夹名字,也不是H头文件名.
它是.C目标文件名.
————>>all: $(CONTIKI_PROJECT) 包含目标文件的路经.有目标文件名了,但是要有它的
路径信息,编译器才能找它.讲大白话联起来理解就是,比如demo-counter是你的仇家,你要找它
报仇,你是不是要先知道它住在哪呀?
————>>PROJECT_SOURCEFILES += xxx.c 包含用户自己写的代码信息,这里只能是.C文件
.理解成在IAR system环境里包含我们项目路经就对了.因为CONTIKI NG系统所用到的Makefile
文件,作者已经写好了.我们自己写的,就要自己通过PROJECT_SOURCEFILES加载进来,让NG系统
能找到它.当然,如果把你的代码放在OS/lib文件里面,就算你不写,系统也能找到它.但是,哈哈,
不说了,哈哈。。。。...
————>>CONTIKI=../.. 从目标文件的目录开始,去找到CONTIKI的根目录,因为哪里有整个
系统Makefile的入口,相对路径可能是../../../../../这些,不管怎么样,能找到根目录就行
————>>include $(CONTIKI)/Makefile.include 前面都找到CONTIKI的根目录,这里
包含总的Makefile.include文件.
最后我们打开Terminal并输入_>make demo-counter TARGET=native就完事了,它的意思是,
在本机对demo-counter.c进行链接并编译,所以我们就会在屏幕上看到这些信息:

要在本机进行执行,我们就输入_>./demo-counter.native,看清楚呀,是一个. 和一个/ (这就是黑色背景
的好处,程序员的最爱),然后demo-counter代码就在NG系统里面执行:

当前我测试的目录这是样子的:

但是,如果我建一个lib,将mycounter.c 和mycounter.h放进去,这个Makefile怎么写呢?

目前为止还没有搞明白,多级目录的Makefile编写方法,总不能全部丢在一个包里面吧?
这样子显得太乱了。
时间:2020-12-15
找到一个偏门的方法,如下:
// lib/ter.h #ifndef TER_H #define TER_H int next_ter(int current); // 申明函数 int next_ter(int current) // 函数实现 { if(current>14) current = 1; else current++; return current; } #endif // demo-counter.c #include "contiki.h" #include "sys/etimer.h" #include "lib/ter.h" // 当前工程目录下的子目录 #include <stdio.h> /* For printf() */ PROCESS(counter_process, "Counter process"); AUTOSTART_PROCESSES(&counter_process); static struct etimer timer; static int ter = 0; // 测试变量ter PROCESS_THREAD(counter_process, ev, data) { PROCESS_BEGIN(); printf("Demo ter\n"); while(1) { etimer_set(&timer, CLOCK_SECOND/2); PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); ter = next_ter(ter); // lib下的ter.h函数入口 printf("ter: %d\n", ter); // 打ter印值 } PROCESS_END(); }
先这样用吧,一个.c 配一个.h 的大众方法,以后学会了再更正!!哈哈
时间:2021-01-04
用户在contiki-ng\examples,建立测试文件时,makefile写成这样也是可以的
all: demo-counter CONTIKI=../.. include ../../Makefile.include
时间:2021-02-18
在阅读makefile发现这样加入.C文件:
### CPU-dependent directories
CONTIKI_CPU_DIRS = . dev usb usb/common usb/common/cdc-acm
### CPU-dependent source files
CONTIKI_CPU_SOURCEFILES += soc.c clock.c rtimer-arch.c uart.c watchdog.c
CONTIKI_CPU_SOURCEFILES += nvic.c sys-ctrl.c gpio.c ioc.c spi-legacy.c adc.c
CONTIKI_CPU_SOURCEFILES += spi-arch.c
CONTIKI_CPU_SOURCEFILES += crypto.c aes.c ecb.c cbc.c ctr.c cbc-mac.c gcm.c
CONTIKI_CPU_SOURCEFILES += ccm.c sha256.c gpio-hal-arch.c
CONTIKI_CPU_SOURCEFILES += cc2538-aes-128.c cc2538-ccm-star.c
CONTIKI_CPU_SOURCEFILES += cc2538-rf.c udma.c lpm.c int-master.c
CONTIKI_CPU_SOURCEFILES += pka.c bignum-driver.c ecc-driver.c ecc-algorithm.c
CONTIKI_CPU_SOURCEFILES += ecc-curve.c
CONTIKI_CPU_SOURCEFILES += dbg.c ieee-addr.c
CONTIKI_CPU_SOURCEFILES += slip-arch.c slip.c
CONTIKI_CPU_SOURCEFILES += i2c.c cc2538-temp-sensor.c vdd3-sensor.c
CONTIKI_CPU_SOURCEFILES += cfs-coffee.c cfs-coffee-arch.c pwm.c
USB_SOURCEFILES += usb-core.c cdc-acm.c usb-arch.c usb-serial.c cdc-acm-descriptors.c
CPU_START_SOURCEFILES = startup-gcc.c
CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) $(USB_SOURCEFILES)
CONTIKI_CPU_DIRS = . dev usb usb/common usb/common/cdc-acm 是包含路经,
CONTIKI_SOURCEFILES += xxxxxxx 是使用包含.C文件!
在一些*.c文件这样引用头文件:
#include "dev/rom-util.h" #include "dev/sys-ctrl.h" #include "dev/ioc.h" #include "dev/nvic.h" #include "dev/sys-ctrl.h" #include "dev/gpio-hal.h"
好像明白是什么意思了,有时间要试一下!!
浙公网安备 33010602011771号