zoukankan      html  css  js  c++  java
  • Linux驱动设计编译错误信息集锦

    1、warning: passing argument 2 of 'request_irq' from incompatible pointer type

    http://blog.sina.com.cn/s/blog_7321be1101012gek.html

    今天在些key的driver的时候。。。写完了编译出现一个warmming如下:
    warning: passing argument 2 of 'request_irq' from incompatible pointer type

    我的request_irq函数调用如下:
    if(request_irq(key_info->irq_no, key_eint_handler, IRQF_DISABLED,"Mini2440_Key", &i))
    {
        return -1;
    }
    key_eint_handler函数的原型如下:
    static void key_eint_handler(int irq, void *dev_id,struct pt_regs *regs)

    问题出在key_eint_handler函数的原型,
    应该由:
    static void key_eint_handler(int irq, void *dev_id,struct pt_regs *regs)//错误的写法
    改为:
    static irqreturn_t key_eint_handler(int irq, void *dev_id)//正确写法

    原因从内核源码入手。。。
    linux/include/linux/interrupt.h, line 60 左右有这么一个定义
    typedef irqreturn_t (*irq_handler_t)(int, void *);
    这个定义是什么意思呢?
    它是指:定义一种函数指针类型irq_handler_t, 这种函数的返回类型为irqreturn_t,参数列表为int, void*
    再来看request_irq的函数声明部分
    kernel/irq/manage.c:
    int request_irq(
            unsigned int irq,
            irq_handler_t handler,
            unsigned long irqflags,
            const char *devname,
            void *dev_id)
    request_irq的第二个参数是handler函数,类型是irq_handler_t,
    也就是说:我定义的handler函数返回类型为irq_handler_t,
    结合最上面说的
    typedef irqreturn_t (*irq_handler_t)(int, void *);
    那么。。。
    handler函数应该是写成:
    static irqreturn_t key_eint_handler(int irq, void *dev_id)//正确写法
    2个参数。。。返回类型为irqreturn_t才是正确的!

    2、WARNING: "__bad_udelay" undefined!

    原因:udelay()的参数过大。

    内核中对udelay()的定义:

    ......

    #define MAX_UDELAY_MS 2

    #define udelay(n)

      (__builtin_constant_p(n)?                

        ( (n)>(MAX_UDELAY_MS *1000)?__bad_udelay() : __const_udelay((n)*((2199023U*HZ)>>11)) ):

        __udelay(n) )

    ......

     

    3、

  • 相关阅读:
    13-02 Java 数组高级算法,Arrays类
    从0移植uboot (二) _uboot启动流程分析
    Linux input子系统编程、分析与模板
    跟着内核学框架-从misc子系统到3+2+1设备识别驱动框架
    Linux驱动技术(八) _并发控制技术
    Linux驱动技术(七) _内核定时器与延迟工作
    Linux驱动技术(六) _内核中断
    Linux驱动技术(五) _设备阻塞/非阻塞读写
    Linux驱动技术(四) _异步通知技术
    Linux驱动技术(三) _DMA编程
  • 原文地址:https://www.cnblogs.com/kwseeker-bolgs/p/4477870.html
Copyright © 2011-2022 走看看