首页 > 其他分享 >17 同步与互斥(三) 中断屏蔽

17 同步与互斥(三) 中断屏蔽

时间:2023-04-06 21:38:30浏览次数:39  
标签:enable 17 中断 irq 互斥 屏蔽 disable flags local

中断处理流程

1 简介

中断屏蔽是一种可以防止并发导致竞态的方法。

在进入临界区之前屏蔽系统中断可以保证正在执行的内核路径不被打断(进程调度也依赖于中断)。

不过在驱动编程中此方法并不值得推荐。因为驱动并不一定运行在单核上,面对SMP系统中断屏蔽并不能屏蔽掉别的CPU的中断操作,此时使用中断屏蔽也就不能实现我们预期的结果了。

2 常用API

  • local_irq_disable

    禁止中断

    #define local_irq_disable()	do { raw_local_irq_disable(); } while (0)
    
  • local_irq_enable

    使能中断

    #define local_irq_enable()	do { raw_local_irq_enable(); } while (0)
    
  • local_irq_save

    • 禁止irq
    • 保存irq禁止前的信息
    #define local_irq_save(flags)					\
    	do {							\
    		raw_local_irq_save(flags);			\
    	} while (0)
    
  • local_irq_restore

    恢复之前保存的irq信息

    #define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0)
    

示例


	unsigned long flags;

	local_save_flags(flags);
	...
	local_irq_restore(flags);

3 基本原理

  • 调用关系
local_irq_enable	-> raw_local_irq_enable		-> arch_local_irq_enable
local_irq_disable	-> raw_local_irq_disable	-> arch_local_irq_disable
  • 实现

    汇编指令 参数 说明
    cpsid i 关中断
    cpsie i 开中断
    cpsid f 关异常
    cpsie f 开异常
    static inline void arch_local_irq_enable(void)
    {
    	asm volatile(
    		"	cpsie i			@ arch_local_irq_enable"
    		:
    		:
    		: "memory", "cc");
    }
    
    static inline void arch_local_irq_disable(void)
    {
    	asm volatile(
    		"	cpsid i			@ arch_local_irq_disable"
    		:
    		:
    		: "memory", "cc");
    }
    

标签:enable,17,中断,irq,互斥,屏蔽,disable,flags,local
From: https://www.cnblogs.com/burnk/p/17294254.html

相关文章

  • 1792. 最大平均通过率
    题目描述给了一个数组,数组值是0<=x<=1的小数再给了一个值ext,ext可以让以上每个位小数的分子和分母都+1为怎么分配ext,可以让总和/个数最大?f1-优先队列基本分析可以看出是优先队列,队头需要怎么取?考虑增量,每次将1加在哪个分数中会有最大的增量?怎么实现以上思想?因为python默......
  • ios17如何更新
    相信大家已经迫不及待的想要更新ios17了吧,ios17拥有更多的功能可以给我们使用,今天我们就来看一下如何更新ios17版本,下面跟着步骤一起做就好了。ios17如何更新:1、首先我们打开手机的设置。2、然后我们在设置中找到通用。3、接着我们就可以找到软件更新。4、最后手机就可以自......
  • ios17如何更新wxtxz.com
    相信大家已经迫不及待的想要更新ios17了吧,ios17拥有更多的功能可以给我们使用,今天我们就来看一下如何更新ios17版本,下面跟着步骤一起做就好了ios17如何更新:1、首先我们打开手机的设置。2、然后我们在设置中找到通用。3、接着我们就可以找到软件更新。4、最后手机就可以自动检......
  • codeforces 1793D Moscow Gorillas
    https://codeforces.com/contest/1793/problem/D解题思路依次找出MEX=1..n+1的序列数量就能得解。MEX=n+1只有全序列这一种情况。MEX=1时,找出两个序列中1的位置,较小位置左边的元素构成的子序列,较大位置右边的元素构成的子序列,以及两个位置中间的元素构成的子序列都满......
  • Cesium 案例(三) Web Map Service(WMS) Washington DC 2017
    WMSCesium.Ion.defaultAccessToken="token";   constviewer=newCesium.Viewer("cesiumContainer");   //AddaWMSimagerylayer   constlayer=newCesium.ImageryLayer(    newCesium.WebMapServiceImageryProvider({ ......
  • codeforces 1795E Explosions?
    https://codeforces.com/problemset/problem/1795/E解题思路问题的核心是要构造有一个先严格递增,然后严格递减的子序列。不在这个序列中的怪物单独击杀。先递增后递减可以看作是两个对称的问题,所以把递增序列的构造考虑清楚就可以了。假设已经知道将1~i-1构造成严格递增子序列所......
  • HDOJ1017 A Mathematical Curiosity
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1017这个题目其实挺坑的。首先是N,应该挺多人纠结过这个N,N其实是blocks(块),一块有未知个cases。一个块的结束标志是0,0。然后是PE的问题,空格、空行,我也是被坑的好惨。这里应该是每个块之间有一个空行!也就是说,最后一个块是不......
  • HDOJ1799 循环多少次?
    循环多少次?TimeLimit:3000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):5459    AcceptedSubmission(s):2122ProblemDescription  我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分。例如,......
  • Node.js17或更高版本中出现Error: error:0308010C:digital envelope routines::unsupp
    问题描述我在运行别人的Vue项目的时候报各种错误,提示XXX/node_modules/.bin/vue-cli-service:Permissiondenied权限不足的问题。还有一个问题就是:出现Error:error:0308010C:digitalenveloperoutines::unsupported。在网上也查看了解决办法,没有解决。(我之前在Nodejs官网安装......
  • 216.组合总和III 17.电话号码的字母组合
    216.组合总和III回溯的常规思路做这道题:classSolution{List<List<Integer>>list=newArrayList<>();LinkedList<Integer>res=newLinkedList<>();publicList<List<Integer>>combinationSum3(intk,intn){f......