笔记整理—linux驱动开发部分(11)中断上下文

        触摸屏分为两种,一种为电阻式触摸屏,另一种为电容式触摸屏。电阻式触摸屏(x+、x-、y+、y-、+AD)有两种接口,一种为SOC自带的接口(misc+input或platform),第二种为外部IC,通过IIC与SOC进行通信。电容触摸屏类似外部IC方式也是通过IIC通信。

        再次提一下解决竞态的方式:①原子操作automic_t(不可打断,不可拆分的操作);

typedef struct {int counter;
} atomic_t;

        ②信号量(互斥锁是一种特别的信号量);③自旋锁。

        竞态:由并发引起的竞争状态。

        同步:并行运行(多核、多任务、中断)会引发同步相关问题。

        临界段:可能造成并发的一段代码,因在上下加入互斥锁或对资源上锁,由此解除竞态。

        死锁:两个锁相互锁死(A锁B,B锁A,钥匙相互在二者手中),

        休眠:代码可以休眠(交出CPU)自己挂起,并保护资源,自己无法满足条件时,保证CPU效率。

        自旋锁:代码运行不了时,拉着CPU死等资源,在原地打转。

        信号量支持休眠交出CPU,因为一般资源等待时间长,而自旋锁不支持休眠,因为一般资源等待时间短。

        自旋锁不可递归,获取自旋锁失败不会返回,会自选等待别人释放锁。自旋锁可用在中断上下文(中断处理程序),但信号量不行,因为会休眠交出CPU,也因为中断上下文的过程不参与进程调度。在中断上下文中获取自旋锁之前要先禁用本地中断,因为可能存在中断嵌套。

        自旋锁的核心要求,拥有锁的代码不能休眠,否则就是思索,直到释放持有的CPU。

        读写信号量,是信号量的升级版plus,读信号量,只管读,不能写;写信号量只能写,不能读,为了解决多写冲突,只能在进行上下文使用。

        总结一下

        自旋锁:中断上下文,短期保留。

        信号量:进程上下文,长期保留。

        二者使用时都要考虑调度成本。自旋锁保持期间是抢占失效的(运行等级高等级抢不到已经锁住的资源与锁)。信号量在保持期间可以被抢占,因为可以被调度。自旋锁只有在抢占式内核+SMPC(多核CPU)中才能真正需要,单核非抢占内核为空操作。

        中断的上下半部:①中断上下文不能与用户空间数据交互,因为会造成休眠;②不能交出cpul交出(休眠、调度);③ISR运行时间尽可能短,越长对系统的影响越大,性能越差。

        进程上下文可以被切分成多个子块分开执行,然而中断上下文不可打断、切分,必须一次性执行完成。中断上半部与下半部用于解决中断处理程序的运行时间问题将一个中断处理程序人为的切分为Top half和Botton half。

        为了兼顾系统特性,上半部一般为:登记中断、标记中断、调度下半部(时间短,但事件很着急);下半部:干活(不太急,时间长)。

        上下半部处理策略:①task let小任务;②work queue工作队列。这与下半部怎么被调度有关。

        tasklet小任务:

#define DECLARE_TASKLET(name, func, data) \
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }

void func(unsigned long data)
{......s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0));		// input模式flag = gpio_get_value(S5PV210_GPH0(2));s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0f));		// eint2模式input_report_key(button_dev, KEY_LEFT, !flag);input_sync(button_dev);
}static irqreturn_t button_interrupt(int irq, void *dummy) 
{ ......tasklet_schedule(&mytasklet);return IRQ_HANDLED; 
}request_irq(BUTTON_IRQ, button_interrupt, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "button-x210", NULL);按键上下沿触发

        workqueue方法:中断下半部交给workqueue,可被调度、休眠。workqueue是处理进程上下文的。

#define DECLARE_WORK(n, f)					\struct work_struct n = __WORK_INITIALIZER(n, f)DECLARE_WORK(mywork, func);void func(struct work_struct *work)//中断下文
{......s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0));		// input模式flag = gpio_get_value(S5PV210_GPH0(2));s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0f));		// eint2模式input_report_key(button_dev, KEY_LEFT, !flag);input_sync(button_dev);
}static irqreturn_t button_interrupt(int irq, void *dummy) //中断上文
{ ......schedule_work(&mywork);return IRQ_HANDLED; 
}

        中断上下半部处理原则:①必须立刻处理,极少的任务要放在上半部,此时屏蔽同类型的中断,可以迅速不被打扰完成紧急任务。②中等数量的任务,中等急迫放在tasklet中,不屏蔽任何中断(包括与自己顶半部同类的中断),不会影响顶半部对紧急任务的处理(以不在量评判调用tasklet)同时又不会进行用户进程调度,保证急迫任务完成。③需求事件较多,且不急迫的大量任务放在workqueue中,此时操作系统会尽量快的处理这个任务,但量大,期间系统也会有机会调度别的用户程序运行,从而保证不会因为这个任务需要运行时其他用户进行无法运行。④可能引起休眠的任务放在workqueue中(休眠、大量内存、阻塞I/O、信号量)用workqueue十分合适。

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

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

相关文章

网络编程示例之开发板测试

编译elf1_cmd_net程序 (一)设置交叉编译环境。 (二)查看elf1_cmd_net文件夹Makefile文件。查看当前编译规则,net_demo是编译整个工程,clean是清除工程。 (三)输入命令。 &#xff0…

【GD32】(一) 开发方式简介及标准库开发入门

文章目录 0 前言1 开发方式选择2 标准库模板的创建3 遇到的问题和解决方法 0 前言 因为项目关系,需要使用GD32。之前对此早有耳闻,知道这个是一个STM32的替代品,据说甚至可以直接烧录STM32的程序(一般是同型号)&#x…

Java NIO 核心知识总结

NIO 简介 在传统的 Java I/O 模型(BIO)中,I/O 操作是以阻塞的方式进行的。也就是说,当一个线程执行一个 I/O 操作时,它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈,因为需…

Spring如何解决循环依赖的问题

Spring 如何解决循环依赖的问题 Spring 是通过三级缓存来解决循环依赖问题,第一级缓存里面存储完整的Bean实例,这些实例是可以直接被使用的,第二级缓存存储的是实例化后但是还没有设置属性值的Bean实例,也就是Bean里面的 依赖注入…

深度图变换器的新突破:DeepGraph

人工智能咨询培训老师叶梓 转载标明出处 在图变换器领域,尽管其全局注意力机制在图结构数据处理上显示出了巨大潜力,但现有的图变换器模型却普遍较浅,通常不超过12层。这一现象引发了学者们对于“增加层数是否能进一步提升图变换器性能”的深…

单体架构 IM 系统之 Server 节点状态化分析

基于 http 短轮询模式的单体架构的 IM 系统见下图,即客户端通过 http 周期性地轮询访问 server 实现消息的即时通讯,也就是我们前面提到的 “信箱模型”。“信箱模型” 虽然实现非常容易,但是消息的实时性不高。 我们在上一篇文章&#xff08…

阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元

🚀 11月12日,阿里云通义大模型团队宣布开源通义千问代码模型全系列,共6款Qwen2.5-Coder模型。这些模型在同等尺寸下均取得了业界最佳效果,其中32B尺寸的旗舰代码模型在十余项基准评测中均取得开源最佳成绩,成为全球最强…

计算机网络(8)数据链路层之子层

上一篇已经讲到数据链路层可以分为两个子层,这次将重点讲解子层的作用和ppp协议 数据链路层的子层 数据链路层通常被分为两个子层: 逻辑链路控制子层(LLC,Logical Link Control): LLC子层负责在数据链路…

【操作系统】输入/输出(I/O)管理

王道笔记 一、I/O管理描述 1.1 I/O设备的概念和分类 1.1.1 什么是I/O设备 “I/O”就是“输入/输出”(Input/Output) I/O设备机会可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。下图就…

Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV买卖股票的最佳时机III309.买卖股票的最佳时机含冷冻期

Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV&&买卖股票的最佳时机III&&309.买卖股票的最佳时机含冷冻期 动态规划应该如何学习?-CSDN博客 本次题解参考自灵神的做法,大家也多多支持灵神的题解 买卖股票的最佳时机【…

Koa进阶:掌握中间件和参数校验的艺术

目录 一、首先下载依赖 二、在index.js中引入koa-parameter,一般挂载这个中间件时会放在注册请求体的后面 三、使用实例 四、如果跟我们所需求的参数不同,返回结果直接会返回422 koa-parameter一般是用来校验请求传过来的参数是否是自己所需要的的 G…

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用:读取图像文件并将其加载到 Mat 对象中。参数: 第一个参数是文件路径,可以是相对路径或绝对路径。第二个参数是读取标志,比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…

git config是做什么的?

git config是做什么的? git config作用配置级别三种配置级别的介绍及使用,配置文件说明 使用说明git confi查看参数 默认/不使用这个参数 情况下 Git 使用哪个配置等级? 一些常见的行为查看配置信息设置配置信息删除配置信息 一些常用的配置信…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路

文章目录 计算布尔二叉树的值求根节点到叶节点的数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径 计算布尔二叉树的值 解题思路: 这是一个二叉树的布尔评估问题。树的每个节点包含一个值,其中叶子节点值为 0 或 1&#xff0…

2023年MathorCup数学建模A题量子计算机在信用评分卡组合优化中的应用解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 A题 量子计算机在信用评分卡组合优化中的应用 原题再现: 在银行信用卡或相关的贷款等业务中,对客户授信之前,需要先通过各种审核规则对客户的信用等级进行评定,通过评定后的客户才能…

嵌入式开发套件(golang版本)

1. watchdog(软件看门狗:守护升级) 2. gate(主程序) 3. web(api版本 升级包) OTA 升级流程 watchdog启动后检查守护进程gate是否正在运行,如果没有,api对比版本号&am…

解压专家 2.4.12| 多功能解压缩工具,支持密码共享、音乐播放和歌词匹配。

解压专家是一款功能强大的解压缩软件,提供了类似于WIFI万能钥匙的密码分享功能,帮助用户快速获取共享的解压密码。作为专业的解压缩工具,它支持多种常见和不常见的压缩包格式,如ZIP、RAR、7z、TAR.GZ和ISO等,并且还支持…

并发编程(10)——内存模型和原子操作

文章目录 十、day101. 内存模型基础1.1 对象和内存区域1.2 改动序列 2. 原子操作及其类型2.1 原子操作2.2 原子类型2.3 内存次序2.4 std::atomic_flag2.4.1 自旋锁 2.5 std::atomic&#xff1c;bool&#xff1e;2.6 std::atomic<T*>2.7 标准整数原子类型2.8 std::atomic&…

【Flink】-- flink新版本发布:v2.0-preview1

目录 1、简介 2、非兼容变更 2.1、API 2.2、连接器适配计划 2.3、配置 2.4、其它 3、重要新特性 3.1、存算分离状态管理 3.2、物化表 3.3、批作业的自适应执行 3.4、流式湖仓 4、附加 4.1、非兼容性的 api 程序变更 4.1.2、Removed Classes # 4.1.3、Modified Cl…