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

📄 creat.c

📁 此源码用于任务间的通信
💻 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 + -