ucosiii信号量可用于ISR与任务间、任务与任务间的同步,新增加可选模式,如非阻塞等待、释放但不进行任务调度、
新增任务内嵌的信号量(用户程序无需建立信号量便可与任务直接通信)
常规信号量和任务内建信号量
1)常规信号量
一般使用流程
声明
OS_SEMTEST_SEM;
OSSemCreate ((OS_SEM*)&TEST_SEM,
(CPU_CHAR* )"TEST_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
(CPU_CHAR* )"TEST_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
//参数3
//1、OS_OPT_PEND_NON_BLOCKING用于非阻塞方式
//2、OS_OPT_PEND_BLOCKING用于阻塞方式
OSSemPend(&TEST_SEM,100,OS_OPT_PEND_BLOCKING,0,&err);
//参数2
//1、OS_OPT_POST_1 POST and ready only the highest priority task waiting on semaphore(if tasks are waiting)
//2、OS_OPT_POST_ALL POST to ALL tasks that are waiting on the semaphore
//3、OS_OPT_POST_NO_SCHED Do not call the scheduler 发送信号量但系统不需要马上进入调度
OSSemPost(&TEST_SEM,OS_OPT_POST_1,&err);
2) 内嵌信号量
无需自己去创建信号量,只使用于单个任务里面
如串口接收到完整数据,通过内建信号量发送给任务
ISR服务程序里:
//参数二
//1、OS_OPT_POST_NONE
//2、OS_OPT_POST_NO_SCHED
OSTaskSemPost(&MyTaskTCB, OS_OPT_POST_NONE,&err);//参数一指明任务块即可
任务里面:
OSTaskSemPend(100,OS_OPT_PEND_BLOCKING,0,&err);