#define START_FLAG (1 << 0)
#define ARM1_FLAG (1 << 1)
#define ARM2_FLAG (1 << 2)
#define ARM3_FLAG (1 << 3)
EventGroupHandle_t xEventLoad = NULL; // 装三种物资的事件组
// 面包服务员
void arm1_task(void *param_t){
EventBits_t uxBits;
uxBits = xEventGroupWaitBits(xEventLoad, // 事件组句柄
START_FLAG, // 等待开始事件
pdTRUE, // 读取后不清空标志位
pdTRUE, // ADN关系,1个值无所谓
portMAX_DELAY);
printf("[ARM1] 等到开始事件 : %X\n", uxBits);
vTaskDelay(pdMS_TO_TICKS(random(500,2000)));
uxBits = xEventGroupSetBits(xEventLoad, ARM1_FLAG); // 设置面包标志位
printf("[ARM1] arm1已就绪 : %X\n", uxBits);
vTaskDelete(NULL);
}
// 肉饼服务员
void arm2_task(void *param_t){
EventBits_t uxBits;
delay(1000);
uxBits = xEventGroupWaitBits(xEventLoad, // 事件组句柄
START_FLAG, // 等待开始事件
pdFALSE, // 读取后不清空标志位
pdTRUE, // ADN关系,1个值无所谓
portMAX_DELAY);
printf("[ARM2] 等到开始事件 : %X\n", uxBits);
vTaskDelay(pdMS_TO_TICKS(random(500,2000)));
uxBits = xEventGroupSetBits(xEventLoad, ARM2_FLAG); // 设置肉饼标志位
printf("[ARM2] arm2已就绪 : %X\n", uxBits);
vTaskDelete(NULL);
}
// 蔬菜服务员
void arm3_task(void *param_t){
EventBits_t uxBits;
delay(1000);
uxBits = xEventGroupWaitBits(xEventLoad, // 事件组句柄
START_FLAG, // 等待开始事件
pdFALSE, // 读取后不清空标志位
pdTRUE, // ADN关系,1个值无所谓
portMAX_DELAY);
printf("[ARM3] 等到开始事件 : %X\n", uxBits);
vTaskDelay(pdMS_TO_TICKS(random(500,2000)));
uxBits = xEventGroupSetBits(xEventLoad, ARM3_FLAG); // 设置arm3标志位
printf("[ARM3] arm3已就绪 : %X\n", uxBits);
vTaskDelete(NULL);
}
// 控制台线程
void controller_task(void *param_t){
pinMode(4, INPUT_PULLUP);
while(1){
if(digitalRead(4) == LOW){
// 开始做汉堡
EventBits_t uxBits; // 设置事件标志位的返回值
uxBits = xEventGroupSetBits(xEventLoad, START_FLAG); // 这个返回值有可能会清空标志位,具体读文档
printf("[CONTROLLER] 开始装货 : %X\n", uxBits);
uxBits = xEventGroupWaitBits(xEventLoad, // 事件句柄
ARM1_FLAG | ARM2_FLAG | ARM3_FLAG, // 等待代表面包、肉饼、蔬菜的标志位
pdFALSE, // 是否清空对应标志位
pdTRUE, // 等待的Bits判断关系 True为 AND, False为 OR
portMAX_DELAY); // 等待超时时间
printf("[CONTROLLER] 装完货了 : %X\n", uxBits);
// 重置事件组
xEventGroupClearBits(xEventLoad, START_FLAG | ARM1_FLAG | ARM2_FLAG | ARM3_FLAG);
uxBits = xEventGroupGetBits(xEventLoad);
printf("[CONTROLLER] 物资集齐,发车! : %X\n", uxBits);
vTaskDelete(NULL);
}
vTaskDelay(100);
}
}
void setup() {
Serial.begin(115200);
xEventLoad = xEventGroupCreate(); //初始化事件组
// 启动各个线程
xTaskCreate(arm1_task, "ARM1", 1024*2, NULL, 1, NULL);
xTaskCreate(arm2_task, "ARM2", 1024*2, NULL, 1, NULL);
xTaskCreate(arm3_task, "ARM3", 1024*2, NULL, 1, NULL);
xTaskCreate(controller_task, "CONTROLLRE", 1024*2, NULL, 1, NULL);
}
void loop() {
delay(100);
}