鉴于此,在 ARM Cortex M3 上,我可以:
如何将这些组合用于互斥式操作集:
try lock
take lock
release lock
看来
try_lock
或 take_lock
将需要两个不是原子的操作。我需要更多的控制来完成这个吗?禁用全局中断会做到这一点,但似乎应该有一种更外科手术的方法。
最佳答案
您的 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;
}
请注意,以上不适用于递归声明相同的锁(即,如果由
who == 1
指定的任务已经拥有该锁并尝试再次声明它,则上面的代码将无法正常工作),但确实如此你的原件也是如此。此外,可以很快地在 Cortex M3 上禁用/启用中断(这是对 NVIC 寄存器的简单更新)。你确定你的系统不能忍受额外的几个中断延迟周期来保持处理锁数据结构的代码简单(这通常意味着更容易纠正)?
关于embedded - ARM 皮层 : mutex using bit banding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2857452/