ESP-IDF: 基于计数型信号量的生产者和消费者模型代码
SemaphoreHandle_t freeBowl = NULL;//初始状态有5个空碗
SemaphoreHandle_t Mantou = NULL;//初始状态没有馒头,从零开始计数
int queue[5]; //用数组模拟空碗,对数组取余操作,模拟循环链表
int number = 0;
void producter() {
int i = 0;
while (1)
{
/* 如果有空碗生产馒头,把空碗数值减一,把馒头数值加一 */
if(xSemaphoreTake(freeBowl,200) == pdTRUE) { //200毫秒获取一次信号量,没有获得信号量不会阻塞,需要加条件判断
queue[(i++)%5] = ++number; //有空碗就生产馒头
printf(“Product mantou amount: %d\n”,number);
xSemaphoreGive(Mantou);
} else {
printf(“没有空碗\n”);
}
vTaskDelay(100);
}
}
void customer() {
int i = 0;
int num = 0;
while (1)
{
/* 如果有馒头拿走馒头,把馒头数值减一,把空碗数值加一 */
if(xSemaphoreTake(Mantou,100)==pdTRUE) { //100毫秒获取一次信号量,没有获得信号量不会阻塞,需要加条件判断
num = queue[(i++)%5]; //有馒头就拿走馒头
printf("customer mantou amount: %d\n",num);
xSemaphoreGive(freeBowl);
} else {
printf("没有馒头了\n");
};
vTaskDelay(500);
}
}
void test24() {
freeBowl = xSemaphoreCreateCounting(5,5);//初始状态一共有5个空碗
Mantou = xSemaphoreCreateCounting(5,0);//初始状态没有馒头,从零开始计数
TaskHandle_t producterHandle = NULL;
TaskHandle_t customerHandle = NULL;
xTaskCreate(producter,“producter”,10248, NULL,10,&producterHandle);
xTaskCreate(customer,“customer”,10248,NULL,10,&customerHandle);
}
void app_main(void)
{
printf(“----test 24 基于计数型信号量的生产者和消费者模型代码----\n”);
test24();
}