一、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 */( 注意点)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)