ARM皮质:使用位带的互斥锁

Jef*_*ffV 5 embedded mutex arm cortex-m3

鉴于此,在ARM Cortex M3上,我可以:

  • 原子地读取一个位
  • 原子地设置一个位
  • 原子地清除一点

如何将这些组合用于互斥体式操作集:

try lock
take lock
release lock
Run Code Online (Sandbox Code Playgroud)

似乎try_lock或者take_lock需要两个不是原子的操作.

我需要更多控制才能实现这一目标吗?禁用全局中断会这样做,但似乎应该有更多的手术方法.

Mic*_*urr 4

rwl_TryLock()如果调用时已持有锁,则不一定会返回失败(您的编译器应该至少给出有关没有返回值的代码路径的警告)。请尝试以下操作:

int rwl_TryLock(volatile uint32_t *lock, int who){

    Var_SetBit_BB((uint32_t)lock, who);
    if(*lock == (1<<who)){ // check that we have exclusive access
        // got the lock!
        return 1;
    } 

    // do not have the lock
    Var_ResetBit_BB((uint32_t)lock, who); // clear the lock flag
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码不适用于递归地声明相同的锁(即,如果 指定的任务who == 1已经拥有锁并尝试再次声明它,则上面的代码将无法正常工作),但对于您的原始代码来说确实如此出色地。

此外,可以很快地在 Cortex M3 上禁用/启用中断(这是对 NVIC 寄存器的简单更新)。您确定您的系统不能忍受额外的几个中断延迟周期来保持处理锁数据结构的代码简单(这通常意味着更容易正确)?