请教下有没大师知道android 底层怎么搞个1ms的中断呢

请教下有没大师知道android 底层怎么搞个1ms的中断呢

android不是实时操作系统,在没有外部硬件支持的情况下,保证不了这样的精度。

用外部输入一个1khz的方波信号
数1000次 得到的时间差只有700ms是怎么回事呢

测试代码贴出来给大神们看看

static int my_probe(struct platform_device *pdev)
{
struct my_drvdata *ddata = NULL;
struct device_node *node = pdev->dev.of_node;
int irq;
int error = 0;
int Ret;
dev_t devno;

__inf("++++++++my_probe\n");

  if(!pdev) 
    return -EINVAL;

    gpio = of_get_named_gpio(node, "irq_gpio", 0);

__inf("%s is invoked\n", __FUNCTION__);

    devno = MKDEV(irq_major, irq_minor);
    Ret = register_chrdev_region(devno, 1, "my_driver");
    if(Ret < 0)
{
    Ret = alloc_chrdev_region(&devno, irq_minor, 1, "my_driver");
    irq_major = MAJOR(devno);
}

  if(Ret < 0)
{
    __inf("Unable to get major %d\n", irq_major);
    return -EINVAL;
}

ddata = kzalloc(sizeof(struct my_drvdata),GFP_KERNEL);
if (!ddata){
            error = -ENOMEM;
            __inf(KERN_ERR "my_probe: alloc ddata mem error\n");
            goto fail_alloc_ddata;
}

memset(ddata,0,sizeof(struct my_drvdata));    

platform_set_drvdata(pdev, ddata);

    error = gpio_request(gpio, "my-gpio");
    if (error < 0) {
        __inf("coinselector: failed to request GPIO %d,"
            " error %d\n", gpio, error);
        goto fail_gpio_request;
    }

    error = gpio_direction_input(gpio);
    if (error < 0) {
        __inf("gpio-keys: failed to configure input"
            " direction for GPIO %d, error %d\n",
        gpio, error);

        goto fail_gpio_direction;
    }

    irq = gpio_to_irq(gpio);
    if (irq < 0) {
        error = irq;
        __inf("gpio-keys: Unable to get irq number for GPIO %d, error %d\n",
            gpio, error);
        goto fail_gpio2irq;
    }

    ddata->irq = irq;

    error = request_irq(irq, my_isr, IRQF_TRIGGER_FALLING/*IRQF_TRIGGER_RISING*/, "irq-my", ddata);

    if (error) {
        __inf("gpio-my: Unable to claim irq %d; error %d\n", irq, error);
        goto fail_request_irq;
    }


    cdev_init(&cdev, &my_fops);
cdev.owner = THIS_MODULE;
if (0 != cdev_add(&cdev, devno, 1))
{
    __inf("Unable add a character device\n");
    unregister_chrdev_region(devno, 1);
    return -EINVAL;
}

my_class = class_create(THIS_MODULE, "my_driver");  
if(my_class == NULL){  
    __inf("%s create class error\n",__func__);  
    return -EINVAL; 
}

device_create(my_class, NULL, devno, NULL, "my_driver");

    setup_timer(&ddata->timer, check_timer, (unsigned long)ddata);
    mod_timer(&ddata->timer, jiffies + msecs_to_jiffies(1000*10));

    return 0;

fail_register_device:
del_timer_my(&ddata->timer);
free_irq(irq, ddata);
fail_request_irq:

fail_gpio2irq:
fail_gpio_direction:
gpio_free(gpio);
fail_gpio_request:
platform_set_drvdata(pdev, NULL);
//fail_alloc_input:
kfree(ddata);

ddata = NULL;
fail_alloc_ddata:
return error;
}

static irqreturn_t my_isr(int irq, void *dev_id)
{
tttcount++;
if (tttcount == 1000)
{
tttcount = 0;
do_gettimeofday(&currtime);
tttactive = currtime.tv_usec;
}

return IRQ_HANDLED;

}

static void check_timer(unsigned long _data)
{

mod_timer(&time_check, jiffies + msecs_to_jiffies(10));

if (tttactive!=0)
{
__inf("tttactive = %ld\n",tttactive);
tttactive = 0;
}

return;
}


图片说明图片说明