这个开关中断的宏定义为什么有个was_masked?

2020-01-01 17:44发布

如题:
  1. #if defined(__CC_ARM)

  2. /* ARMCC and GCC have different ordering for packed typedefs, must separate macros */
  3.     #define __packed_gcc
  4.     #define __packed_armcc __packed

  5.     #define _DISABLE_IRQS(_was_masked) _was_masked = __disable_irq()
  6.     #define _ENABLE_IRQS(_was_masked) if (!_was_masked) { __enable_irq(); }

  7. #elif defined(__GNUC__)

  8.     #define __packed_armcc
  9.     #define __packed_gcc __attribute__((packed))

  10.     #define _DISABLE_IRQS(_was_masked) do{
  11.         __ASM volatile ("MRS %0, primask" : "=r" (_was_masked) );
  12.         __ASM volatile ("cpsid i" : : : "memory");
  13.     } while(0)
复制代码

这个里面   #define _DISABLE_IRQS(_was_masked) _was_masked = __disable_irq()
_was_masked干什么的?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
smithding
1楼-- · 2020-01-01 20:38
看起来像用作参数的中断号
security
2楼-- · 2020-01-01 23:11
 精彩回答 2  元偷偷看……
JYX2015
3楼-- · 2020-01-02 03:22
security 发表于 2017-1-5 10:46
这是 ARM v7 之前处理器的做法,IRQ 由 CPSR 里面的 I 位来控制,这个 _was_masked 就对应着 I 位的 mask  ...

通俗点讲就是?
security
4楼-- · 2020-01-02 07:25
JYX2015 发表于 2017-1-5 18:32
通俗点讲就是?


通俗讲就是 _was_masked 为 true,意味着 CPSR 中的 I 位为 1,意味着原来中断是禁止的。
还原中断的配置的时候,如果 _was_masked 为 true,此时也就不能打开中断。

一周热门 更多>