http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex-guide.html 更多...
函数 | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxAttrInit (LosMuxAttr *attr) |
互斥属性初始化 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxAttrDestroy (LosMuxAttr *attr) |
????? 销毁互斥属 ,这里啥也没干呀 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxAttrGetType (const LosMuxAttr *attr, INT32 *outType) |
获取互斥锁的类型属性,由outType接走,不送! 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxAttrSetType (LosMuxAttr *attr, INT32 type) |
设置互斥锁的类型属性 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxAttrGetProtocol (const LosMuxAttr *attr, INT32 *protocol) |
获取互斥锁的类型属性 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxAttrSetProtocol (LosMuxAttr *attr, INT32 protocol) |
设置互斥锁属性的协议 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxAttrGetPrioceiling (const LosMuxAttr *attr, INT32 *prioceiling) |
获取互斥锁属性优先级 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxAttrSetPrioceiling (LosMuxAttr *attr, INT32 prioceiling) |
设置互斥锁属性的优先级的上限 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxSetPrioceiling (LosMux *mutex, INT32 prioceiling, INT32 *oldPrioceiling) |
设置互斥锁的优先级的上限,老优先级由oldPrioceiling带走 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxGetPrioceiling (const LosMux *mutex, INT32 *prioceiling) |
获取互斥锁的优先级的上限 更多... | |
LITE_OS_SEC_TEXT BOOL | LOS_MuxIsValid (const LosMux *mutex) |
互斥锁是否有效 更多... | |
STATIC UINT32 | OsCheckMutexAttr (const LosMuxAttr *attr) |
检查互斥锁属性是否OK,否则 no ok :|) 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxInit (LosMux *mutex, const LosMuxAttr *attr) |
初始化互斥锁 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxDestroy (LosMux *mutex) |
销毁互斥锁 更多... | |
STATIC VOID | OsMuxBitmapSet (const LosMux *mutex, const LosTaskCB *runTask) |
设置互斥锁位图 更多... | |
VOID | OsMuxBitmapRestore (const LosMux *mutex, const LOS_DL_LIST *list, const LosTaskCB *runTask) |
恢复互斥锁位图 更多... | |
STATIC UINT32 | OsMuxPendOp (LosTaskCB *runTask, LosMux *mutex, UINT32 timeout) |
最坏情况就是拿锁失败,让出CPU,变成阻塞任务,等别的任务释放锁后排到自己了接着执行. 更多... | |
UINT32 | OsMuxLockUnsafe (LosMux *mutex, UINT32 timeout) |
UINT32 | OsMuxTrylockUnsafe (LosMux *mutex, UINT32 timeout) |
尝试加锁, 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxLock (LosMux *mutex, UINT32 timeout) |
拿互斥锁, 更多... | |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxTrylock (LosMux *mutex) |
尝试要锁,没拿到也不等,直接返回,不纠结 更多... | |
STATIC UINT32 | OsMuxPostOp (LosTaskCB *taskCB, LosMux *mutex, BOOL *needSched) |
OsMuxPostOp 是否有其他任务持有互斥锁而处于阻塞状,如果是就要唤醒它,注意唤醒一个任务的操作是由别的任务完成的 OsMuxPostOp只由OsMuxUnlockUnsafe,参数任务归还锁了,自然就会遇到锁要给谁用的问题, 因为很多任务在申请锁,由OsMuxPostOp来回答这个问题 更多... | |
UINT32 | OsMuxUnlockUnsafe (LosTaskCB *taskCB, LosMux *mutex, BOOL *needSched) |
LITE_OS_SEC_TEXT UINT32 | LOS_MuxUnlock (LosMux *mutex) |
释放锁 更多... | |
http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex-guide.html
基本概念 互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理。 任意时刻互斥锁的状态只有两种,开锁或闭锁。当有任务持有时,互斥锁处于闭锁状态,这个任务获得该互斥锁的所有权。 当该任务释放它时,该互斥锁被开锁,任务失去该互斥锁的所有权。当一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有。 多任务环境下往往存在多个任务竞争同一共享资源的应用场景,互斥锁可被用于对共享资源的保护从而实现独占式访问。 另外互斥锁可以解决信号量存在的优先级翻转问题。 运作机制 多任务环境下会存在多个任务访问同一公共资源的场景,而有些公共资源是非共享的临界资源, 只能被独占使用。互斥锁怎样来避免这种冲突呢? 用互斥锁处理临界资源的同步访问时,如果有任务访问该资源,则互斥锁为加锁状态。此时其他任务 如果想访问这个临界资源则会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问 该公共资源,此时互斥锁再次上锁,如此确保同一时刻只有一个任务正在访问这个临界资源,保证了 临界资源操作的完整性。 使用场景 多任务环境下往往存在多个任务竞争同一临界资源的应用场景,互斥锁可以提供任务间的互斥机制, 防止两个任务在同一时刻访问相同的临界资源,从而实现独占式访问。 申请互斥锁有三种模式:无阻塞模式、永久阻塞模式、定时阻塞模式。 无阻塞模式:任务需要申请互斥锁,若该互斥锁当前没有任务持有,或者持有该互斥锁的任务和申请 该互斥锁的任务为同一个任务,则申请成功。 永久阻塞模式:任务需要申请互斥锁,若该互斥锁当前没有被占用,则申请成功。否则,该任务进入阻塞态, 系统切换到就绪任务中优先级高者继续执行。任务进入阻塞态后,直到有其他任务释放该互斥锁,阻塞任务才会重新得以执行。 定时阻塞模式:任务需要申请互斥锁,若该互斥锁当前没有被占用,则申请成功。否则该任务进入阻塞态, 系统切换到就绪任务中优先级高者继续执行。任务进入阻塞态后,指定时间超时前有其他任务释放该互斥锁, 或者用户指定时间超时后,阻塞任务才会重新得以执行。 释放互斥锁: 如果有任务阻塞于该互斥锁,则唤醒被阻塞任务中优先级最高的,该任务进入就绪态,并进行任务调度。 如果没有任务阻塞于该互斥锁,则互斥锁释放成功。 互斥锁典型场景的开发流程: 通过make menuconfig配置互斥锁模块。 创建互斥锁LOS_MuxCreate。 申请互斥锁LOS_MuxPend。 释放互斥锁LOS_MuxPost。 删除互斥锁LOS_MuxDelete。
在文件 los_mux.c 中定义.
LITE_OS_SEC_TEXT UINT32 LOS_MuxAttrDestroy | ( | LosMuxAttr * | attr | ) |
LITE_OS_SEC_TEXT UINT32 LOS_MuxAttrGetPrioceiling | ( | const LosMuxAttr * | attr, |
INT32 * | prioceiling | ||
) |
获取互斥锁属性优先级
LITE_OS_SEC_TEXT UINT32 LOS_MuxAttrGetProtocol | ( | const LosMuxAttr * | attr, |
INT32 * | protocol | ||
) |
获取互斥锁的类型属性
LITE_OS_SEC_TEXT UINT32 LOS_MuxAttrGetType | ( | const LosMuxAttr * | attr, |
INT32 * | outType | ||
) |
获取互斥锁的类型属性,由outType接走,不送!
LITE_OS_SEC_TEXT UINT32 LOS_MuxAttrInit | ( | LosMuxAttr * | attr | ) |
互斥属性初始化
LITE_OS_SEC_TEXT UINT32 LOS_MuxAttrSetPrioceiling | ( | LosMuxAttr * | attr, |
INT32 | prioceiling | ||
) |
设置互斥锁属性的优先级的上限
LITE_OS_SEC_TEXT UINT32 LOS_MuxAttrSetProtocol | ( | LosMuxAttr * | attr, |
INT32 | protocol | ||
) |
设置互斥锁属性的协议
LITE_OS_SEC_TEXT UINT32 LOS_MuxAttrSetType | ( | LosMuxAttr * | attr, |
INT32 | type | ||
) |
设置互斥锁的类型属性
获取互斥锁的优先级的上限
LITE_OS_SEC_TEXT UINT32 LOS_MuxSetPrioceiling | ( | LosMux * | mutex, |
INT32 | prioceiling, | ||
INT32 * | oldPrioceiling | ||
) |
设置互斥锁的优先级的上限,老优先级由oldPrioceiling带走
STATIC UINT32 OsCheckMutexAttr | ( | const LosMuxAttr * | attr | ) |
检查互斥锁属性是否OK,否则 no ok :|)
VOID OsMuxBitmapRestore | ( | const LosMux * | mutex, |
const LOS_DL_LIST * | list, | ||
const LosTaskCB * | runTask | ||
) |
恢复互斥锁位图
设置互斥锁位图
最坏情况就是拿锁失败,让出CPU,变成阻塞任务,等别的任务释放锁后排到自己了接着执行.
OsMuxPostOp
是否有其他任务持有互斥锁而处于阻塞状,如果是就要唤醒它,注意唤醒一个任务的操作是由别的任务完成的 OsMuxPostOp只由OsMuxUnlockUnsafe,参数任务归还锁了,自然就会遇到锁要给谁用的问题, 因为很多任务在申请锁,由OsMuxPostOp来回答这个问题
mutex | |
needSched | |
taskCB |
尝试加锁,