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