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);
}