信号量

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)








你可能感兴趣的:(信号量)