SylixOS原子量操作、自旋锁操作

1. 原子量操作

        原子量操作是不可被打断的一个或者一系列操作。

        当程序存在较多对变量的互斥访问时,程序必然存在较多的锁和锁操作, 一方面这使得程序难以编写和维护,另一方面不合理的锁操作可能会发生死锁。
        为了避免这些问题,SylixOS提供了原子量类型atomic_t及其API,原子量类型可存储一个整型(INT)的值,同时使用原子量API对原子量进行的操作是一个原子操作,因为原子操作不可打断,这样在设备驱动的并发操作中也就不会存在混乱风险。
        SylixOS原子量的类型为atomic_t。使用时需要定义一个atomic_t类型的变量,如:
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。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值