embedded - ARM 皮层 : mutex using bit banding

标签 embedded arm mutex cortex-m3

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

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

  • 如何将这些组合用于互斥式操作集:
    try lock
    take lock
    release lock
    

    看来try_locktake_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/

    相关文章:

    parsing - 用于与嵌入式设备传输数据的最有效格式

    c - 动态内存分配的流行用法

    android - 已编译 LKM 的互换性

    c - 在队列的关键部分使用二进制信号量而不是互斥锁进行互斥有什么好处吗?

    embedded - 测试实时操作系统的硬度

    c - 为什么这个条件总是成立?

    qt - 应用程序在 GDB 中崩溃但在正常运行时不会崩溃,在 libcrypto 中发生崩溃

    c++ - ARM NEON的编码: How to start?

    c++ - 长时间锁定互斥锁是否安全?

    c - 可以用变量体定义一个类似函数的宏吗?