工具/软件:
你(们)好
我的问题
请参阅以下背景一章以了解扩展的上下文。
有三个内在函数用于处理全局 可中断
- __disable_interrupts
- __enable_interrupts
- __restore_interrupts
#3. 当您想要在禁用中断后恢复中断时、这无疑是一个候选方案。
但筛选文档和论坛时、90%的用户都使用#1。 和#2.、只调用#2。 如果位 0 (INTM)、则从#1 返回值。 为 1。
此外、driverlib 仅提供使用#1 的函数。 和#2。
我想知道为什么会这样,作为#3。 (restore(接缝到更简单和直接的使用。
通过查看 SPRU514Y 中记录的这些内在函数中的汇编指令、我看到了#3。 (恢复)恢复整个 ST1 寄存器、而#1 和#2 调用 SETC 和 CLRC 仅影响 DNGM 和 INTM。
我的问题是:
大多数源使用更麻烦的 __disable_interrupts /_ enable_interrupts 是否有原因?
使用 __restore_interrupts 及其完整的 ST1 延迟是否会产生意外的副作用?
背景
为了保护代码的关键部分免受由于计时或对共享对象的访问而导致的中断影响、我使用了此结构。
bool irqWasEnabled = ! Interrupt_disableGlobal();
// Critical
// code
// lines
// ...
if( irqWasEnabled )
{
Interrupt_enableGlobal();
}
// ...
最后一部分可以重构为单行体
if( irqWasEnabled ) Interrupt_enableGlobal();
但这在许多编码标准中是不允许的。
所以我看了其他的构造显然的解决方案是做一对函数所以我得到
NoInterrupt_start(); // Critical // code // lines // ... NoInterrupt_end(); // ...
然后、这些函数使用文件静态变量来承载状态(从_start 到_end) 因此、如果代码中的两个位置调用这些函数(一个位于中断上下文中)、那么我必须研究该变量周围是否可能存在竞态条件。
为了便于参考、这些函数的实现方式为
typedef unsigned int irqStatus_t;
static irqStatus_t irqStatus = False;
static void NoInterrupt_start( void )
{
IrqWasEnabled = ! Interrupt_disableGlobal();
}
static void NoInterrupt_end( void )
{
if( IrqWasEnabled )
{
Interrupt_enableGlobal();
}
}
但在这次搜索中我发现了这个内在函数
void __restore_interrupts( irqStatus_t val );
这看起来像是一种更简单的解决方法、我可以使用它
irqStatus_t irqState = __disable_interrupts(); // Critical // code // lines // ... __restore_interrupts( irqState ); // ...
但正如本文开头所述、我不确定 __restore_interrupts 是否会有其他副作用。