📄 test.c
字号:
TASK_CLK_ID,
&TaskClkStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(producer1,
(void *)0,
&pro1Stk[TASK_STK_SIZE - 1],
pro_1_PRIO,
pro_1_ID,
&pro1Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(producer2,
(void *)0,
&pro2Stk[TASK_STK_SIZE - 1],
pro_2_PRIO,
pro_2_ID,
&pro2Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(consumer1,
(void *)0,
&con1Stk[TASK_STK_SIZE - 1],
con_1_PRIO,
con_1_ID,
&con1Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(consumer2,
(void *)0,
&con2Stk[TASK_STK_SIZE - 1],
con_2_PRIO,
con_2_ID,
&con2Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(messagesend,
(void *)0,
&mes1Stk[TASK_STK_SIZE-1],
mes_1_PRIO,
mes_1_ID,
&mes1Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(messageget,
(void *)0,
&mes2Stk[TASK_STK_SIZE-1],
mes_2_PRIO,
mes_2_ID,
&mes2Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(mutex1,
(void *)0,
&mutex1Stk[TASK_STK_SIZE-1],
mutex_1_PRIO,
mutex_1_ID,
&mutex1Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(mutex2,
(void *)0,
&mutex2Stk[TASK_STK_SIZE-1],
mutex_2_PRIO,
mutex_2_ID,
&mutex2Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
/*$PAGE*/
void messagesend(void *data)
{
INT8U err;
data = data;
for (;;) {
PC_DispChar(18, 19, txmsg, DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSMboxPost(TxMbox, (void *)&txmsg);
OSTimeDlyHMSM(0, 0, 1, 0);
OSMboxPend(AckMbox, 0, &err);
}
}
/*$PAGE*/
void messageget (void *data)
{
char *rx;
INT8U err;
data = data;
for (;;) {
rx = (char *)OSMboxPend(TxMbox, 0, &err); /* Wait for message from Task #4 */
OSTimeDlyHMSM(0, 0, 1, 0);
PC_DispChar(18, 20, *rx, DISP_FGND_YELLOW + DISP_BGND_BLUE);
/* Wait 1 second */
OSMboxPost(AckMbox, (void *)1); /* Acknowledge reception of msg */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* CLOCK TASK
*********************************************************************************************************
*/
void TaskClk (void *data)
{
char s[40];
data = data;
for (;;) {
PC_GetDateTime(s);
PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*===================================================*/
void producer1(void *pdata)
{
INT8U err;
pdata = pdata;
for(;;)
{
temp1=12;
OSSemPend(empty,0,&err);//P(empty)操作,申请一个empty资源,empty-1
data_p=65+random(10);
y=y+1;
PC_DispChar(y, 12,data_p, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if(y==27)
{
y=17;
}
OSSemPend(mutex,0,&err);//临界区操作,此时只能有一个进程(当前进程)访问临界区
buffer[p]=data_p;//把产品放入缓冲池
p=(p+1)%10;
OSSemPost(mutex);//临界区操作,释放当前进程对临界资源的占有
OSSemPost(full);//V(full)操作,释放一个full资源,full+1
OSTaskChangePrio(pro_1_PRIO,12+random(12));
OSTimeDly(600);
}
}
void producer2(void *pdata)
{
INT8U err;
pdata = pdata;
//y=17;
for(;;)
{
temp2=13;
//OSTimeDly(100);
//PC_DispChar(1, 5, 65+empty->OSEventCnt, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSSemPend(empty,0,&err);
//PC_DispChar(1, 6, 65+empty->OSEventCnt, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
data_p=75+random(10);
//data_p=66;
y=y+1;
//PC_DispChar(y, 11,data_p, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispChar(y, 13,data_p, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if(y==27)
{
y=17;
}
OSSemPend(mutex,0,&err);
buffer[p]=data_p;
p=(p+1)%10;
OSSemPost(mutex);
OSSemPost(full);
OSTaskChangePrio(pro_2_PRIO,12+random(12));
OSTimeDly(500);
}
}
void consumer1(void *pdata)
{
INT8U err;
//z=17;
//q=0;
pdata = pdata;
for(;;)
{
OSTimeDly(100);
OSSemPend(full,0,&err); //P申请一个full资源,full-1
OSSemPend(cons,0,&err);//更改消费者互斥信号量
data_c=buffer[q];//取走产品
q=(q+1)%10;
OSSemPost(cons);//还原消费者互斥信号量
z=z+1;
if(temp1==12)
PC_DispStr(z, 12,"-", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if(temp2==13)
PC_DispStr(z, 13,"-", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if(temp3==14)
PC_DispStr(z, 14,"-", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispChar(z, 15, data_c, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if(z==27)
{
z=17;
}
OSSemPost(empty);//V释放一个empty资源,empty+1
OSTaskChangePrio(con_1_PRIO,12+random(12));
OSTimeDly(600);
}
}
void consumer2(void *pdata)
{
INT8U err;
pdata = pdata;
for(;;)
{
OSTimeDly(150);
OSSemPend(full,0,&err);
OSSemPend(mutex,0,&err);
data_c=buffer[q];
q=(q+1)%10;
OSSemPost(mutex);
z=z+1;
if(temp1==12)
PC_DispStr(z, 12,"-", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if(temp2==13)
PC_DispStr(z, 13,"-", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if(temp3==14)
PC_DispStr(z, 14,"-", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispChar(z, 16, data_c, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
if(z==27)
{
z=17;
}
OSSemPost(empty);
OSTaskChangePrio(con_2_PRIO,12+random(12));
OSTimeDly(600);
}
}
/*===================================================*/
void mutex1(void *pdata)
{
INT8U err;
pdata = pdata;
for(;;)
{
OSSemPend(mut,0,&err);//更改临界区访问标识,禁止新的进程访问
PC_DispStr(17, 8,"Task1 is running", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(17, 9,"Task2 is waiting", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSSemPost(mut);//还原访问标识
OSTimeDly(100);
}
}
void mutex2(void *pdata)
{
INT8U err;
pdata = pdata;
for(;;)
{
OSSemPend(mut,0,&err);
PC_DispStr(17, 8,"Task1 is waiting", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(17, 9,"Task2 is running", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSSemPost(mut);
OSTimeDly(200);
}
}
void messinput(void)
{
PC_DispStr(0,18 ,"input message :", DISP_FGND_YELLOW + DISP_BGND_BLUE);
gotoxy(19,19);
scanf("%c",&txmsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -