Contiki系统完全采用C语言开发,可移植性好,能够在各种微处理器上运行,在ARM硬件平台的运行也得到验证。目前,contiki相关的资料不是很多,对于初学者来说。可以参考Jelline大神的博客:http://blog.chinaunix.net/uid-9112803-id-2978041.html;也可以参考http://www.iotdev.net/forum.php上的一些资料。本篇只实现了在STM32L073单片机移植contiki系统后控制LED灯的闪烁。
首先新建一个流水灯工程。在此工程基础上进行Contiki系统移植。找到Contiki源码,源码可以在http://www.contiki-os.org/下载,或通过其他途径下载。将解压后的整个contiki的源码复制到新建的工程中。
在工程中新建一个USER文件夹,用来存放Contiki的配置文件。
1)将contiki-3.0\platform\stm32test目录下的contiki-conf.h头文件复制到USER文件夹下。
2) 将contiki-3.0\cpu\arm\stm32f103目录下的clock.c文件和rtimer-arch.h头文件复制到USER文件夹下。
开始在工程中添加文件以及包含头文件。添加Contiki_SYS和Contiki_LIB。由于只实现流水灯功能,需要添加的文件较少。
1)将Contiki-3.0\core\sys文件下的arg.c、autostart.c、energest.c、etimer.c、process.c、timer.c文件添加到Contiki_SYS.
2)将Contiki-3.0\core\lib目录下的list.c添加到Contiki_LIB。
然后将头文件路径包含以下:
相关的文件已复制完成,接下来要进行一些代码的更改。先编译下工程,报错提示没有clock_time()函数,这个函数
的主要作用是获取当前的滴答定时器值。在stm32l0xx_hal.c中,已有定义
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
因此,用HAL_GetTick()函数代替clock_timer 函数。
要将Contiki_SYS 下etimer.c文件和timer.c文件中的clock_time()函数全部替换为HAL_GetTick()函数。全部替换完成后,再次编译没有出错。
添加定时器任务处理函数。在Stm32l0xx_hal.c文件中,添加几个头文件。
#include
#include
#include
接着在HAL_IncTick()函数中uwTick++;后面添加如下代码:
if(etimer_pending() && etimer_next_expiration_time() <= uwTick) {
etimer_request_poll();
/* printf("%d,%d\n", clock_time(),etimer_next_expiration_time ()); */
}
再次编译,没有出错。接下来,在main.c中添加头文件
#include
#include
#include
#include
然后添加LED循环闪烁任务:
PROCESS(blink_process, "Blink");
AUTOSTART_PROCESSES(&blink_process);
PROCESS_THREAD(blink_process,ev,data)
{
PROCESS_BEGIN();
while(1)
{
static struct etimer et;
etimer_set(&et,1000);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
PROCESS_END();
}
在main函数中,while(1)循环开始之前添加contiki有关的初始化函数,并启动任务。
process_init();
process_start(&etimer_process,NULL);
process_start(&blink_process,NULL);
在while(1)中,调用process_run()函数。至此,移植工作已完成,编译下载后,在ST开发板NUCLEO-L073RZ开发板上验证成功。