OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 59798|回复: 15

关于__disable_irq() 和 __enable_irq() 在那里面定义的

[复制链接]

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2014-7-10 17:33:36 | 显示全部楼层 |阅读模式
5金钱
1.希望大神能给讲解下原理
2.大神给说下在哪里定义的

最佳答案

查看完整内容[请看2#楼]

__disable_interrupt应该是一个函数名,意思上很明显是关中断的函数。 #define __disable_irq     __disable_interrupt  这句话用__disable_irq来替代__disable_interrupt,用来关断中断。实际上这里的__disable_interrupt其实没有定义。这么写只是为了增加移植性,在移植不同的处理器上,可以自己写__disable_interrupt()函数来关闭某处理器的中断,而对于库函数来说,它只调用__di ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2014-6-10
在线时间
0 小时
发表于 2014-7-10 17:33:37 | 显示全部楼层
__disable_interrupt应该是一个函数名,意思上很明显是关中断的函数。 #define __disable_irq     __disable_interrupt  这句话用__disable_irq来替代__disable_interrupt,用来关断中断。实际上这里的__disable_interrupt其实没有定义。这么写只是为了增加移植性,在移植不同的处理器上,可以自己写__disable_interrupt()函数来关闭某处理器的中断,而对于库函数来说,它只调用__disable_irq()而不用管具体怎么关闭中断,这样做,就将库函数脱离了硬件。
回复

使用道具 举报

0

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2014-6-10
在线时间
0 小时
发表于 2014-7-10 17:33:37 | 显示全部楼层
static就不说,很常用的,主要限定__disable_irq()的有效范围。
_inline这个关键字其实是给编译器看的,表示下面的是内联函数,所谓的内联跟#define功能差不多,编译器编译的时候直接把__disable_irq()函数调用的地方直接用{__ASM  volatile ("cpsid i");}这句话替代,这样做其实提高了效率,避免了因为调用函数所占用的时间(函数调用是需要保存当前环境到堆栈并且改变PC指针,函数退出后有要恢复环境等等一些操作)。
__ASM表示接下去使用汇编语言,即时所谓的混编了。
volatile也是给编译器看的,表示后面的代码不被优化。
"cpsid i"对于Cortex-M3来说是关闭中断的汇编指令,可以看看《Cortex-m3权威指南》
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
 楼主| 发表于 2014-7-10 17:51:52 | 显示全部楼层
在哪 我知道了 在core_cm3.h中      #define __disable_irq     __disable_interrupt
但问题是__disable_interrupt不知道是什么意思
还有 static __INLINE void __disable_irq()  {__ASM  volatile ("cpsid i");}
这句也没看懂 __INLINE 是什么这整句话 表达了什么!!
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-7-10 18:58:06 | 显示全部楼层
“__disable_interrupt”就是关中断
“ __INLINE” :表示内联函数,可以提高执行速度
站在巨人的肩膀上不断的前进。。。
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
 楼主| 发表于 2014-7-11 08:46:46 | 显示全部楼层
回复【4楼】ziye334:
---------------------------------
谢谢
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
 楼主| 发表于 2014-7-11 08:47:11 | 显示全部楼层
回复【3楼】xiaoyan:
---------------------------------
能不能帮我把static __INLINE void __disable_irq()  {__ASM  volatile ("cpsid i");} 翻一下
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
 楼主| 发表于 2014-7-11 10:25:14 | 显示全部楼层
回复【7楼】ziye334:
---------------------------------
谢了
回复

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-1-28
在线时间
8 小时
发表于 2015-7-23 16:57:54 | 显示全部楼层
回复【7楼】ziye334:
---------------------------------
讲解的真清晰。不错。
回复

使用道具 举报

3

主题

35

帖子

0

精华

高级会员

Rank: 4

积分
916
金钱
916
注册时间
2014-4-28
在线时间
75 小时
发表于 2016-10-13 14:42:38 | 显示全部楼层
解决了我的疑惑,谢谢!
来路长   前程湮   待从头拨断琴弦
回复

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-1-26
在线时间
58 小时
发表于 2016-11-8 23:19:24 | 显示全部楼层
学习了
回复

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2016-11-9 08:34:26 | 显示全部楼层
本帖最后由 myxiaoniao 于 2016-11-9 08:36 编辑

在armcc中,__disable_irq() 和 __enable_irq() 是所谓的intrinsic函数,编译器自动识别并替换为相关的指令,也就是说他们其实是编译器的一部分
但是gcc中就不是,他们是明确的汇编定义的函数
尽管最后的代码都是一样的,但是编译器的处理机制是不一样的
armcc中有不少intrinsic函数,主要对应无法用c表达的汇编指令,例如__lderex,__strex,__usat等等
其实keil c51也有这样的intrinsic函数,这几个函数都包含在interinsic头文件里
其实这些知识mdk的手册里都有,没事翻翻手册是有收获的
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-2-14
在线时间
6 小时
发表于 2017-3-8 09:35:36 | 显示全部楼层
问个问题啊,__disable_irq() 和 __enable_irq() 是直接汇编操作内核,那么__disable_irq()  意思是不是从硬件层关全局中断,而不会改变中断相关寄存器值,然后用 __enable_irq() 使能,所有中断会恢复到关全局中断前的状态,是不是这样呢?
回复

使用道具 举报

0

主题

9

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2015-11-5
在线时间
47 小时
发表于 2017-12-14 15:36:24 | 显示全部楼层
帮助非常大,非常感谢!
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-5-18
在线时间
3 小时
发表于 2020-2-12 11:26:51 | 显示全部楼层
__disable_irq()
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2019-12-30
在线时间
21 小时
发表于 2020-4-13 17:01:11 | 显示全部楼层
真的牛皮
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 07:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表