ucosiii信号量可用于ISR与任务间、任务与任务间的同步,新增加可选模式,如非阻塞等待、释放但不进行任务调度、新增任务内嵌的信号量(用户程序无需建立信号量便可与任务直接通信) 常规信号量和任务内建信号量 1)常规信号量一般使用流程声明OS_SEMTEST_SEM;OSSemCreate ((OS_SEM*)&TEST_SEM, (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);