爆光我的资源:先在*宝要入手一个开发板,开发板的芯片是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 (创作不容易,都是体力活)
浙公网安备 33010602011771号