请教下有没大师知道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;
}