|
楼主 |
发表于 2019-2-16 18:14:59
|
显示全部楼层
本帖最后由 bucker 于 2019-2-16 18:20 编辑
如果使用事件标志组(EventGroup)的话是可以实现顶楼所需功能的。就像跑圈赛道的信号灯,始终保持绿灯的话车辆可以直接通行,直到亮红灯车辆停止。
EventGroupHandle_t myEvt;
/* LEDTask1 function */
void LEDTask1(void const * argument)
{
myEvt = xEventGroupCreate();
/* definition and creation of myTask02 */
osThreadDef(myTask02, LEDTask2, osPriorityIdle, 0, 128);
myTask02Handle = osThreadCreate(osThread(myTask02), NULL);
for(;;)
{
xEventGroupSetBits(myEvt, 0x01);
HAL_GPIO_WritePin(GPIOA, led1_Pin, GPIO_PIN_SET);
vTaskDelay(100);
xEventGroupClearBits(myEvt, 0x01);
HAL_GPIO_WritePin(GPIOA, led1_Pin, GPIO_PIN_RESET);
vTaskDelay(100);
}
}
/* LEDTask2 function */
void LEDTask2(void const * argument)
{
for(;;)
{
xEventGroupWaitBits(myEvt, 0x01, pdFALSE, pdFALSE, portMAX_DELAY);
HAL_GPIO_WritePin(GPIOA, led2_Pin, GPIO_PIN_SET);
vTaskDelay(10);
HAL_GPIO_WritePin(GPIOA, led2_Pin, GPIO_PIN_RESET);
vTaskDelay(10);
}
}
使用事件标志组模拟运行结果如图
而使用任务标志,无论接收标志的任务是否清除标志,都无法使任务继续获得标志。
|
|