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、

Linux驱动设计编译错误信息集锦的更多相关文章

  1. linux驱动调试--段错误之oops信息分析

    linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id= ...

  2. Linux驱动设计—— 中断与时钟

    中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...

  3. linux下将编译错误输出到一个文本文件

    linux下将编译错误输出到一个文本文件 command > filename 把把标准输出重定向到一个新文件中 command > > filename 把把标准输出重定向到一个文 ...

  4. 利用huson的日志获取编译错误信息的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用hudson编译一百多个VC工程,输出的日志有6M之大,摆在我面前的一个问题是如何利用这个日志信息来获取编译错误信 ...

  5. Linux驱动设计—— 内核模块(一)

    Linux内核理论基础 组成Linux内核的5个子系统:进程调度(SCHED)/内存管理(MM)/虚拟文件系统(VFS)/网络接口(NET)/进程间通信(IPC). 进程调度(SCHED) 在设备驱动 ...

  6. VS2012编译错误信息,错误列表却没显示

    今天在写代码的时候,发现VS有编译错误,在错误列表里面却没有显示错误信息,百思不得其解. 后来终于发现,错误列表弄了个筛选,所以就看不到错误信息了,晕死.有遇到该问题的,可以参考下.

  7. Linux驱动设计——并发与竞态控制

    并发的概念:多个执行单元同时.并行被执行. 共享资源:硬件资源(IO/外设等),软件上的全局变量.静态变量等. 四种并发控制机制(对共享资源互斥的访问):原子操作.自旋锁(spinlock).信号量( ...

  8. Linux驱动设计——字符设备驱动(一)

    Linux字符设别驱动结构 cdev结构体 struct cdev { struct kobject kobj; struct module *owner; const struct file_ope ...

  9. Linux驱动设计——内存与IO访问

    名词解释 内存空间与IO空间 内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内 ...

随机推荐

  1. [转]diskpart命令

    from: http://support.microsoft.com/kb/300415/zh-cn Diskpart 与许多命令行实用工具不同,原因是它不以单行模式操作.相反,当您启动该实用工具后, ...

  2. hashmap和hashtable,arraylist和vector的区别

    hashmap线程不安全,hashtable线程安全 hashmap允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同. ...

  3. unix shell-01 file

    1 一个文件有三种访问方式: 1.读,可以显示该文件的内容 2.写,删除或者编辑这个文件 3.执行,如果该文件时一个shell脚本或程序 按照文件所针对的用户,用户可以分为三种: 1.文件属主,即该文 ...

  4. 关于Json处理的两个实例

    <script> var value1="{\"layer_datum\":{\"holdId\":\"dcdm\", ...

  5. xml文件有误

    Unable to start activity ComponentInfo{com.anzi.jmsht.scripturelibrary/com.anzi.jmsht.scripturelibra ...

  6. metaprogramming笔记

    动态多态与静态多态 动态多态:允许我们通过单个基类指针或引用处理多个派生类型的对象. 模板元编程中强调静态多态,允许不同类型的对象以同样的方式被操纵,只要它们支持某种共通的语法即可. 动态多态,连同& ...

  7. eclipse GIT使用

    新建工程(要和GIT上同名,同类型)->右键->team->add to index->commit->更新config文件->remote: fetch from ...

  8. post&get请求总结

    1.将get获取的数据,UrlDecode后返回 public static string SendGet(string url) { HttpWebRequest httpWebRequest = ...

  9. [转]<Unity3D>Unity3D的四种坐标系

    http://blog.csdn.net/zuoyamin/article/details/8813424 World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标 ...

  10. LeetCode Maximum Subarray (最大子段和)

    题意: 给一个序列,求至少含一个元素的最大子段和? 思路: 跟求普通的最大子段和差不多,只不过需要注意一下顺序.由于至少需要一个元素,所以先将ans=nums[0].接下来可以用sum求和了,如果小于 ...