一、接口介绍
1.1xSemaphoreGive()
参数:信号量句柄。
返回值:pdPASS释放成功。
1.2xSemaphoreTake()
参数1:句柄;
参数2:阻塞时间。
返回值:pdPASS释放成功。
二、程序设计
2.1xSemaphoreTake()阻塞时间配置为0时
osSemaphoreDef(myBinarySem01);
myBinarySem01Handle = osSemaphoreCreate(osSemaphore(myBinarySem01), 1);//Cube配置信号量默认填满
...
void T1(void const * argument)
{
/* USER CODE BEGIN T1 */
/* Infinite loop */
for(;;)
{
Key_Check();
if(keyvalue == KEY0) {
if(xSemaphoreGive(myBinarySem01Handle) == pdTRUE) {
printf("Give complete\r\n");
}
else {
printf("Give error\r\n");
}
keyvalue = UNKNOW;
}
}
/* USER CODE END T1 */
}
...
void T2(void const * argument)
{
/* USER CODE BEGIN T2 */
/* Infinite loop */
for(;;)
{
Key_Check();
if(keyvalue == KEY1) {
if(xSemaphoreTake(myBinarySem01Handle, 0) == pdTRUE) {
printf("Take complete\r\n");
}
else{
printf("Take error\r\n");
}
keyvalue = UNKNOW;
}
}
/* USER CODE END T2 */
}
运行结果为:
分析:对于第一行二值信号量释放(give)失败是由于Cube配置信号量默认填满,因此第二行取走(take)成功,第三行由于xSemaphoreTake()阻塞时间配置为0时,不可能等,不会卡在if(xSemaphoreTake(myBinarySem01Handle, 0) == pdTRUE)这句话,没东西可取...
2.2xSemaphoreTake()阻塞时间配置为MAX时
void T2(void const * argument)
{
/* USER CODE BEGIN T2 */
/* Infinite loop */
for(;;)
{
Key_Check();
if(keyvalue == KEY1) {
if(xSemaphoreTake(myBinarySem01Handle, portMAX_DELAY) == pdTRUE) {
printf("Take complete\r\n");
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
}
else{
printf("Take error\r\n");
}
keyvalue = UNKNOW;
}
}
/* USER CODE END T2 */
}
运行结果为:
分析: 对于第一行二值信号量取走完成是由于Cube配置信号量默认填满,第二行释放,第三行取走,此时再按下取走键但没有任何显示,这是由于阻塞时间MAX(一直在这里等着),故卡在了if(xSemaphoreTake(myBinarySem01Handle, portMAX_DELAY) == pdTRUE)这句话,进一步按下释放键串口显示Gake而不是Give且小灯亮起,这是因为程序就在这里阻塞着就在这里等着,这就是意味着释放成功,取走成功两者同时完成,因此串口出错...