在项目中,有些手段被多个成员频繁使用,统一归纳并被封装成通用接口也是顺理成章的事情。
这里先列个提纲,后面会慢慢讲解,并且贴上封装后的代码。
<<用户态>>
时间:
usleep -- 用作延时, 其它的时间段以这个为基础。
gettimeofday用来获取微秒时间计数,使用不方便,需要封装一下。
原子操作:
信号量:
sem_init -- 第二人参数必须是0,因为目前不支持进程间。
sem_wait -- 获取信号量,得到就减1.
sem_post -- 释放信号量,加1
sem_destroy -- 销毁
互斥锁:
pthread_mutex_init
pthread_mutex_lock
pthread_mutex_unlock
文件锁(TODO):
fcntl
线程:
pthread_create -- 线程创建,属性参数为NULL代表抢占式,可以配置为FIFO模式。
pthread_join-- 阻塞方式等待线程结束。
<<内核态>>
时间:
udelay -- 微秒,不释放CPU。(mdelay, ndelay)
msleep -- 释放CPU(msleep_interruptible)
原子操作:
信号量(睡眠阻塞):
sema_init
down_interruptible -- 可打断
up
自旋锁(忙等待):
spin_lock_init
spin_lock_irqsave -- (保存中断状态,解锁时恢复)
互斥锁:
mutex_init
mutex_lock_interruptible
mutex_trylock
等待队列:
sleep_on_timeout
interrupt_sleep_on_timeout
内核线程:
kthread_run -- 循环体里面使用schedule调度,msleep里面也是调用schedule