Contiki OS 如何处理外部中断?

How does Contiki OS process external interrupts?

可以在外围传感器生成的外部中断上唤醒传感器节点。下面解释一下ContikiOS是如何处理外部中断的。在 ATmega128RFA1 的情况下,外部中断 INT0INT4 甚至能够从 深度睡眠 .

中唤醒 MCU

contiki 中进程和中断的概述在这里:

https://github.com/contiki-os/contiki/wiki/Processes

http://de.slideshare.net/DingxinXu/contiki-introduction-iifrom-what-to-how

http://senstools.gforge.inria.fr/doku.php?id=os:contiki

contiki 利用 MCU 的 ISR 向量

此示例适用于 ATmega128RFA1。外部中断是 PD0 上的 INT0(引脚 25)

在 ISR 中,唯一的操作是 轮询关联的 contiki 进程。这会在内部向进程发送 轮询请求 。该进程捕获 轮询请求,然后执行与外部中断相关的计算。此过程会阻止 ISR 中的长期持续计算。

ISR :

ISR(INT0_vect)
{            

  process_poll(&extern_interupt_process);
  PRINTF("interrupt was triggered on INT0... \n");  

}

启用 INT0 上的外部中断:

EIMSK = 0xb00000000; //disable interrupts before changing EICRA EICRA |= 0xb00000011; //EICRA 0000|0011 rising edge triggers interrupt int0 EIMSK |= 0xb00000001; // enable INT0(数据表第 219 页)

进程:

PROCESS(extern_interupt_process, "external_interrupt_process");

PROCESS_THREAD(extern_interupt_process, ev, data)
{


  PROCESS_BEGIN();


  while(1) {

    PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL);

    // process data here 

           }


  PROCESS_END();

}

使用 autostart_process() 启动 extern_interrupt_process 或在 contiki-main.c

中手动启动它

如果传感器有一个集电极开路输出激活内部上拉电阻并设置中断控制寄存器以触发低电平中断(见此:wiring a sensor with open collector output)

DDRD  &= 0xb00000000;   // PD0 as input
PORTD |= 0xb00000001;  // enable internal pull-up on PD0
EIMSK &= 0xb00000000; //disable interrupts before changing EICRA
EICRA &= 0xb00000000; //EICRA 0000|0000 low-level triggers interrupt on int0
EIMSK |= 0xb00000001; // enable INT0` (datasheet p. 219 ff)

http://en.wikipedia.org/wiki/Open collector