您的位置:首页 > 其它

Contiki开发7:中断与进程

2016-07-20 22:37 323 查看
Contiki开发7:中断与进程

1 引言

站在硬件与系统交互的角度看,操作系统是一个不断地响应中断的软件系统。尤其是嵌入式系统,它的进程一般都“很懒”----除非有外部的中断,否则阻塞自己。中断承载外部的刺激,进程对此作出响应,因此,这二者关系密切。

在本文中,我们以DEMO(www.rimelink.com)的按键中断和进程响应,描述Contiki系统中断与进程的设计。

2 时序

一旦涉及中断和进程,最好画出时序逻辑图,它能有效梳理这些执行流的联系,尤其是多个中断与进程交互。在本例中,因为进程只响应一个中断----按键,因此时序逻辑非常简单,如下所示:



T0时刻:按键被按下,MCU引脚拉高而产生上升沿,硬件中断;

T1时刻:中断服务程序先清除硬件中断标识,然后poll进程消息;

T2时刻:进程响应按键中断的poll消息,闪烁LED。

特别注意:T1到T2的间隔可能会很长,如果您知道原因,对于操作系统的调度已经上了一个大台阶;需要查询原因,请链接下文的3.2.1节

http://blog.csdn.net/jiangjunjie_2005/article/details/51842662

3 实现

3.1 初始化引脚

void key_Init(void)

{

   GPIO_Init(KEY_PORT, KEY_PIN, GPIO_Mode_In_FL_IT);            1

   EXTI_SetPinSensitivity(EXTI_Pin_2, EXTI_Trigger_Rising);            2

   return;

}

Line#1:设置MCU的按键引脚为外部中断;

Line#2:设置MCU的按键引脚为上升沿触发。

3.2 设计ISR

void key_IRQHandler(void)

{

   EXTI_ClearITPendingBit(EXTI_IT_Pin2);                            1

   demo_ProcKey();                                                                 2

   return;

}

Line#1:清除引脚中断标志位;

Line#2:向进程发poll消息。

3.3 注册ISR

INTERRUPT_HANDLER(EXTI2_IRQHandler,10)

{

   key_IRQHandler();                                               1

}

Line#1:在第10号中断向量表中注册按键中断ISR;

3.4 进程逻辑

PROCESS_THREAD(demo_process, ev, data)                          1

{

   PROCESS_BEGIN();                                                                2

   while (1)                                                                                    3

    {

       PROCESS_YIELD();                                                            4

if (PROCESS_EVENT_POLL == ev)                                          5

       {

           chip_TwinkleLed();                                                           6

       }

        else

       {

           ASSERT(!"demo_process(): Bad event!.\r\n");                7

       }

    }

   PROCESS_END();                                                                  8

}

Line#1:C语言宏定义,用于申明一个函数,该函数是进程的方法;深入理解此宏定义,请链接

http://blog.csdn.net/jiangjunjie_2005/article/details/44600365

Line#2和Line#8:必须将Contiki进程所有代码囊括其中。

Line#3:一个进程本质就是一个无限循环;

Line#4:进程阻塞自己,嵌入式系统的进程“很懒”,仅当有外部刺激----消息

到来时,才执行响应;

Line#5:判断消息是否为按键按下;

Line#6:翻转LED,增加亮点和快乐;

Line#7:捕捉错误消息,更多原理请链接:

        http://blog.csdn.net/jiangjunjie_2005/article/details/51869953
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息