我正在为运行 uCOS-ii 的嵌入式系统写作。我需要以原子方式写入(和读取)两个整数(值和时间戳,它们应该彼此同步)。最简单的方法是用临界区包装这两个值的写入,从而禁用任何中断或任务切换。但有人告诉我这是非常激进的,而且很容易通过禁用中断来搞乱其他实时的东西。
但是写两个整数是一个很小的操作,我不确定使用互斥锁的整个簿记是否值得。
所以我做了一些测量。我测量了将这两个值写入一百万次所需的时间,并计算了所需的毫秒数。所有这些都是在一个任务中完成的,只是为了了解不同同步机制的开销。结果如下:
- 无同步机制:~65
- 临界区:~185
- 优先级为 2 的互斥体:~1890
- 调度程序锁定:~1750
- 用 1 初始化的信号量:~1165
我承认我用附加的调试器测量了这个,因为我是新手,我不确定我们是否有分析器,但对我来说 CS 最快并且互斥体比信号量慢是有道理的(因为它具有所有优先级反转处理)。
那么我应该由此得出结论,使用临界区是最好的吗?还是禁用中断真的是一件非常糟糕的事情?一般来说 - 是否有关于何时使用每种同步机制的指南?
更新:一位同事建议使用自旋锁。显然,这将比更高级的同步机制具有更小的开销。但我想知道在这种特定情况下它是否比关键部分更好。
更新 2:想一想,因为我们只有一个 CPU,所以自旋锁不会有任何好处。它只会旋转直到上下文切换......