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

📄 memory.c

📁 vxworks共享内存代码
💻 C
字号:
/*
本实验实现了Vxworks任务通信方法中的共享内存通信,实验演示了如果操作一个双向数据链表
taskSend1负责添加数据至双向数据链表
taskTake1负责从数据链表中删除数据
*/

#include <stdlib.h>
#include <stdio.h>

#include "lstLib.h"
#include "semLib.h"
#include "taskLib.h"


/*定义堆栈大小*/
#define STACK_SIZE 20000

int taskSendID; /*发送任务的任务ID*/
int taskTakeID; /*接受任务的任务ID*/

SEM_ID listSemID; /*信号量ID*/

void taskSend1();  /*发送任务的功能函数*/
void taskTake1();  /*接受任务的功能函数*/

/*定义doublelist结构*/
typedef struct double_list
{
    NODE* next;
    NODE* prev;
    int list_n;
}doublelist;

/*定义链表描述符*/
LIST list;

/*子任务是否运行开关*/
BOOL isWork = TRUE;

void myListStart()
{

	/*初始化双向链表模块*/
	lstLibInit();

	/*初始化链表描述符*/
	lstInit(&list);	

	/*创建二进制信号量*/
	listSemID =  semBCreate(SEM_Q_FIFO, SEM_FULL);	

	/*运行任务tSend1和任务tTake1*/
	taskSendID = taskSpawn("tSend1", 99, 0, STACK_SIZE, (FUNCPTR)taskSend1, 0,0,0,0,0,0,0,0,0,0 );
	taskTakeID = taskSpawn("tTake1", 99, 0, STACK_SIZE, (FUNCPTR)taskTake1, 0,0,0,0,0,0,0,0,0,0 );

	/*任务延迟15秒*/
	taskDelay(sysClkRateGet()*15);
	/*让子任务停止工作*/
	isWork = FALSE;

	printf("\n BYE \n");
	
	/*释放双向链表*/
	lstFree(&list);
	/*删除信号量*/
	semDelete(listSemID);
}

void taskSend1()
{
	int i = 0;
	
	/*定义一个指向doublelist数据结构的指针*/
	doublelist *p;


	while(isWork)
	{
		/*获取信号量*/
		semTake(listSemID, WAIT_FOREVER);

		p = malloc(sizeof(doublelist));
		
		p -> list_n = i ++ ;
		
		/*在链表结尾追加一个节点*/
		lstAdd(&list, (NODE*)p);
	
		/*释放信号量*/
		semGive(listSemID);
		/*任务延迟1秒*/
		taskDelay(sysClkRateGet()*1);
	}
			
}

void taskTake1()
{
	
	doublelist *p;
	
	while(isWork)
	{
	/*获取信号量*/
	semTake(listSemID, WAIT_FOREVER);
	
	/*获取首节点,并将其从链表删除*/
	p = (doublelist*)lstGet(&list); 
	
	if(p)
	{
		printf("  %d \n ", p->list_n) ;
		free(p);
	}
	/*释放信号量*/
	semGive(listSemID);
	/*任务延迟*/
	taskDelay(sysClkRateGet()*1);
	}
			
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -