📄 creat.c
字号:
#include "stdio.h"
#include "taskLib.h"
#include "vxWorks.h"
#include "msgQLib.h"
#include "sysLib.h"
#include "semLib.h"
#include "wdLib.h"
#include "logLib.h"
#include "ioslib.h"
#include "ioLib.h"
#include "stat.h"
#include "dirent.h"
#include "errnoLib.h"
#include "stdlib.h"
#include "stdio.h"
#include "intLib.h"
#include "iv.h"
#include "drv/multi/ppc860siu.h"
#include "drv/intrctl/ppc860Intr.h"
#define numMsg 30
#define pro 100
#define ticksPerSecond 1
#define time_between_int 300
struct msg
{ int tid;
int value;
int status;
}msgshare;
typedef struct
{
DEV_HDR devHdr;
int allowOffset1;
} LED_DEV;
LED_DEV pLEDDevPerFd;
LOCAL SEM_ID semId;
LOCAL SEM_ID semId2;
LOCAL SEM_ID mutexSemId;
LOCAL MSG_Q_ID msgQId;
LOCAL WDOG_ID wdid;
LOCAL BOOL notdone;
LOCAL int ledDrvNum;
STATUS taskA();
STATUS taskB();
STATUS taskC();
STATUS deadlinehandle();
void printt();
void irq5Isr();
STATUS ledDrv();
STATUS ledDevCreate (char *name);
LOCAL LED_DEV *ledOpen(LED_DEV *pLedDv,char *name,int mode);
LOCAL STATUS ledIoctl (LED_DEV *pfd, FAST int function, int arg);
LOCAL STATUS ledClose (LED_DEV *pfd);
void Vx_main();
int taskAId;
int taskBId;
int taskCId;
int TaTccount=0;
int fd;
int Fds;
int Id;
int j=0;
STATUS taskCreat()
{
notdone=TRUE;
Vx_main();
/*IV_IRQ5=(int)(INUM_TO_IVEC(intNum));
intConnect((VOIDFUNCPTR)IV_IRQ5,(VOIDFUNCPTR)irq5Isr,0);
intEnable(IV_IRQ5); */
ledDrv();
ledDevCreate ("ledDrv");
fd=open("ledDrv",O_RDWR,0);
if((semId=semBCreate(SEM_Q_PRIORITY,SEM_FULL))==NULL)
{
perror ("synchronizeDemo: Error in creating semId semaphore");
return (ERROR);
}
if((semId2=semBCreate(SEM_Q_PRIORITY,SEM_FULL))==NULL)
{
perror ("synchronizeDemo: Error in creating semId2 semaphore");
return (ERROR);
}
mutexSemId=semMCreate(SEM_Q_PRIORITY|SEM_DELETE_SAFE|SEM_INVERSION_SAFE);
if((msgQId=msgQCreate(numMsg,sizeof(struct msg),MSG_Q_FIFO))==NULL)
{
perror ("Error in creating msgQ");
return (ERROR);
}
if(taskAId=taskSpawn("ttaskA",pro,0,2000,(FUNCPTR)taskA,0,0,0,0,0,0,0,0,0,0)==ERROR)
{
perror ("TaskA: Error in spawning demoTask");
return (ERROR);
}
if(taskBId=taskSpawn("ttaskB",pro,0,2000,(FUNCPTR)taskB,0,0,0,0,0,0,0,0,0,0)==ERROR)
{
perror ("TaskB: Error in spawning demoTask");
return (ERROR);
}
if(taskCId=taskSpawn("ttaskC",pro,0,2000,(FUNCPTR)taskC,0,0,0,0,0,0,0,0,0,0)==ERROR)
{
perror ("TaskC: Error in spawning demoTask");
return (ERROR);
}
wdid=wdCreate();
while(notdone==TRUE)
taskDelay(sysClkRateGet());
/*if(semDelete(semId)==ERROR)
{
perror("sem delete failed");
return(ERROR);
}*/
if(semDelete(semId2)==ERROR)
{
perror("sem2 delete failed");
return(ERROR);
}
if(msgQDelete(msgQId)==ERROR)
{
perror("msg delete failed");
return(ERROR);
}
close(fd);
return(OK);
}
STATUS taskA()
{
int i;
char input[80];
struct msg megs;
msgshare.status=0;
Id=taskIdSelf();
for(i=0;i<30;i++)
{
taskDelay (250);
printf("Input a number:\n\n\n");
gets (input);
sscanf (input, "%d", &Fds);
printf("The number %d will be transfer.\n\n",Fds);
ioctl(fd,01,0);
taskDelay(60);
megs.tid=taskIdSelf();
megs.value=Fds;
if(semTake(semId,WAIT_FOREVER)==ERROR)
{
perror ("taskA: Error in semTake");
return (ERROR);
}
if(msgQSend(msgQId,(char*)&megs,sizeof(megs),WAIT_FOREVER,MSG_PRI_NORMAL)==ERROR)
{
perror ("Error in sending the message");
return (ERROR);
}
printf("msg send succesful\n");
printf ("TaskA has transfered: tid = %#x,the value is = %d \n",
taskIdSelf (),megs.value);
if(semTake(mutexSemId,WAIT_FOREVER)==ERROR)
{
perror("error in take mutex sem");
return(ERROR);
}
if(msgshare.status==0)
{
msgshare.value=Fds;
msgshare.tid=taskIdSelf();
msgshare.status=1;
}
logMsg ("TaskA:shared data TaskA item = %d from tid = %#x\n",
msgshare.value, msgshare.tid,0,0,0,0);
if(semGive(mutexSemId)==ERROR)
{
perror("error in giving mutex sem");
return(ERROR);
}
}
return(OK);
}
STATUS taskB()
{
int i;
struct msg megbr;
for(i=0;i<30;i++)
{
if(wdStart(wdid,time_between_int,(FUNCPTR)deadlinehandle,0)==ERROR)
{
perror("error in start wdid");
return(ERROR);
}
if((msgQReceive(msgQId, (char*)&megbr,sizeof(megbr),WAIT_FOREVER))!=ERROR)
{
ioctl(fd,10,0);
printf("taskB has get data from A\n");
printf ("TaskB receive the value %d from tid = %#x\n\n",
megbr.value, megbr.tid);
taskDelay(100);
}
if(semGive(semId)==ERROR)
{
perror ("taskB: Error in semGive");
return (ERROR);
}
}
sysAuxClkDisable();
notdone=FALSE;
wdCancel(wdid);
return(OK);
}
STATUS deadlinehandle()
{
logMsg("\n\n taskB missed data from a deadline time ,taskA will restart\n",0,0,0,0,0,0);
taskRestart(Id);
return(OK);
}
STATUS taskC()
{
int i;
sysAuxClkConnect((FUNCPTR)printt,0);
sysAuxClkRateSet(ticksPerSecond);
sysAuxClkEnable();
while(1)
{
taskDelay(200);
if(semTake(mutexSemId,WAIT_FOREVER)==ERROR)
{
perror("error in take mutex sem");
return(ERROR);
}
if(msgshare.status==1)
{
TaTccount++;
msgshare.status=0;
ioctl(fd,11,0);
taskDelay(100);
logMsg ("TaskC: shared data TaskC item = %d from tid = %#x\n",
msgshare.value, msgshare.tid,0,0,0,0);
printf("The system has run %d times\n\n\n",TaTccount);
}
if(semGive(mutexSemId)==ERROR)
{
perror("error in giving mutex sem");
return(ERROR);
}
}
return(OK);
}
void Vx_main(void)
{
STATUS st;
st=intConnect((VOIDFUNCPTR*)IV_IRQ5, (VOIDFUNCPTR)irq5Isr, 0);
if(st==ERROR)
{
perror("Error in connectting ot isr");
return;
}
intEnable((VOIDFUNCPTR)IV_IRQ5);
}
void irq5Isr()
{
int i;
logMsg("system is rebooting\n\n\n",0,0,0,0,0,0);
for(i=0;i<100000;i++);
*SIEL(vxImmrGet()) |=0x00200000;
*SIPEND(vxImmrGet()) |=0x00200000;
reboot();
}
void printt()
{
j++;
if(j==5)
{
logMsg("taskC has Successfully received %d data from taskA\n\n",TaTccount,0,0,0,0,0);
j=0;
}
}
STATUS ledDrv()
{
if (ledDrvNum > 0)
return (OK);
ledDrvNum=iosDrvInstall((FUNCPTR)ledOpen,(FUNCPTR)NULL,(FUNCPTR)ledOpen,ledClose,NULL,NULL,ledIoctl);
return (ledDrvNum == ERROR ? ERROR : OK);
}
STATUS ledDevCreate (char *name)
{
STATUS status;
FAST LED_DEV *pLedDv;
*PBODR(vxImmrGet()) &=0xfcff;
*PBPAR(vxImmrGet()) &=0xfffffcff;
*PBDIR(vxImmrGet()) |=0x00000300; /* port b as output */
if (ledDrvNum < 1)
{
errnoSet (S_ioLib_NO_DRIVER);
return (ERROR);
}
if ((pLedDv = (LED_DEV *) calloc (1, sizeof (LED_DEV))) == NULL)
return (ERROR);
status = iosDevAdd ((DEV_HDR *) pLedDv, name, ledDrvNum);
if (status == ERROR)
free ((char *) pLedDv);
return (status);
}
LOCAL LED_DEV *ledOpen(LED_DEV *pLedDv,char *name,int mode)
{
LED_DEV *pLedDevPerFd=NULL;
pLedDevPerFd = (LED_DEV *) calloc(1,sizeof(LED_DEV));
if (pLedDevPerFd != NULL)
{
return pLedDevPerFd;
}
else
return (LED_DEV *) ERROR;
}
LOCAL STATUS ledIoctl (LED_DEV *pfd, FAST int function, int arg)
{
/*
switch(function)
{
case 00:
*PBDAT(vxImmrGet())=0x00000100;
break;
case 01:
*PBDAT(vxImmrGet())=0x00000100;
break;
case 10:
*PBDAT(vxImmrGet())=0x00001000;
break;
case 11:
*PBDAT(vxImmrGet())=0x00001100;
break;
default:
return(OK) ;
}
return(OK);
*/
STATUS status;
switch(function)
{
case 00:
*PBDAT(vxImmrGet()) &= 0xfffffcff;
status = OK;
break;
case 01:
*PBDAT(vxImmrGet()) &= 0xfffffcff;
*PBDAT(vxImmrGet()) |= 0x00000100;
status = OK;
break;
case 10:
*PBDAT(vxImmrGet()) &= 0xfffffcff;
*PBDAT(vxImmrGet()) |= 0x00000200;
status = OK;
break;
case 11:
*PBDAT(vxImmrGet()) &= 0xfffffcff;
*PBDAT(vxImmrGet()) |= 0x00000300;
status = OK;
break;
default:
errno = S_ioLib_UNKNOWN_REQUEST;
status = ERROR;
}
return (status);
}
LOCAL STATUS ledClose (LED_DEV *pfd)
{
free (pfd);
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -