kwseeker

学编程:找代码,读代码,改代码,写代码;少看书。但少看不是不看,看一本书要限制在一天内。任务是通读书中主要的概念,明白大致是干什么用的,形成一个大概的框架;然后一周内干掉书中全部代码,代码不理解再浏览书中相关章节,注意是浏览。或者刷博客。代码实在刷不懂,可以先刷后面,待日后重新刷;因为书中代码有些部分可能出自后面的章节。代码总是在多次刷过之后,拨开乌云见日月的。。。

导航

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、

 

posted on 2015-05-04 22:29  kwseeker  阅读(482)  评论(0编辑  收藏  举报