RT-Thread临界段之rt_hw_interrupt_enable和rt_hw_interrupt_disable

一、PRIMASK

PRIMSK=1 ;关闭中断

PRIMSK=10;打开中断

二、void  rt_hw_interrupt_enable(rt_base_t  level);有参数,无返回值

该功能将设置指定的中断状态,该状态应由rt_hw_intterrupt_disable函数返回值(入参level)决定。 如果入参的值是0,该函数将打开系统中断状态。

rt_hw_interrupt_enable的主要功能是:当入参为0时,打开中断;而当入参为1时,无作用。

三、rt_base_t  rt_hw_interrupt_disable(void);有返回值,无参数

此功能将返回当前系统中断状态并禁用系统中断。即:先返回“当前系统中断状态” 然后“禁用系统中断”

rt_hw_interrupt_disable的主要功能是:关闭中断并且赋值给level。

系统默认中断打开状态(PRIMASK = 0),因此level1 = rt_hw_interrupt_disable(),先返回系统当前中断状态则返回level1 = 0;

而当再次调用level2 = rt_hw_interrupt_disable()时,由于中断已经被禁用,因此返回的是level2 = 1;

四、代码示例一:双重临界段嵌套

1 代码示例一:临界段嵌套
2   rt_base_t rt_hw_interrupt_disable();//有返回值,但无参数!!!!
3  
4 rt_hw_interrupt_disable PROC
5     EXPORT rt_hw_interrupt_disable
6     MRS r0, PRIMASK
7     CPSID I
8     BX LR
9     ENDP
10 
11 
12   void rt_hw_interrupt_enable(rt_base_t level);//无返回值,但有参数!!!!
13  
14 rt_hw_interrupt_enable PROC
15     EXPORT rt_hw_interrupt_enable
16     MSR PRIMASK, r0
17     BX LR
18     ENDP
1 PRIMASK = 0; /* PRIMASK 初始值为 0,表示没有关中断 */ (1)
2 rt_base_t level1; (2)
3 rt_base_t level2;
4 
5 /* 临界段代码 */
6 {
7 /* 临界段 1 开始 */
8 level1 = rt_hw_interrupt_disable(); /* 关中断,level1=0,PRIMASK=1 */  (3)
9 {
10 /* 临界段 2 */
11 level2 = rt_hw_interrupt_disable();  /* 关中断,level2=1,PRIMASK=1 */  (4)
12 {
13 
14 }
15 rt_hw_interrupt_enable(level2); /* 开中断,level2=1,PRIMASK=1 */  (5)
16 }
17 /* 临界段 1 结束 */
18 rt_hw_interrupt_enable(level1); /* 开中断,level1=0,PRIMASK=0 */ (6)
19 }

 

五、代码示例二:单一临界段

1 ;/*
2 ; * rt_base_t rt_hw_interrupt_disable();
3 ; */
4 rt_hw_interrupt_disable PROC
5 EXPORT rt_hw_interrupt_disable
6 MRS r0, PRIMASK
7 CPSID I
8 BX LR
9 ENDP
10 
11 ;/*
12 ; * void rt_hw_interrupt_enable(rt_base_t level);
13 ; */
14 rt_hw_interrupt_enable PROC
15 EXPORT rt_hw_interrupt_enable
16 MSR PRIMASK, r0
17 BX LR
18 ENDP
1 PRIMASK = 0; /* PRIMASK 初始值为 0,表示没有关中断 */
2 rt_base_t level1;
3 
4 /* 临界段代码 */
5 {
6 /* 临界段开始 */
7 level1 = rt_hw_interrupt_disable();/* 关中断,level1=0,PRIMASK=1 */
8 {
9 
10 }
11 /* 临界段结束 */
12 rt_hw_interrupt_enable(level1); /* 开中断,level1=0,PRIMASK=0 */( 注意点)

 

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值