📄 test0310.cpp
字号:
/* head file */
#include "vxWorks.h"
#include "stdio.h"
#include "stdlib.h"
#include "semLib.h"
#include "taskLib.h"
/* macro define */
#define NUM_SAMPLE 10
#define DELAY_TICKS 8
#define STACK_SIZE 20000
typedef struct listnode
{
int m_data;
struct listnode *m_pnext;
}list;
/* global var */
int data;
int result;
list *pcurlist;
/* taskid define */
int tidcosmos;
int tidschlep;
int tidcrunch;
int tidmonitor;
/* semid define */
SEM_ID datasemid;
SEM_ID syncsemid;
SEM_ID listsemid;
/* funtion discribe */
STATUS progStart();
STATUS progStop();
void cosmos();
void schlep();
void crunch();
void monitor();
void nodeAdd();
void nodeScrap();
STATUS progStart()
{
pcurlist = NULL;
datasemid = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
syncsemid = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
listsemid = semMCreate(SEM_Q_PRIORITY|SEM_INVERSION_SAFE|SEM_DELETE_SAFE);
tidcosmos = taskSpawn("tCosmos", 200, 0, STACK_SIZE, (FUNCPTR)cosmos,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
tidschlep = taskSpawn("tSchlep", 230, 0, STACK_SIZE, (FUNCPTR)schlep,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
tidcrunch = taskSpawn("tCrunch", 240, 0, STACK_SIZE, (FUNCPTR)crunch,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
tidmonitor = taskSpawn("tMonitor", 250, 0, STACK_SIZE, (FUNCPTR)monitor,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return OK;
}
void cosmos()
{
FOREVER
{
data = rand();
semGive(datasemid);
taskDelay(DELAY_TICKS);
}
}
void schlep()
{
int i;
FOREVER
{
for(i = 0; i < NUM_SAMPLE; i++)
{
semTake(datasemid, WAIT_FOREVER);
nodeAdd();
}
semGive(syncsemid);
}
}
void crunch()
{
int sum = 0;
list *plist = NULL;
FOREVER
{
sum = 0;
semTake(syncsemid, WAIT_FOREVER);
semTake(listsemid, WAIT_FOREVER);
plist = pcurlist;
while(plist != NULL)
{
sum += plist->m_data;
plist = plist->m_pnext;
}
nodeScrap();
semGive(listsemid);
result = sum;
}
}
void monitor()
{
BOOL ishot = TRUE; /* TRUE = HOT */
int average = RAND_MAX * NUM_SAMPLE / 2;
FOREVER
{
if( (result >= average) && ( !ishot ) )
{
ishot = TRUE;
printf("HOT!\n");
}
if( (result < average) && ( ishot ) )
{
ishot = FALSE;
printf("COOL!\n");
}
}
}
void nodeAdd()
{
list *node = (list *)malloc( sizeof(list) );
if(node == NULL)
{
printf("NodeAdd: out of Memory.\n");
taskSuspend(0);
}
else
{
node->m_data = data;
semTake(listsemid, WAIT_FOREVER);
node->m_pnext = pcurlist;
pcurlist = node;
semGive(listsemid);
}
}
void nodeScrap()
{
list *plist = NULL;
semTake(listsemid, WAIT_FOREVER);
plist = pcurlist;
while(plist != NULL)
{
pcurlist = plist->m_pnext;
free(plist);
plist = pcurlist;
}
semGive(listsemid);
}
STATUS progStop()
{
semTake(listsemid, WAIT_FOREVER);
taskDelete(tidcosmos);
taskDelete(tidschlep);
taskDelete(tidcrunch);
taskDelete(tidmonitor);
semGive(listsemid);
nodeScrap();
semDelete(datasemid);
semDelete(syncsemid);
semDelete(listsemid);
printf("BYE!\n");
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -