木子剑
生命不熄,学习不止!

爆光我的资源:先在*宝要入手一个开发板,开发板的芯片是CC2538,PC操作系统是WIN10 64bit

,还是使用习惯的IAR v7.70版本,仿真工具是满大街D版的J-LINK V9,当然有条件请支持正版!!

CONTIKI-NG比CONTIKI-3.0的优点是,文件结构整洁和简单移植。自学CONTIKI是长期和艰难的过程。

 

第一步,用IAR正常建个裸机工程,就可以开始移OS内核了,有个重点就是NG里面的CC2538DK相关文件,

一律先不要移植,这个文件是我们要参考的,不是一定要移到IAR里面,因LINUX和WINDOWS平台差异大的

我移植好的,都是关键OS组件,并能正常用IAR编译通过的,看下图所示吧:

因为LINUX和WINDOWS平台差异,移植过程中,会出现很多的错误,

C语言功底深的能搞定的,实在不行百度找相同解决办法。我移植中出现20个报错,

真要一个一个全部写出来,工作量很大,我把它做成了“移植记录”,放在我的工程包里面。

 

 

第二步,接下来是加入TI官方的CC2538的固件库,ARM的标准接口使用Contiki-NG\arch\cpu\arm\cortex-m就可以了。

CC2538的LIB得去TI官网下载,取里面的俩个文件inc和source,还有一个比较重要的就是,原CONTIKI的启动文件

是startup_gcc.c,   startup_iar.c是在CC2538固件库里面,bsp\srf06bb_cc2538\examples\startup_files也有,也可以

直接在CC2538固件库里面搜到startup_iar.c。TI固件库里面有startup_ccs.c   startup_gcc.c   startup_iar.c比较全的。

我移植好的,如下图所示:

all_process这个文件,我是用来放置所有的process进程的,有1个功能就放1个process,有100个就放100个process,

一般都不会超过20个process,main.h是我个人习惯,方便使用。cc2538_conf.h里面是空的,为后面留着的,它的功能

相当于CONTIKI-3.0里面的project-conf.h。

 

第三步,更改contiki-main.c,加入测试程序,进行测试OS内核调度测试,注意这个时候OS是没心跳的,因为还没有写clock.c呢!!!

改写contiki-main.c在这里面C:\OS-contiki-ng\Contiki-NG\os;当然不想破坏OS原来的contiki-main.c,也可以复制一份到自己工程里面。

我的测试源码,如下图所示:

 1 #include "contiki.h"
 2 #include "main.h" 
 3 //#include "contiki-net.h"
 4 //#include "sys/node-id.h"
 5 //#include "sys/platform.h"
 6 //#include "sys/energest.h"
 7 //#include "sys/stack-check.h"
 8 
 9 PROCESS(hello_world_process1, "Hello world process1");//申请线程process1
10 PROCESS_THREAD(hello_world_process1, ev, data)//进程1的功能体   
11  {
12     PROCESS_BEGIN();//开始 
13 
14 
15     __asm("nop");//OS内核的测试
16     __asm("nop");
17     __asm("nop");
18 
19 
20      PROCESS_END();//结束
21 }//PROCESS_THREAD
22 
23 PROCESS(hello_world_process2, "Hello world process2");//申请线程process2
24 PROCESS_THREAD(hello_world_process2, ev, data)//进程2的功能体   
25  {
26     PROCESS_BEGIN();//开始  
27 
28 
29     process_start(&hello_world_process1, NULL);//手动开启进程1 
30     __asm("nop");
31     __asm("nop");
32     __asm("nop");
33 
34 
35     PROCESS_END();//结束
36 }//PROCESS_THREAD
37 
38 int
39 main(void)
40 {
41   //platform_init();      
42   //clock_init();
43   //rtimer_init(); 
44 
45   process_init();
46 
47   //process_start(&etimer_process, NULL);
48   //ctimer_init();
49   //watchdog_init();
50   //energest_init();  
51 
52   process_start(&hello_world_process1, NULL);//手动开启进程1
53   while(1)
54   {
55     do 
56     {
57       __asm("nop");                                 //手动开启进程2,在进程2中不断的启动进程1
58       process_start(&hello_world_process2, NULL);   //在没有实现clok.c之前,初测OS内核调度是正常的,因为我  
59       __asm("nop");                                 //IAR进行仿真时,在进程1打断点,每次都正常停在断点处。                            
60     } while(process_run() > 0);                 
61     //platform_idle();
62   }
63 }

 

 

完成后进行make编译,然后在hello_world_process1和hello_world_process2的__asm("nop")处打上断点进行仿真,发现是按设计流程进行执行的,算是OK了

                                 

使用CC2538进行纯软件仿真时,报错Stack pointer is setup to incorrect alignment. Stack addr = 0xCDCDCDCD,

解决办法就是Options---->linker---->config---->edit,将0x00200000改为0x00000000,没报错了!为什么呢??

搞笑的是,用开发板时,又要改回去!哈哈,这个IAR有点傻X了。

 

 

 

第四步,要为CONTIKI按装心脏,这样它才能真正活起来为你干活!!

其实就是用1个定时器,基于CC2538CPU实现clock.c,可以使用RTC时钟定时器,也可以使用TIME0,TIME1等等,当然也可以使用ARM的CM3送的系统定时器,

好像叫做什么SYSTICK吧,只有这样etimer功能就可以使用了,OS就活了;

etimer是粗略定时事件用的,在秒级,毫秒级,几十百秒级这样子吧;rtimer是精细定时器,是US级的--它的优先级和精度最高,然后我们又要用一个定时器,去实现rtimer功能;

这个时候,CONTIKI-NG里面的例程,就是最好的老师。加油吧!!

 

 

 

时间:2021-10-19

近年来,有收到很多网友  群友讯问,说CONTIKI怎么移植的,因此特意写了一篇IAR教程,希望解决大家的疑惑。

contiki移植到STM32(细节篇)   ---->  https://www.cnblogs.com/lijianGX/p/15414013.html  (创作不容易,都是体力活)

 

posted on 2019-11-23 18:02  木子剑  阅读(1675)  评论(2)    收藏  举报