中级会员
- 积分
- 378
- 金钱
- 378
- 注册时间
- 2017-11-29
- 在线时间
- 135 小时
|
楼主 |
发表于 2018-3-28 09:40:21
|
显示全部楼层
我是这么理解的:二值信号量创建好以后,内存值有一个sizeof( Queue_t )这么大的空间属于这个信号量,这个Queue_t的结构体里的成员pcHead就指向sizeof( Queue_t )+1,也是这个结构体的末尾(因为semSEMAPHORE_QUEUE_ITEM_LENGTH=0).
使用xSemaphoreGive发送信号量的时候调用xQueueGenericSend发送的队列项内容是空,但是会导致Queue_t 的成员uxMessagesWaiting加1,这就代表这个二值信号量是“满”。
使用xSemaphoreTake提取信号量的时候调用xQueueGenericReceive时会去判断uxMessagesWaiting,看了代码知道如果uxMessagesWaiting>0,进行一大堆的处理返回pdPASS,即获取到信号量了。
理解的关键还是队列操作会使得uxMessagesWaiting在0与1之间变化,所以代表队列项大小的semSEMAPHORE_QUEUE_ITEM_LENGTH为0是可以理解了。 |
|