#define CAR1_FLAG (1 << 0)
#define CAR2_FLAG (1 << 1)
#define CAR3_FLAG (1 << 2)
#define CAR4_FLAG (1 << 3)
EventGroupHandle_t xEventHamburg = NULL; // 动车事件组
// car2
void car2_task(void *param_t){
EventBits_t uxBits;
printf("car2] 2车厢乘客开始上车\n");
vTaskDelay(pdMS_TO_TICKS(random(1000,5000)));
printf("[car2] 2车厢门已锁,随时可以启动!\n");
uxBits = xEventGroupSync(xEventHamburg, // 事件句柄
CAR2_FLAG, // 要设置的标志位
CAR1_FLAG | CAR2_FLAG | CAR3_FLAG | CAR4_FLAG, // 同步等待的标志位
portMAX_DELAY); // 超时时间
printf("[car2] 2车厢已启动 : %X\n", uxBits);
vTaskDelete(NULL);
}
// car3
void car3_task(void *param_t){
EventBits_t uxBits;
printf("[car3] 3车厢乘客开始上车...\n");
vTaskDelay(pdMS_TO_TICKS(random(1000,5000)));
printf("[car3] 3车厢门已锁,随时可以启动!\n");
uxBits = xEventGroupSync(xEventHamburg, // 事件句柄
CAR3_FLAG, // 要设置的标志位
CAR1_FLAG | CAR2_FLAG | CAR3_FLAG | CAR4_FLAG, // 同步等待的标志位
portMAX_DELAY); // 超时时间
printf("[car3] 3车厢已启动 : %X\n", uxBits);
vTaskDelete(NULL);
}
// car4
void car4_task(void *param_t){
EventBits_t uxBits;
printf("[car4] 4车厢乘客开始上车...\n");
vTaskDelay(pdMS_TO_TICKS(random(1000,5000)));
printf("[car4] 4车厢门已锁,随时可以启动!\n");
uxBits = xEventGroupSync(xEventHamburg, // 事件句柄
CAR4_FLAG, // 要设置的标志位
CAR1_FLAG | CAR2_FLAG | CAR3_FLAG | CAR4_FLAG, // 同步等待的标志位
portMAX_DELAY); // 超时时间
printf("[car4] 4车厢已启动 : %X\n", uxBits);
vTaskDelete(NULL);
}
// car1 车头
void car1_task(void *param_t){
pinMode(4, INPUT_PULLUP);
EventBits_t uxBits;
while(1){
if(digitalRead(4) == LOW){
// 开始发车
printf("[car1] 即将准备发车...\n");
uxBits = xEventGroupSync(xEventHamburg, // 事件句柄
CAR1_FLAG, // 要设置的标志位
CAR1_FLAG | CAR2_FLAG | CAR3_FLAG | CAR4_FLAG, // 同步等待的标志位
portMAX_DELAY); // 超时时间
printf("[car1] 发车!!! : %X\n", uxBits);
vTaskDelete(NULL);
}
vTaskDelay(100);
}
}
void setup() {
Serial.begin(115200);
xEventHamburg = xEventGroupCreate(); //初始化事件组
// 启动各个线程
xTaskCreate(car1_task, "car1", 1024*2, NULL, 1, NULL);
xTaskCreate(car2_task, "car2", 1024*2, NULL, 1, NULL);
xTaskCreate(car3_task, "car3", 1024*2, NULL, 1, NULL);
xTaskCreate(car4_task, "car4", 1024*2, NULL, 1, NULL);
}
void loop() {
delay(100);
}