1. 原子量操作
原子量操作是不可被打断的一个或者一系列操作。
atomic_t atomic;
1. 原子量设置和获取
VOID API_AtomicSet (INT iVal, atomic_t *patomic);
INT API_AtomicGet (atomic_t *patomic);
2. 原子量加减
INT API_AtomicAdd (INT iVal, atomic_t *patomic);
INT API_AtomicSub (INT iVal, atomic_t *patomic);
3. 原子量自增和自减
INT API_AtomicInc (atomic_t *patomic);
INT API_AtomicDec (atomic_t *patomic);
2. 自旋锁操作
自旋锁是为实现保护共享资源而提出的一种轻量级的锁机制。
自旋锁在任何时刻最多只能有一个拥有者,也就是自旋锁最多只能被一个线程持有,如果一个线程试图请求一个已经被持有的自旋锁,那么这个任务就会一直在那里循环判断该自旋锁的拥有者是否已经释放了该锁,直到锁重新可用。要是锁未被使用,请求它的线程便能立刻得到它,继续运行。
SylixOS自旋锁的类型为spinlock_t,使用时需要定义一个spinlock_t类型的变量,如:
spinlock_t spin;
一个自旋锁必须要调用LW_SPIN_INIT函数创建之后才能使用。
程序可以调用LW_SPIN_LOCK函数来等待一个自旋锁,调用LW_SPIN_UNLOCK函数来释放一个自旋锁。
中断服务程序不能调用任何SylixOS自旋锁API。
注意事项:
自旋锁是一种比较低级的保护数据结构或代码片段的原始方式,这种锁机制可能存在以下两个问题:
- 死锁。申请者试图递归地获得自旋锁必然会引发死锁;
- 消耗过多CPU资源。如果申请不成功,申请者将一直循环判断,这无疑降低了CPU的使用率。
因此,只有在占用锁的时间极短的情况下,使用自旋锁才是合理的。当临界区很大或有共享设备的时候,需要较长时间占用锁,使用自旋锁会降低系统性能。
需要注意的是,被自旋锁保护的临界区代码执行时不能因为任何原因放弃CPU,因此在自旋锁保护的区域内不能调用任何可能引发系统任务调度的API。

660

被折叠的 条评论
为什么被折叠?



