我可以通过中断标志在同一ISR排序中操作不同的任务吗?

时间:2016-06-20 09:37:18

标签: c linux interrupt sensor interrupt-handling

我正在使用raspberry pi进行物联网项目。

我正在使用PIR传感器构建内核模块。

我想这样做:

当PIR获得RISING信号时,全局变量count每秒都会增加。

并在count == 5

时执行某些操作

如果在count变为5之前出现FALLING信号,则count重置为0

所以,我可能需要ISR函数中的标志数据,如下所示,

但我无法找到函数或系统调用。

你能帮帮我吗?

  

全球范围

static struct timer_list my_timer;
#define LED1 4
#define SENSOR1 17
static int count = 0;
static int irq_num;
  

模块初始化

static int __init module_init(void)
{
    int ret;


    gpio_request_ont(SENSOR1, GPIOF_IN, "sensor1");

    irq_num = gpio_to_irq(SENSOR1);

    ret = request_irq(irq_num, pir, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "sensor_irq", NULL);

    if(ret)
    {
        printk(KERN_ERR "Unable to request IRQ : %d\n", ret);
        free_irq(irq_num, NULL);
    }

    return 0;
}
  

ISR功能

static irqreturn_t pir(int irq, void *data)
{
    gpio_request_one(LED1, GPIOF_OUT_INIT_LOW, "led1");
    gpio_set_value(LED1, 0);

    //pseudo code
    if(flag == RISING)
    {
        init_timer(&my_timer);

        my_timer.function = my_timer_func;
        my_timer.data = LED1;
        my_timer.expires = jiffies + (1 * HZ);

        add_timer(&my_timer);
    }
    else if(flag == FALLING)
    {
        count = 0;
    }

    return IRQ_HANDLED;
}
  

计时器功能

static void my_timer_func(unsigned long data)
{
    count ++;

    if(count == 5)
    {
        gpio_set_value(LED1, 1);  //actions that I want will be here
        count = 0;
    }
}

0 个答案:

没有答案