linux驱动开发-中断分层机制笔记6(代码片段)

hntea-hong hntea-hong     2023-03-19     117

关键词:

中断分层机制—tasklet

中断上下文

  • 因为中断产生时会打断当前占用CPU的进程,为尽量提高进程的运行效率,不会卡顿,从而使中断服务程序分为顶半部和底半部两个部分

  • 顶部分是用来处理应急事件,特别是硬件相关;之后将CPU使用权交个当前进程

  • 底部分(不着急处理的,任务繁琐的)则等待CPU空闲时,既内核线程觉得有能力运行时才去执行。

注意事项

  • i. 中断上下文代码绝对不可以停止运行

  • 中断处理程序不能调用schedule_timeout()等随眠函数放弃CPU

  • 在中断处理函数中调用一个内核API之前,应该仔细分析,确保内部不会触发阻塞等待.

  • 为了中断处理函数中保存临界区,不能使用互斥体,应该使用自旋锁代替互斥体,只有在不得不用的时候采用

  • 中断处理函数不能与用户空间直接交互数据,应为它们经由进程上下文与用户空间建立连接

  • 中断函数不必是可重用的

  • 中断函数可以被更高优先级IRQ的中断打断

a) 快速中断不可被打断:既执行快速中断时,处理器所有中断都会被屏蔽

b) 同步中断:有处理器本身执行某些指令产生;如:

  • 异常:用于报告严重的运行时错误

    软中断:

2、中断分层实现,底半部处理方法

a) 任务:struct tasklet

b) 工作队列: struct work_struct

c) 软中断:

3、tasklet 编程实现相关函数

a) 数据结构:

struct tasklet_struct


    struct tasklet_struct *next;

    unsigned long state;

    atomic_t count;

    void (*func)(unsigned long); /*需要驱动完成的函数*/

    unsigned long data; /*传递给func函数?*/

;

b) 主要特征

   Main feature differing them of generic softirqs: tasklet

   is running only on one CPU simultaneously.

   Main feature differing them of BHs: different tasklets

   may be run simultaneously on different CPUs.

c) 定义tasklet:struct tasklet my_tasklet

d) 定义处理函数:void my_tasklet_func(unsigned long)

e) 关联tasklet 和处理函数:

 DECLARE_TASKLET(my_tasklet,my_tasklet_func,data);

解释:将my_tasklet 与处理函数绑定,并将data作为参数传递给my_task_func

f) 调度(交给系统自行处理):tasklet_schedule(&my_tasklet)

4、使用tasklet作为中断底半部的设备驱动程序模板

/*1.定义结构体*/

struct tasklet_struct my_tasklet;

/*2.编写底半部函数*/

void xxx_do_tasklet(unsigned long x)



...



/*3.关联函数*/

DECLARE_TASKLET(my_tasklet,xxx_do_tasklet,0);

/*4.中断处理顶半部*/

static irqreturn_t xxx_interrupt(int irq, void *dev_id)



...

/*提交takslet并启动调度*/

  tasklet_schedule(&my_tasklet);

...



/*5.模块加载*/

module_init(xxxx)



  .....

/*申请中断*/

       ......



/*6.模块卸载*/

module_exit(yyyy)



/*释放中断*/

Takslet驱动测试–【无中断测试】

/**********************************

作者:hntea

时间:2016/3/14

驱动功能:tasklet 模板功能测试

**********************************/



#include<linux/init.h>

#include<linux/module.h>

#include<linux/interrupt.h>

#include<linux/time.h>

/*定义 tasklet */

struct tasklet_struct my_tasklet;



/*定义服务函数,任务提交后只执行一次*/

static void my_taskfunc(unsigned int x)



    printk("I am taskfunc\\n");

    printk("My argument is:%d\\n",x);





/*关联结构体和服务函数*/

DECLARE_TASKLET(my_tasklet,my_taskfunc,1);

static int irqTask_init(void)



     tasklet_schedule(&my_tasklet); /*一般提交任务在中断处理函数中提交,实现分层*/

    return 0;



static void irqTask_exit(void)






MODULE_LICENSE("GPL");
MODULE_AUTHOR("Hntea");
module_init(irqTask_init);
module_exit(irqTask_exit);

linux驱动开发-中断分层机制笔记6(代码片段)

中断分层机制—tasklet中断上下文因为中断产生时会打断当前占用CPU的进程,为尽量提高进程的运行效率,不会卡顿,从而使中断服务程序分为顶半部和底半部两个部分顶部分是用来处理应急事件,特别是硬件相关... 查看详情

linux驱动开发-中断分层机制_工作队列笔记7(代码片段)

中断分层机制_工作队列1.工作队列概念:a)任务推后执行b)被推后的任务由“内核线程”执行c)允许重新调度和睡眠d)这些被推后的工作组成一个双向链表,既称为工作队列2.运行机制注释:1.每个CPU都有独立的工作队列... 查看详情

linux驱动开发-中断处理模型笔记5(代码片段)

中断处理模型1、概念解析a)I/O操作的不确定因素以及处理器和I/O设备之间速度不匹配,设备往往通过某种硬件信号异步唤起处理器的注意b)这些硬件信号就称为中断,每个设备都被分配了一个相关的标示符,别称为中... 查看详情

linux驱动开发异步通知(代码片段)

...序主动查询设备的使用情况。Linux使用异步通知机制实现驱动程序主动向应用程序发出可访问通知,然后应用程序从驱动程序中读取或写入数据。阻塞、非阻塞或异步通知没有优劣脂粉,根据实际需求选择合适的处理方法... 查看详情

linux驱动开发异步通知(代码片段)

...序主动查询设备的使用情况。Linux使用异步通知机制实现驱动程序主动向应用程序发出可访问通知,然后应用程序从驱动程序中读取或写入数据。阻塞、非阻塞或异步通知没有优劣之分,根据实际需求选择合适的处理方法... 查看详情

linux驱动开发中断(代码片段)

中断函数中断号中断号用来区分不同的中断,Linux内核使用一个int变量表示中断号。中断号也称为中断线。中断API函数request_irqLinux内核使用中断需要申请,request_irq用于申请中断。request_irq会导致睡眠,不能再中断上... 查看详情

linux驱动开发-中断处理模型笔记5(代码片段)

中断处理模型1、概念解析a)I/O操作的不确定因素以及处理器和I/O设备之间速度不匹配,设备往往通过某种硬件信号异步唤起处理器的注意b)这些硬件信号就称为中断,每个设备都被分配了一个相关的标示符,别称为中... 查看详情

linux设备驱动中的异步通知机制(代码片段)

...于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”.信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过... 查看详情

软中断和实时性(代码片段)

...,Linux存在32个硬中断向量,并为每个向量分配一个设备驱动或相关的任务。大部分驱动在很早以前就已经跟软中断分进行了分离(驱动仍然会使用软中断,但需要通过中间APIs,如taskle 查看详情

linux设备驱动的并发控制学习笔记(代码片段)

文章目录并发和竞态编译乱序和执行乱序并发控制机制中断屏蔽原子操作整型原子操作位原子操作自旋锁自旋锁的使用读写自旋锁顺序锁读-复制-更新信号量互斥体完成量并发和竞态并发:多个执行单元同时、并行被执行。... 查看详情

linux中断所有知识点(代码片段)

...ICv3中断类别GICv3组成中断路由中断状态机中断处理流程GIC驱动设备树初始化中断的映射数据结构中断控制器注册irq_domain外设的驱动创建硬中断和虚拟中断号的映射关系中断的注册中断的处理保护现场中断处理恢复现场总结中断... 查看详情

i.mx6ull驱动开发|23-linux下的驱动分离与分层——platform平台驱动模型(代码片段)

一、Linux驱动的分离1.为什么需要驱动分离?在嵌入式开发中,无论处理器如何更换,外设模块的操作都是一致的,比如有三个不同的平台都要驱动MPU6050传感器,最简单的方法是针对每个平台都写一份驱动࿱... 查看详情

zynq7010在linux系统下irq_f2p中断驱动(代码片段)

...分别为61-68,84-91。本文针对该中断在linux环境开,开发驱动,驱动方式采用uio模型。2开发环境1、软件 查看详情

linux驱动开发定时器(代码片段)

硬件定时器提供时钟源,时钟源的频率设置完成后会产生周期性的定时中断,系统使用定时中断计时。中断周期性产生的频率为系统频率,也称节拍率,单位HZ,HZ表示一秒的节拍数,即频率,频率大小... 查看详情

linux驱动开发笔记:helloworld驱动源码编写makefile编写以及驱动编译基本流程(代码片段)

前言  基于linux的驱动开发学习笔记,本篇是描述了一个字符驱动的基础开发流程,以便做嵌入式开发多年的应用或者系统学习驱动开发。 笔者自身情况  笔者拥有硬件基础,单片机软硬基础,linux系统基础等各种,就... 查看详情

linux驱动开发-字符设备控制技术笔记3(代码片段)

字符设备控制技术  笔记要做的自己看起来舒服和有头绪,这不又折腾切换编辑器来从新排版,有强迫症啊!对于字符控制,很多时候编写上层应用程序时,使用ioctl系统调用来控制设备,原型如下:/*fd:... 查看详情

linux驱动知识:中断(代码片段)

Thesesymbolsrelatedtointerruptmanagementwereintroducedinthischapter:#include<linux/interrupt.h>intrequest_irq(unsignedintirq,irqreturn_t(*handler)(),unsignedlongflags,constchar*dev_name,void*dev 查看详情

linux驱动开发platform(代码片段)

驱动的分离和分层为了方便开发,将主机驱动和设备驱动分离开来,主机驱动和设备驱动通过统一的接口访问。主机驱动由半导体厂商编写,设备驱动由设备器件厂商编写,用户只需提供设备信息。驱动的分层是... 查看详情