使用KEIL MDK环境,移植到STM32L051C8单片机上,根据网上资料与里程总结如下:
1、创建STM32工程。
2、复制contiki-3.0目录下,core、cpu文件夹到工程目录下
3、保留core下sys文件夹和.h文件,其他文件夹删除
4、保留cpu\arm\stm32f103\clock.c文件,其他删除
5、复制contiki-3.0\platform\stm32test\contiki-conf.h配置文件到core目录下
目录如下
6、添加文件到keil工程,.c与.h
7、更改clock函数
a)系统时钟中断函数更改
b)系统时钟初始化函数更改
更改后如图
8、配置contiki
在contiki-conf.h文件中添加#define AUTOSTART_ENABLE1u,使能进程自动运行功能
其他配置日后在一点点研究
9、编译工程
会有错误,屏蔽掉找不到的头文件。
直到编译成功
10、编写进程例子
编写两个进程,一个进程打印hello ,另一个进程打印world,间隔时间1s打印一次,通过串口打印。
a)先声明注册进程
PROCESS(PrintfHello_ps, "Hello");
PROCESS(PrintWorld_ps, "World");
b)自动启动的进程放到自动启动数组中
AUTOSTART_PROCESSES(&PrintfHello_ps, &PrintWorld_ps);
c)创建事件标志变量
static process_event_t event_flag;
d)打印hello线程
PROCESS_THREAD(PrintfHello_ps, ev, data)
{
//线程开始
PROCESS_BEGIN();
//定义一个事件定时器
static struct etimer timer;//设置事件定时器时间,并绑定为当前进程,溢出时间1s
etimer_set(&timer, 1*CLOCK_SECOND );
printf("PrintfHello_ps start\n");
//分配一个新的事件
event_flag = process_alloc_event();
while (1)
{
//等待定时器超时事件
PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER);
//打印 hello
printf("hello ");//投递事件,把event_flag这个事件投递到PrintWorld_ps进程,数据参数为NULL
process_post(&PrintfHello_ps, event_flag, NULL);
//复位定时器,重新开始计时
etimer_reset(&timer);
}
PROCESS_END();
}
e)打印world进程
PROCESS_THREAD(PrintWorld_ps, ev, data)
{
PROCESS_BEGIN();
printf("PrintfWorld_ps start\n");
while (1)
{
//等待event_flag事件
PROCESS_WAIT_EVENT_UNTIL(ev == event_flag);
//打印world.
printf("world.\n");
}
PROCESS_END();
}
f)主函数
int main(void){
/* Configure the system clock to 32 MHz */
SystemClock_Config();
PeripheralClock_Config();
BspHardwareInit();
//contiki时钟初始配置
clock_init();
//进程初始化
process_init();
//开始事件定时器
process_start(&etimer_process, NULL);
//自动启动线程
while(1) {
do {
} while(process_run() > 0);
idle_count++;
/* Idle! */
/* Stop processor clock */
/* asm("wfi"::); */
}
return 0;
}
11、输出结果