Contiki开发7:中断与进程
2016-07-20 22:37
323 查看
Contiki开发7:中断与进程
在本文中,我们以DEMO(www.rimelink.com)的按键中断和进程响应,描述Contiki系统中断与进程的设计。
![](https://img-blog.csdn.net/20160720223614223)
T0时刻:按键被按下,MCU引脚拉高而产生上升沿,硬件中断;
T1时刻:中断服务程序先清除硬件中断标识,然后poll进程消息;
T2时刻:进程响应按键中断的poll消息,闪烁LED。
特别注意:T1到T2的间隔可能会很长,如果您知道原因,对于操作系统的调度已经上了一个大台阶;需要查询原因,请链接下文的3.2.1节
http://blog.csdn.net/jiangjunjie_2005/article/details/51842662
{
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的按键引脚为上升沿触发。
{
EXTI_ClearITPendingBit(EXTI_IT_Pin2); 1
demo_ProcKey(); 2
return;
}
Line#1:清除引脚中断标志位;
Line#2:向进程发poll消息。
{
key_IRQHandler(); 1
}
Line#1:在第10号中断向量表中注册按键中断ISR;
{
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
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
相关文章推荐
- contiki udp 使用
- windows cc2530 6lowpan(contiki)报文监控
- Packetbuffer Basics (包缓冲区基础知识)
- Contiki 实例hello_world详细剖析
- 用Doxygen和Graphviz给Contiki文档添加类图和调用图
- cc2650鼓捣教程-2.一切的开始 Hello world程序!
- cc2650鼓捣教程-1.硬件选型与contiki 6lowpan环境配置
- 基于keil的contiki系统的stm32移植
- 对contiki原理的一些理解
- Contiki 配置参数“技巧”说明
- Contiki学习平台推荐
- Contiki高级程序设计
- PC机与嵌入式设备通信协议设计原则
- 怎样把LoRa终端功耗降到极致
- 无线通信设计秘密四:唤醒下发算法
- 嵌入式研发项目管理的方法论
- Contiki高级程序设计(二)
- Contiki高级程序设计(三)
- Contiki 了解(2)-HelloWorld的编译过程
- Contiki 了解(1)