contiki学习笔记01
contiki
操作系统是基于事件驱动的,系统运行可以看作是在不停的处理事件的一个过程。它给我印象最深刻的地方是设计的太巧妙了,不像ucos
以及RTX
等操作系统在切换任务时需要进行压栈和出栈等操作,它切换“任务”(这里应该叫进程,process)是利用C语言关键字switch
来的(这里说的有点片面,不但可以利用switch
来,还可以用另外一种方式来实现,不过编译器得支持C99才行)。先来看一下主函数:
int main()
{
bsp_init(); /* 外设初始化 */
clock_init(); /* 系统时钟初始化 */
process_init(); /* 进程初始化 */
process_start(&etimer_process, NULL); /* 启动系统进程 */
autostart_start(autostart_processes); /* 启动用户进程 */
while (1)
{
do
{
} while (process_run() > 0);
}
}
上面就是主函数部分,非常简洁明了。下面主要来看一下process_run()
这个函数:
int process_run(void)
{
/* 处理轮询事件,可以理解成最高优先级事件 */
if (poll_requested)
{
do_poll();
}
/* 处理队列中的一个事件 */
do_event();
/* 返回剩下未处理的事件+轮询的个数 */
return nevents + poll_requested;
}
poll_requested
是轮询标志位,当有一个需要尽快处理的进程时候,就把这个变量置一;然后处理队列中的事件,每次只处理一个事件。