itop-3568开发板驱动学习笔记(18)tasklet 机制

news2024/11/15 0:07:14

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记

文章目录

  • tasklet 简介
  • tasklet 结构体
  • tasklet 初始化
  • 使能 tasklet
  • 失能 tasklet
  • tasklet 调度函数
  • tasklet 取消调度函数
  • tasklet 实验

tasklet 简介

Tasklets 机制是linux中断处理机制中的软中断延迟机制。在linux中存在着硬中断和软中断的概念区分。
机制流程:当linux接收到硬件中断之后,通过tasklet函数来设定软中断被执行的优先程度从而导致软中断处理函数被优先执行的差异性。
特点:tasklet的优先级别较低,而且中断处理过程中可以被打断。但被打断之后,还能进行自我恢复,断点续运行。

——百度百科

在 Linux 内核中,一般使用 tasklet 机制来实现中断下文,tasklet 任务在同一时间只能在一个 CPU 上运行,所以在多核系统上不会存在并发问题,但正因如此,它的执行优先级会比硬中断低。另外,tasklet 任务函数不能调用任何可能会引起休眠的函数,否则会导致内核异常。

tasklet 结构体

tasklet 结构体定义在内核 include/linux/interrupt.h 头文件中:

struct tasklet_struct 
{
	struct tasklet_struct *next;      // 链表中的下一个 tasklet 结构体节点
	unsigned long state;              // tasklet 状态 
	atomic_t count;                   // 原子类型计数器
	void(*func) (unsigned long data); // tasklet 处理函数 
	unsigned long data;               // tasklet 处理函数的参数 
}

tasklet 初始化

动态初始化

void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data)

功能:动态初始化 tasklet_struct 结构体,将计数器 count 和状态 state 置 0。

参数:

  • t: tasklet_struct 结构体指针
  • func:tasklet 处理函数
  • data:tasklet 处理函数的参数

静态初始化

静态初始和动态初始化功能相同,实际上就是动态初始化的宏函数,

DECLARE_TASKLET(name, func, data);
DECLARE_TASKLET_DISABLED(name, func, data);

name 参数对应 tasklet_struct 结构体名,其他参数与动态初始化相同。

DECLARE_TASKLET 和 DECLARE_TASKLET_DISABLED 的区别在于初始化时 tasklet_struct 结构体变量中 count 的值不同,当 count 为 0 时,表示 tasklet 使能,当 count 为 1 时,表示 tasklet 失能。

这里的 count 值会影响 tasklet 任务的调度,只有 count 为 0 时,tasklet 任务才会被调度。

使能 tasklet

tasklet 使能实际就是把 t->count 减 1。

void tasklet_enable (struct tasklet_struct *t)

失能 tasklet

tasklet 失能实际就是把 t->count 加 1。

void tasklet_disable(struct tasklet_struct *t)

tasklet 调度函数

tasklet_schedule() 会让 t->func() 执行(前提是 t->count 为 0)。

void tasklet_schedule (struct tasklet_struct *t)

由于 tasklet 任务执行优先级并不高,所以连续多次调用调度函数,可能只会执行一次。

tasklet 取消调度函数

tasklet_kill() 会将已经调度的 tasklet 停止调度。

void tasklet_kill(struct tasklet_struct *t)

如果 tasklet 任务正在被调度执行,tasklet_kill() 将会等待其退出,tasklet_kill() 完成前应避免再次调度。另外,不能在 tasklet 处理函数里调用 tasklet_kill()。

tasklet 实验

在上一个中断实验的代码上添加中断下文处理函数,即 tasklet 任务。

#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>

int irq;
struct tasklet_struct mytasklet;

//tasklet 处理函数
void my_tasklet(unsigned long data)
{
	printk("data is %ld.\n", data);
}

//静态初始化 tasklet
DECLARE_TASKLET(mytasklet, my_tasklet, 6);


//中断服务函数
irqreturn_t my_interrupt(int irq, void *args)
{
	printk("my interrupt handler.\n");	

	// tasklet 调度
	tasklet_schedule(&mytasklet);

	return IRQ_RETVAL(IRQ_HANDLED);
}

static int interrupt_irq_init(void)
{
	int ret = 0;
	
	// 获取中断号
	irq = gpio_to_irq(101);
	printk("irq is %d\n", irq);

	// 申请中断
	ret = request_irq(irq, my_interrupt, IRQF_TRIGGER_RISING, "inttrupt_test", NULL);
	if(ret < 0)
	{
		printk("request irq error.\n");
		return 0;
	}

	return 0;	
}

static void interrupt_irq_exit(void)
{
	printk("interrupt irq exit.\n");

	// 注销中断
	free_irq(irq, NULL);

	// 摧毁 tasklet
	tasklet_kill(&mytasklet);
}

module_init(interrupt_irq_init);
module_exit(interrupt_irq_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xiaohui");

实验结果

触碰触摸屏,中断被触发,先执行中断服务函数,然后再执行 tasklet 处理函数。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ES】搜索结果处理RestClient查询文档

【ES】搜索结果处理&RestClient查询文档2.搜索结果处理2.1.排序2.1.1.普通字段排序2.1.2.地理坐标排序2.2.分页2.2.1.基本的分页2.2.2.深度分页问题2.2.3.小结2.3.高亮2.3.1.高亮原理2.3.2.实现高亮2.4.总结3.RestClient查询文档3.1.快速入门3.1.1.发起查询请求3.1.2.解析响…

【计算机图形学】图形变换(平移变换、比例变换、旋转变换、对称变换、错切变换、复合变换)

一 实验目的 编写图形各种变换的算法二 实验内容 1&#xff1a;自行设计基本图案&#xff0c;完成1-5种简单变换 实验结果如下图所示&#xff1a; 图形初始化&#xff1a; 第一次点击左键&#xff0c;实现平移变换&#xff1a; 第二次点击左键&#xff0c;实现比例变换&…

Android 性能优化——APP启动优化详解

1.1 为什么要启动优化&#xff1f; 用户希望应用能够及时响应并快速加载&#xff0c;启动时间过长的应用不能满足这个期望&#xff0c;并且可能使用户失望。 启动太慢的结果&#xff1a; 体验效果差用户放弃使用你的应用时间越长用户流失越高产品死掉 1.2 启动优化流程及分…

HDLBits-Modules 题解【Verilog模块例化】(中文翻译+英文原文,可顺带学习英文)

Moudule 概念介绍 到目前为止&#xff0c;你已经熟悉了一个模块&#xff0c;它是一个通过输入和输出端口与其外部交互的电路。更大、更复杂的电路是通过将较小的模块和其他连接在一起的部分&#xff08;例如赋值语句和always块&#xff09;组合而成的更大模块来构建的。因为模…

从零开始学OpenCV——图像灰度变换详解(线性与非线性变换)

文章目录图像灰度变化灰度变换介绍灰度线性变换灰度分段线性变换图像点运算灰度非线性变换线性点运算灰度的非线性变换&#xff1a;对数变换灰度的非线性变换&#xff1a;伽马变换灰度的非线性变换&#xff1a;对比拉伸灰度的非线性变换&#xff1a; S形灰度变换灰度的非线性变…

tomcat中出现RFC7230和RFC3986问题解析

问题截图 问题分析 出现上述问题&#xff0c;是因为各版本tomcat中对特殊字符和请求路径中携带中文参数而产生的错误提示。 解决办法 1、调整tomcat版本 tomcat 7.0.76之前的版本不会出现类似问题 2、tomcat9之前&#xff0c;修改tomcat目录底下的/conf/catalina.properti…

233:vue+openlayers绘制渐变填充色的圆形、多边形

第233个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中绘制带有渐变填充色的圆形、多边形。这里用canvas的方式去渲染,用到了DEVICE_PIXEL_RATIO,设备上的物理像素与设备无关像素 (dips) 之间的比率 (window.devicePixelRatio)。 直接复制下面的 vue+openlayer…

用ChatGPT创建一个REST API

ChatGPT是OpenAI公司开发的大型语言模型。在本文中&#xff0c;主要探讨如何使用ChatGPT在C#中创建REST API。 一、简介 ChatGPT是由人工智能研究中心OpenAI创建的尖端自然语言处理模型&#xff0c;OpenAI公司是由埃隆马斯克、萨姆奥特曼和格雷格布罗克曼共同创办的。该模型于…

360浏览器+Adobe Acrobat DC实现在线预览PDF大样校对

甲方&#xff1a;实现方正PDF文字大样校对&#xff0c;校对后在360浏览器中新开一个页面在线预览PDF文字大样校对结果。 我方实现过程&#xff1a; 1.方案选择 方案零&#xff1a;使用浏览器自带的PDF阅览器&#xff0c;经测试360极速模型,谷歌等软件能预览但是标记的PDF内容…

【笔记】大模型,大资料

大模型&#xff0c;大资料&#xff0c;loss会降低&#xff0c;准确率会增加 1大模型 1.1模型的顿悟时刻 举了一个一知半解的例子 1.2 模型 chain of thought 模型足够大时才会有比较好的作用 calibration 检测模型对于答案的confidence 会出现 “u-shape” 2.大资料 文法…

系统复杂度之【高可用】

接着&#xff0c;我们聊聊复杂度的第二个要求高可用。 参考维基百科&#xff0c;先来看看高可用的定义。 系统无中断地执行其功能的能力&#xff0c;代表系统的可用性程度&#xff0c;是进行系统设计时的准则之一。 这个定义的关键在于“ 无中断”&#xff0c;但恰好难点也在“…

Java 并发编程面试题——Future

目录1.什么是 Future 模式&#xff1f;Java 中是如何实现的&#xff1f;2.Callable、Future 与 FutureTask 分别是什么&#xff1f;2.1.Callable 接口2.2.Future 接口2.3.FutureTask 类3.CompletableFuture 类有什么用&#xff1f;1.什么是 Future 模式&#xff1f;Java 中是如…

windows系统管理_Windows server 2016 组管理与授权

组账户的概述 在 windows 服务器中&#xff0c;当我们需要为多个用户设置相同的权限时&#xff0c;一个一个的逐一设置会比较 麻烦&#xff0c;这个时候我们就需要用到另一种模式&#xff0c;组账户&#xff0c;使用此账户来进行简化操作。 在以后的职场中&#xff0c;每家公司…

Flink 优化 (五) --------- Job 优化

目录一、使用 DataGen 造数据1. DataStream 的 DataGenerator2. SQL 的 DataGenerator二、算子指定 UUID三、链路延迟测量四、开启对象重用五、细粒度滑动窗口优化一、使用 DataGen 造数据 开发完 Flink 作业&#xff0c;压测的方式很简单&#xff0c;先在 kafka 中积压数据&a…

全景图像畸变校正

1.简介 理想的相机基本上是小孔成像的&#xff0c;在小孔成像模型中&#xff0c;如果焦距一定&#xff0c;那么图像传感器像素平面的面积直接决定了相机视场角的大小&#xff0c;超过这个视场角范围的物体不会被镜头获取到。因此基于透镜成像原理的相机&#xff0c;视场角无法…

JAVA解析XML时的内存消耗问题

问题出现 最近一个项目中&#xff0c;有个需求功能是从外部传入的XML读取数据&#xff0c;然后写入到数据库中。 写完之后&#xff0c;有在本地电脑上的Tomcat跑了一下&#xff0c;正常读取到XML中的数据&#xff0c;并整理好后&#xff0c;插入了数据库保存了。但是线上运行的…

C语言文件操作复习回顾(2)

TIPS 文件的顺序读写&#xff1a;fgetc, fputc, fputs&#xff08;一行字符串的输出\n注意一下&#xff09;, fgets&#xff08;一行字符串的输入\n三特性&#xff09;&#xff0c;fprintf&#xff08;格式化字符串的输出联想printf很简单&#xff09;&#xff0c;fscanf&…

pyspark 实验二,rdd编程

1.环境准备 start-all.sh启动Hadoop ./bin start-all.sh 启动spark 上传数据集 1.求该系总共多少学生 linessc.textFile("file:///home/data.txt") res lines.map(lambda x:x.split(",")).map(lambda x:x[0]) sumres.distinct() sum.cont() 2.求该系设置…

【MybatisPlus快速入门】—— 进阶入门

进阶篇 1.1 映射专题 Mybatis 框架之所以能够简化数据库操作&#xff0c;是因为他内部的映射机制&#xff0c;通过自动映射&#xff0c;进行数据的封装&#xff0c;我们只要符合映射规则&#xff0c;就可以快速高效的完成SQL操作的实现既然 MybatisPlus 是基于Mybatis 的增强…

程序员如何能提高自己的编程水平?

这些实用的小建议&#xff0c;能帮你迅速地提高编程水平&#xff1a; 不要做无意义的奋斗 拒绝喊口号和无意义的奋斗&#xff0c;包括但不限于&#xff1a; ①做了计划表却从未有执行的一天&#xff1b; ②每天都是最早来、最晚走&#xff0c;但是工作进度趋近于0&#xff1b…