【问题标题】:How does Contiki OS process external interrupts?Contiki OS 如何处理外部中断?
【发布时间】:2016-02-23 08:02:34
【问题描述】:

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

【问题讨论】:

    标签: process operating-system interrupt avr-gcc contiki


    【解决方案1】:

    这里有关于 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

    【讨论】:

    • 在某些平台上,您还需要清除一些状态寄存器位,以避免在执行中断处理程序后返回睡眠模式。
    猜你喜欢
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多