UCOSIII信号量:资源共享角度阐述
信号量:
二值信号量(共享资源)
计数信号量(用于资源可以被几个任务所用,例如缓存池)
互斥信号量(用于解决优先级反转)
任务内带信号量(只能用于任务同步,一种计数信号量)
1:二值信号量,计数信号量
//定义信号量
OS_SEM MY_SEM;
//创建信号量
OSSemCreate ((OS_SEM*)&MY_SEM,
(CPU_CHAR* )"MY_SEM",
(OS_SEM_CTR)1,
(OS_ERR* )&err);
//OS_SEM_CTR:此处为1表示二值信号量,用于共享资源
计数型信号量,则为计数值
此处为0表示计数信号量,用于任务同步
//请求信号量
OS_SEM_CTR OSSemPend (OS_SEM *p_sem,
OS_TICK timeout,
OS_OPT opt,
CPU_TS *p_ts,
OS_ERR *p_err)
//发送(释放)信号量
OS_SEM_CTR OSSemPost (OS_SEM *p_sem,
OS_OPT opt,
OS_ERR *p_err)
//对于二值信号量:OSSemPend(),OS_SEM_CTR减一,OS_SEM_CTR变为0,表示该信号量被占有
OSSemPost (),OS_SEM_CTR加一,OS_SEM_CTR变为1,表示该信号量可用
//对于计数信号量:每执行OSSemPend(),OS_SEM_CTR减一,OS_SEM_CTR减到0,任务阻塞
每执行 OSSemPost (),OS_SEM_CTR加一
2:互斥信号量(二值信号量)
//定义一个互斥信号量
OS_MUTEX TEST_MUTEX;
//创建一个互斥信号量
void OSMutexCreate (OS_MUTEX *p_mutex,
CPU_CHAR *p_name,
OS_ERR *p_err)
void OSMutexPend (OS_MUTEX *p_mutex,
OS_TICK timeout,
OS_OPT opt,
CPU_TS *p_ts,
OS_ERR *p_err)
void OSMutexPost (OS_MUTEX *p_mutex,
OS_OPT opt,
OS_ERR *p_err)
互斥信号量用于结局二值信号量优先级反转的问题。
低优先级的进程占用共享资源,则高优先级的进程只能等待,
此时介于之间的优先级进程会打断低优先级的进程。这样会延长
高优先级任务的等待时间,
互斥信号量是在执行高优先级等待时,把低优先级的进程优先提高到
和自己一样,这样就结局了优先级反转的问题。
3:任务自带信号量
无需创建,只能用于任务同步,是一种计数信号量
OS_SEM_CTR OSTaskSemPost (OS_TCB *p_tcb,
OS_OPT opt,
OS_ERR *p_err)
OS_SEM_CTR OSTaskSemPend (OS_TICK timeout,
OS_OPT opt,
CPU_TS *p_ts,
OS_ERR *p_err)
联系客服