uCOS-II任务间通信之信号量
信号量是什么?信号量有什么用?
信号量是可以用来表示一个或多个事件的发生,还可以用来对共享资源的访问。
uCOS-II提供了5个对信号量进行操作的函数。如下所示:
1. 建立一个信号量 -- OSSemCreate()
2. 等待一个信号量 -- OSSemPend()
3. 发送一个信号量 -- OSSemPost()
4. 无等待地请求一个信号量 -- OSSemAccept()
5. 查询一个信号量的当前状态 -- OSSemQuery()
在MCU看来,创建一个信号量就是申请一个事件控制块,接着初始化这个事件控制块。
首先,它从空闲任务控制块链表中得到一个事件控制块(1),并对空闲事件控制链表的指针进行适当的调整,使它指向下一个空闲的事件控制块(2)。如果这时有任务控制块可用(3),就将该任务控制块的事
信号量是什么?信号量有什么用?
信号量是可以用来表示一个或多个事件的发生,还可以用来对共享资源的访问。
uCOS-II提供了5个对信号量进行操作的函数。如下所示:
1. 建立一个信号量 -- OSSemCreate()
2. 等待一个信号量 -- OSSemPend()
3. 发送一个信号量 -- OSSemPost()
4. 无等待地请求一个信号量 -- OSSemAccept()
5. 查询一个信号量的当前状态 -- OSSemQuery()
OSSemCreate()的实现代码如下:
OS_EVENT *OSSemCreate (INT16U cnt)
{
OS_EVENT *pevent;
OS_ENTER_CRITICAL();
pevent = OSEventFreeList; //(1)
if (OSEventFreeList != (OS_EVENT *)0) { //(2)
OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
}
OS_EXIT_CRITICAL();
if (pevent != (OS_EVENT *)0) { //(3)
pevent->OSEventType = OS_EVENT_TYPE_SEM; //(4)
pevent->OSEventCnt = cnt; //(5)
OSEventWaitListInit(pevent); //(6)
}
return (pevent); //(7)
}
在MCU看来,创建一个信号量就是申请一个事件控制块,接着初始化这个事件控制块。
首先,它从空闲任务控制块链表中得到一个事件控制块(1),并对空闲事件控制链表的指针进行适当的调整,使它指向下一个空闲的事件控制块(2)。如果这时有任务控制块可用(3),就将该任务控制块的事