#define START_FLAG (1<<0)
#define FIRST_FLAG (1<<1)
#define SECONED_FLAG (1<<2)
#define THIRD_FLAG (1<<3)
#define FOURTH_FLAG (1<<4)
EventGroupHandle_t xEventRun = NULL;
int i1,i2,i3,i4;
void one_task(void *param_t){
EventBits_t uxBits;
uxBits = xEventGroupWaitBits(xEventRun, // 事件组句柄
START_FLAG, // 等待开始事件
pdFALSE, // 读取后不清空标志位
pdTRUE, // ADN关系,1个值无所谓
portMAX_DELAY);
printf(" 等到起跑指令 : %X\n", uxBits);
i1=random(500,2000);
vTaskDelay(pdMS_TO_TICKS(i1));
uxBits = xEventGroupSetBits(xEventRun, FIRST_FLAG);
printf("一号已冲线 : %X\n", uxBits);
vTaskDelete(NULL);
}
void two_task(void *param_t){
EventBits_t uxBits;
uxBits = xEventGroupWaitBits(xEventRun, // 事件组句柄
START_FLAG, // 等待开始事件
pdFALSE, // 读取后不清空标志位
pdTRUE, // ADN关系,1个值无所谓
portMAX_DELAY);
printf("等到起跑指令 : %X\n", uxBits);
i2=random(500,2000);
vTaskDelay(pdMS_TO_TICKS(i2));
uxBits = xEventGroupSetBits(xEventRun, SECONED_FLAG);
printf("二号已冲线 : %X\n", uxBits);
vTaskDelete(NULL);
}
void three_task(void *param_t){
EventBits_t uxBits;
uxBits = xEventGroupWaitBits(xEventRun, // 事件组句柄
START_FLAG, // 等待开始事件
pdFALSE, // 读取后不清空标志位
pdTRUE, // ADN关系,1个值无所谓
portMAX_DELAY);
printf("等到起跑指令 : %X\n", uxBits);
i3=random(500,2000);
vTaskDelay(pdMS_TO_TICKS(i3));
uxBits = xEventGroupSetBits(xEventRun, THIRD_FLAG);
printf("三号已冲线: %X\n", uxBits);
vTaskDelete(NULL);
}
void four_task(void *param_t){
EventBits_t uxBits;
uxBits = xEventGroupWaitBits(xEventRun, // 事件组句柄
START_FLAG, // 等待开始事件
pdFALSE, // 读取后不清空标志位
pdTRUE, // ADN关系,1个值无所谓
portMAX_DELAY);
printf("等到起跑指令 : %X\n", uxBits);
i4=random(500,2000);
vTaskDelay(pdMS_TO_TICKS(i4));
uxBits = xEventGroupSetBits(xEventRun, FOURTH_FLAG);
printf("四号已冲线: %X\n", uxBits);
vTaskDelete(NULL);
}
// 厨师线程
void judgment_task(void *param_t){
pinMode(4, INPUT_PULLUP);
while(1){
if(digitalRead(4) == LOW){
EventBits_t uxBits; // 设置事件标志位的返回值
uxBits = xEventGroupSetBits(xEventRun, START_FLAG); // 这个返回值有可能会清空标志位,具体读文档
printf("开始计时 %X\n", uxBits);
uxBits = xEventGroupWaitBits(xEventRun, // 事件句柄
FIRST_FLAG | SECONED_FLAG | THIRD_FLAG |FOURTH_FLAG ,
pdFALSE, // 是否清空对应标志位
pdTRUE, // 等待的Bits判断关系 True为 AND, False为 OR
portMAX_DELAY); // 等待超时时间
printf("[比赛结束 : %X\n", uxBits);
// 重置事件组
xEventGroupClearBits(xEventRun, FIRST_FLAG | SECONED_FLAG | THIRD_FLAG |FOURTH_FLAG);
uxBits = xEventGroupGetBits(xEventRun);
printf("一号成绩 %d\n", i1);
printf("二号成绩 %d\n", i2);
printf("三号成绩 %d\n", i3);
printf("四号成绩 %d\n", i4);
vTaskDelete(NULL);
}
vTaskDelay(100);
}
}
void setup() {
Serial.begin(115200);
xEventRun = xEventGroupCreate(); //初始化事件组
// 启动各个线程
xTaskCreate(judgment_task, "Chef", 1024*2, NULL, 1, NULL);
xTaskCreate(one_task, "Bread", 1024*2, NULL, 1, NULL);
xTaskCreate(two_task, "Meat", 1024*2, NULL, 1, NULL);
xTaskCreate(three_task, "Vegetable", 1024*2, NULL, 1, NULL);
xTaskCreate(four_task, "Vegetable", 1024*2, NULL, 1, NULL);
}
void loop() {
delay(100);
}