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、

时间: 2024-12-05 20:40:22

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

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

linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id=4923447 1. 分析coredump打印信息 2. 确定发生错误的函数 看发生错误的地方的函数和pc PC is at segment_test_open+0x14/0x1c [segdrv] 看pc值: pc : [<7f000014>]    lr : [<800d958c>

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

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

关于Linux下C编译错误(警告)cast from &#39;void*&#39; to &#39;int&#39; loses precision

char *ptr; //此后省略部分代码 if( (int)ptr==-1 ) //出错地方 那句话的意思是从 void* 到 int 的转换丢失精度,相信看到解释有些人就明白了, 此问题只会出现在X64位的Linux上,因为在64位的机器上指针占用8个字节,int 占用四个字节,所以才会出现这样的问题, 解决方法: (long)ptr == -1 就好了 关于Linux下C编译错误(警告)cast from 'void*' to 'int' loses precision

在linux内核文件中添加自己的驱动,添加自己的linux驱动,编译自己的linux驱动程序方法和例子图文

此文章为done原创,转载请写明出处,尊重原创. 写这个文章,我参考了网上的一些博客: http://bbs.chinaunix.net/thread-3634524-1-1.html http://www.bkjia.com/gjrj/800182.html 也参考了参考了 <linux驱动开发详解>3.4章节,实现建立自己驱动目录. 文章中的驱动范例是:linux设备驱动开发详解第二版 的 global mem tow,宋宝华主编的书本光盘源码 在我们学习了linux的驱动之后,我们都想编

Linux驱动设计—— 驱动调试技术

参考博客与书籍: <Linux设备驱动开发详解> <Linux设备驱动程序> http://blog.chinaunix.net/uid-24219701-id-2884942.html 对于驱动程序设计来说,核心问题之一就是如何完成调试.当前常用的驱动调试技术可分为: 1. 打印调试 printk 重定向控制台消息 消息记录 开启和关闭消息速度限制 打印设备编号 2. 调试器调试 gdb kdb内核调试器 kgdb补丁 3. 查询调试 使用/proc文件系统 ioctl方法 4.

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

名词解释 内存空间与IO空间 内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内存就被用于PCI或者AGP及系统桥设备的使用上面,主机可以像访问系统内存一样访问这些高端内存,这样对于扩展的设备有更大的空间. Linux用户空间与内核空间 IO空间是X86系统上面的专用空间,现在的IO空间大小是64K字节,从0x0000到0xffff,可以供设备使用,比如南桥很多的设备就是挂在I

第1个linux驱动___编译空壳驱动程序

在上一篇博文中我们已经了解到整个系统中各个层次之间是如何协调如何工作的,应用层发出的命令经由内核下达到驱动层,从而达到操作硬件层的目的. 我们先回顾上上篇博文最后成型的"空壳驱动程序"first_drv.c中的代码: #include <linux/module.h> #include <linux/init.h> static int __init first_drv_init(void) {        printk(KERN_INFO"hell

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

中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只要保证申请了正确的中断号及编写了正确的中断处理函数即可. 中断的宏观分类 1.硬中断 由系统硬件产生的中断.系统硬件通常引起外部事件.外部事件事件具有随机性和突发性,因此硬件中断也具有随机性和突发性. 2.软中断 软中断是执行中断指令时产生的.软中断不用外设施加中断请求信号,因此软中断的发生不是随机

Delphi编译错误信息一览表

';' not allowed before 'ELSE'       →       ElSE前不允许有“;” '<clause>' clause not allowed in OLE automation section       →       在OLE自动区段不允许“<clause>”子句 '<name>' is not a type identifier       →       <name>不是类型标识符 '<name>' not