⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test0310.cpp

📁 应用小程序
💻 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 + -