#include <includes.h>
#define TASK_STK_SIZE 128
OS_STK AppStk_Producer[TASK_STK_SIZE];
OS_STK AppStk_Consumer[TASK_STK_SIZE];
static void App_Producer(void *p_arg);
static void App_Consumer(void *p_arg);
OS_EVENT *sem_full;
OS_EVENT *sem_empty;
OS_EVENT *sem_mutex;
static INT32U food = 0;
void main(int argc, char *argv[])
{
OSInit(); /* Initialize "uC/OS-II"*/
sem_full = OSSemCreate(0);
sem_empty = OSSemCreate(100);
sem_mutex = OSSemCreate(1);
OSTaskCreate(App_Producer,NULL,(OS_STK *)&AppStk_Producer[TASK_STK_SIZE-1],(INT8U)10);
OSTaskCreate(App_Consumer,NULL,(OS_STK *)&AppStk_Consumer[TASK_STK_SIZE-1],(INT8U)11);
OSStart(); /* Start multitasking */
}
void App_Producer(void *p_arg)
{
INT8U err;
p_arg = p_arg;
while (TRUE)
{
OSSemPend(sem_empty, 0, &err);
OSSemPend(sem_mutex, 0, &err);
food++;
printf("生产者: 食物数量[%03d]\n", food);
OSSemPost(sem_mutex);
OSSemPost(sem_full);
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
void App_Consumer(void *p_arg)
{
INT8U err;
p_arg = p_arg;
while (TRUE)
{
OSSemPend(sem_full, 0, &err);
OSSemPend(sem_mutex, 0, &err);
food--;
printf("消费者: 食物数量[%03d]\n", food);
OSSemPost(sem_mutex);
OSSemPost(sem_empty);
OSTimeDlyHMSM(0, 0, 3, 0);
}
}
运行结果:
工程源码: