📄 memory.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 + -