Linux驱动(2)

6. 中断
  1. 概念:

    中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。中断可以分为:内部中断和外部中断,内部中断来源于CPU内部,外部中断来源自CPU外部。

  2. 中断上半部:

    1. 也称为中断顶半部,用于完成尽量少的比较紧急的功能,通常被设置为不可被新中断打断。

    2. 使用场景:

      • 要处理的内容不希望被其他中断打断

      • 要处理的任务对时间敏感

      • 要处理的任务与硬件有关

  3. 中断下半部:

    1. 也称为中断底半部,用来完成中断事件绝大多数任务,可以被新的中断打断,底半部相对来说并不是非常紧急,而且相对比较耗时。

    2. 使用场景:

      • 完成并不是非常紧急的耗时的任务

      • 可以被打断

    3. 中断下半部四种实现方式:

      1. 软中断:软中断和tasklet运行于中断上下文,不允许睡眠

      2. tasklet:tasklet的实现是靠软中断,因为中断中不能长时间执行某个任务所以要快进快出,且不允许睡眠

      3. 工作队列:工作队列运行在进程上下文,所以允许睡眠,哪怕中断执行完后,有可能工作队列还未执行

7. 内核定时器
  1. **概念:**在内核中表示系统一秒所对应的节拍数量,目前为100。在内核中的.config中定义,jiffies表示系统节拍,记录系统启动到当前累加的数字,如果想通过内核定时器计时则定时时间为:jiffers + (N*100)定时时间到达后可以调用回调函数。

  2. 定时器驱动代码

    复制代码
    #include <linux/fs.h>
    #include <linux/module.h>
    #include <linux/cdev.h>
    #include <linux/init.h>
    #include <linux/timer.h>
    
    
    static void timeout(unsigned long data)
    {
        pr_info("timeout ok!\n");
    
        return;
    }
    
    static DEFINE_TIMER(mtimer, timeout, 0, 0);
    
    static int __init kernel_timer_init(void)
    {
        init_timer(&mtimer);//初始化定时器
        add_timer(&mtimer);//激活定时器
        mod_timer(&mtimer, jiffies + msecs_to_jiffies(200));//jiffies表示的是当前时间,当前时间超过1s
        pr_info("add timer success\n");
        return 0;
    }
    
    static void __exit kernel_timer_exit(void)
    {
        del_timer(&mtimer);//删除定时器
    
        pr_info("del timer success\n");
    
        return;
    }
    
    module_init(kernel_timer_init);
    
    module_exit(kernel_timer_exit);
    
    
    MODULE_LICENSE("GPL");
  3. 延时与睡眠的区别

    Linux内核实现了延时函数,delay相关函数是忙等待,一直占用CPU资源。sleep相关函数不会一直占用CPU资源,会在睡眠的过程中释放CPU,让进程挂起,但是Linux系统是非实时操作系统,所以当CPU切换出该进程到CPU切换回该进程中间的时间一般大于睡眠设定的时间。

    函数名 功能
    ndelay 忙等待延时ns
    udelay 忙等待延时us
    mdelay 忙等待延时ms
    msleep 睡眠ms
    msleep_interruptible 可中断睡眠ms
    ssleep 睡眠s
相关推荐
m0_587383001 小时前
碰碰好评卡功能落地实战 从需求梳理到上线部署全流程实操指南
java·linux·服务器·前端·javascript·vue.js·人工智能
壹玖玖肆1 小时前
openGauss 7.0 Docker 部署 + 跨版本迁移全流程(aarch64)
运维·docker·容器
筑梦之路1 小时前
Alibaba Cloud Linux 4 制作 Ansible RPM包实践(离线可复用)——筑梦之路
linux·运维·ansible
lzqrzpt1 小时前
LED驱动电源选型核心参数解析与工程适配准则
python·单片机·嵌入式硬件
承渊政道1 小时前
Linux网络学习【应用层自定义协议与序列化实战:从手写序列化与反序列化到深入理解进程间关系与守护进程】
linux·网络·学习·ubuntu·json·序列化与反序列化
无垠的广袤1 小时前
【ED-CLAWBOX】智能家居枢纽
linux·物联网·docker·智能家居·树莓派·aiot·home assistant
玩AI的奶茶1 小时前
什么情况适合租算力?一张场景对照表,加三个自测问题
大数据·linux·服务器·数据库·人工智能·python
IT利刃出鞘1 小时前
Linux权限--adduser和useradd的区别
linux·运维·服务器
天意__1 小时前
Android手机上部署Linux服务器 在Termux里安装Ubuntu
android·linux·服务器