volatile int16_t quantity = 100;   // 食物的剩余数量
volatile int16_t eatenCount=0;     // 总共吃掉的实物数量

SemaphoreHandle_t hamburg = NULL; // 汉堡计数器信号量句柄
volatile uint8_t foodie_num=0;    // 吃货计数器
volatile uint8_t chef_num=0;      // 厨子计数器

// 吃货线程
void foodie_task(void *param_t){
  int16_t eaten = 0;        // 吃掉的食物累计
  uint8_t my_num = ++foodie_num;
  while(1){
    if(xSemaphoreTake(hamburg, 1000) == pdPASS){
      eaten++;
      printf("[吃货] %d 号吃货吃了一个汉堡,我一共吃了%d 个。\n", my_num, eaten);
    }else{
      printf("[吃货] %d 号吃货没有等到汉堡!\n", my_num);
    }
    vTaskDelay(pdMS_TO_TICKS(random(500,2000)));
  }
}

// 厨师线程
void chef_task(void *param_t){
  uint8_t my_num = ++chef_num;
  while(1){
    if(xSemaphoreGive(hamburg) == pdTRUE){
      printf("[厨子] %d 号厨子生产了一个汉堡,冰箱里一共有%d个汉堡。\n", my_num, uxSemaphoreGetCount(hamburg));
    }else{
      printf("[厨子] %d厨子,冰箱已满,无法制作汉堡!\n", my_num);
    }
    vTaskDelay(pdMS_TO_TICKS(random(100,1000)));
  }
}

#define FOODIE_COUNT  3     // 吃货的总数量
#define CHEF_COUNT    1     // 厨子的总数量
#define CAPACITY      100   // 冰箱的容量
#define FOOD          0     // 冰箱内初始食物的数量

void setup() {
  Serial.begin(115200);
  hamburg = xSemaphoreCreateCounting(CAPACITY,FOOD);    // 创建一个计数器信号量,容量是100,初始值是0

  for(int i=0; i<FOODIE_COUNT; i++){xTaskCreate(foodie_task, "Foodie", 1024*4, NULL, 1, NULL);}
  for(int i=0; i<CHEF_COUNT; i++){xTaskCreate(chef_task, "Chef", 1024*4, NULL, 1, NULL);}
}

void loop() {
  delay(10); 
}