STM32移植contiki入门之二:简单编程点亮LED灯

来源:互联网 发布:欲望都市聊天软件 编辑:程序博客网 时间:2024/05/12 18:25

本篇介绍一个contiki下最简单的LED点亮程序。

PS:有人会问,为什么不首先打印hello world到串口?这是因为我觉得串口的程序比较难,在后面介绍会比较好。

在介绍本章之前,我先介绍一下contiki的事件驱动和protothread机制


Contiki两个主要机制:事件驱动和protothread机制,前者是为了降低功耗,后者是为了节省内存。

一、事件驱动

    嵌入式系统常常被设计成响应周围环境的变化,而这些变化可以看成一个个事件。事件来了,操作系统处理之,没有事件到来,就跑去休眠了(降低功耗),这就是所谓的事件驱动,类似于中断。

二、protothread机制

    传统的操作系统使用栈保存进程上下文,每个进程需要一个栈,这对于内存极度受限的传感器设备将难以忍受。protothread机制恰解决了这个问题,通过保存进程被阻塞处的行数(进程结构体的一个变量,unsiged short类型,只需两个字节),从而实现进程切换,当该进程下一次被调度时,通过switch(__LINE__)跳转到刚才保存的点,恢复执行。整个Contiki只用一个栈,当进程切换时清空,大大节省内存。

            怎么说呢?简单的讲:contiki系统维护着一个事件队列,所有到来的事件都被加到该队列中,contiki系统按照一定的顺序处理这些事件。同时,contiki超强的“时间概念”为每个事件分配一个固定的时间间隔,如果一个事件的时间到来,那么执行该事件,时间结束,则转而执行其他的事件。

       按照以前操作系统的概念,那么转到其他事件执行的时候,需要保存本事件的一些数据,例如变量,寄存器值等。但是contiki独特的protothread机制允许不保存这些,只保存事件(或者说进程,或者说程序)被阻塞的行数(我将其称为断点),这样在下次轮到该事件执行时,继续从该断点开始执行,直至结束。

 

先给出整个程序,让大家有个概念。

PROCESS(led_on_process, "led on");//见注一

AUTOSTART_PROCESSES(&led_on_process);  //注二

PROCESS_THREAD(led_on_process, ev, data) //注三

    PROCESS_BEGIN(); //注四

     FIO1DIR2 = 0x01 << 18;

  FIO5DIR0 = 0x07 << 2;

    /*   set LED pin as low level */

  FIO1SET2 = (~0x01) << 18;

  FIO5SET0 = (~0x07) << 2;

/*这里没什么好说的,初始化LED的控制寄存器,将其设置为输出模式,然后将相应的位置“0”,这样就能点亮LED灯了*/

    PROCESS_END(); 

}

int main(void)

{

  SystemInit ();//这里没什么可以说的,初始化CPU时钟,外围时钟,EMC时钟等

  clock_init();//注五

  process_init();//注六

     procinit_init();

  process_start(&led_on_process,NULL);  //注七

  autostart_start(autostart_processes);

 while (1)

   {

     do{

  }while (process_run() > 0);

 }

}

注一: PROCESS(led_on_process, "led on");相关于函数的声明
注二: AUTOSTART_PROCESSES(&led_on_process);是指该任务自动启动,当然也可以调用process_start函数启动任务。
注三:PROCESS_THREAD(led_on_process, ev, data) ,可以把他看成是C语言中的函数体,contiki系统执行任务的实体就是这里。
注四:PROCESS_BEGIN宏和PROCESS_END宏,contiki规定,process的执行,必须从process_begin开始,以process_end结束
注五,注六:这里是关于contiki系统时间(也就是前面我们说的,contiki为每个事件分配的时间),以及事件队列初始化等,暂时不做介绍,在后面的章节中,会花很大的篇幅介绍。
注七:process_start这里开始一个事件,相当于我们C语言中的函数调用。autostart_start也有启动进程的功能,不过他是在系统开始之后,自动的启动一些需要启动的进程。
下图是运行后开发板的结果,我们可以看到我们控制的四个LED灯都亮了。(爪机没有带闪光,拍的很不清晰,各位不要介意)
 
 
原创粉丝点击