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

📄 functions.c

📁 SERCOSII卡在 linux下的驱动。数控系统开发人员可以在此基础上
💻 C
📖 第 1 页 / 共 2 页
字号:
	char * pbDriveCyclicData;
	pbDriveCyclicData = COMMAND_DATA(uDriveNbr);
	memcpy(pbDriveCyclicData, (char*) psCommandData, sCommandDataLength);
}

DWORD  Init_SHM(void)
{
HANDLE      tmp_handle;
DWORD       ret;
SERC_ARGS_t *pSMem;


	rtl_printf("start the Init_SHM\n");
  /* Shared-Memory fuer Semaphorennamen bilden */
   (void*)ipc_handles.pSMemNames = mbuff_alloc("IPC_NAMES",sizeof(T_IPC_NAMES));

  /* Namen der Shared-memorys eintragen */
	strcpy( ipc_handles.pSMemNames->ACPH_CNL,      "ACPH_CHANNEL");
	strcpy( ipc_handles.pSMemNames->DIAG_CNL,      "DIAGNOSE");
	strcpy( ipc_handles.pSMemNames->CYCLE_DATA_AT, "CYCLE_DATA_AT");
	strcpy( ipc_handles.pSMemNames->CYCLE_DATA_MDT,"CYCLE_DATA_MDT");
 	strcpy( ipc_handles.pSMemNames->SYST_CNL,      "SYST_CHANNEL");

 	(void*)ipc_handles.ACPH_CNL = mbuff_alloc(ipc_handles.pSMemNames->ACPH_CNL,sizeof(SERC_ARGS_t));
	(void*)ipc_handles.CYCLE_DATA_AT = mbuff_alloc(ipc_handles.pSMemNames->CYCLE_DATA_AT,256 * sizeof(T_CYC_DATA));
	(void*)ipc_handles.CYCLE_DATA_MDT = mbuff_alloc(ipc_handles.pSMemNames->CYCLE_DATA_MDT,256 * sizeof(T_CYC_DATA));
 	(void*)ipc_handles.SYST_CNL = mbuff_alloc(ipc_handles.pSMemNames->SYST_CNL,sizeof(SYST_t));
	(void*)ipc_handles.DIAG_CNL = mbuff_alloc(ipc_handles.pSMemNames->DIAG_CNL,sizeof(DIAGNOSE));//not used yet

	sem_init(&ipc_handles.REAL_CNL, 0, 0);//released by SERCANS_ISR ;wait by NC
	sem_init(&ipc_handles.SOFT_SYNC, 0, 0);//released by NC ;wait by SERCANS_ISR
	sem_init(&ipc_handles.TERMINATE_FLAG, 0, 0);//released by NC ;wait by root.o

	sem_init(&ipc_handles.ACPH_BUSY, 0, 1);//acph thread(exchange datas)
	sem_init(&ipc_handles.ACPH_READY, 0, 0);
	sem_init(&ipc_handles.ACPH_FLAG, 0, 0);

	sem_init(&ipc_handles.SYST_BUSY, 0, 1);//syst thread(change phase)
	sem_init(&ipc_handles.SYST_READY, 0, 0);
	sem_init(&ipc_handles.SYST_FLAG, 0, 0);


	sem_init(&ipc_handles.DIAG_FLAG, 0, 0);//diag thread ,not used yet
 

	return(0);
}
void Free_SHM(void)
{
	mbuff_free(ipc_handles.pSMemNames->ACPH_CNL, (void*)ipc_handles.ACPH_CNL);
	mbuff_free(ipc_handles.pSMemNames->CYCLE_DATA_AT, (void*)ipc_handles.CYCLE_DATA_AT);
	mbuff_free(ipc_handles.pSMemNames->CYCLE_DATA_MDT, (void*)ipc_handles.CYCLE_DATA_MDT);
	mbuff_free(ipc_handles.pSMemNames->SYST_CNL, (void*)ipc_handles.SYST_CNL);
	mbuff_free(ipc_handles.pSMemNames->DIAG_CNL, (void*)ipc_handles.DIAG_CNL);

}
ULONG create_parameter_handler_tasks( void )
{
  HANDLE hThread;
  DWORD  threadId;
  ULONG  func_ret;
  int ret;
  func_ret = OK;
  
  ret = pthread_create (&acph_thread, NULL, acph, (void *)"SUSPEND");
  if ( ret == 0 )
  {	/* Eintrag der Task in die CLC-Task-Struktur			*/
    strncpy( SCS_Task[ACPH].Name, "ACPH", 5 );
    SCS_Task[ACPH].Status = CREATED;
  }
  else
    func_ret |= NOT_OK;		/* ACHTUNG - Betriebssystemfehler	*/

  ret = pthread_create (&syst_thread, NULL, syst, (void *)"SUSPEND");
  if ( ret == 0 )
  {	/* Eintrag der Task in die CLC-Task-Struktur			*/
    strncpy( SCS_Task[SYST].Name, "SYST", 5 );
    SCS_Task[SYST].Status = CREATED;
  }
  else
    func_ret |= NOT_OK;		/* ACHTUNG - Betriebssystemfehler	*/

  return( func_ret );

}

ULONG start_parameter_handler_tasks(void)
{
  ULONG ret;
  ULONG func_ret;

  func_ret = OK;


	/****************************************************************/
	/* Start der A-/C-Parameter-Handler Task			*/
	/****************************************************************/
  pthread_wakeup_np (acph_thread);

	/****************************************************************/
	/* Start System channel Handler Task			*/
	/****************************************************************/
  pthread_wakeup_np (svch_thread);

   return( func_ret );
}
unsigned long  acph( PVOID	arg_ptr )
{
  HANDLE acSHMhdl;              /* Shared-Memory fuer A/C Parameter */
  SERC_ARGS_t* ph_ptr;          /* Pointer auf die Uebergabe-Struktur       */
  ULONG ret;                    /* Rueckgabewert fuer RTX-Funktionsaufrufe */
  BOOL  bret;
  T_IPC_NAMES *pSMemNames;      /* Namensliste aller named objects */
  HANDLE hIPCNames;
  ////////
	USHORT usFail,*uspData,iTimeCounter;
	
	ULONG ulData=0,ulLength=0,ulErrorMessage=0;
 	/****************************************************************/
  /* 1. Schritt: Die Prioritaet dieses Threads auf 123 setzen     */
 	/****************************************************************/
	if(!strcmp( "SUSPEND", (char *)arg_ptr )){
		pthread_suspend_np(pthread_self());
	}
  SCS_Task[ACPH].Status = STARTED;

  	p.sched_priority = MIN_PRI+2; 
	pthread_setschedparam(pthread_self(),SCHED_FIFO,&p);

	ph_ptr = ipc_handles.ACPH_CNL;

  SCS_Task[ACPH].Status = READY;        /* ACPH-Task ist 'ready to work'    */
  while( TRUE )
  {
    /* Warte auf eine Anforderung von einer anderen Task */
	sem_wait(&ipc_handles.ACPH_FLAG);	
	ph_ptr->ret = 0;
	iTimeCounter = 0;
	switch (ph_ptr->NCsvch_HMIsvch){
		case NC_SVCH:
			switch ( ph_ptr->rd_wrt ){
    			case PAR_LESEN:
				  /* C- oder A-Parameter lesen */
			//		if(ph_ptr->bSinglePara)
				//	rtl_printf("ph_ptr->ident_nbr=0x%08x\n",ph_ptr->ident_nbr);
					usFail=Request_ReadDriveParameter(ph_ptr->drv_nbr, ph_ptr->ident_nbr,
						ph_ptr->element,ph_ptr->bSinglePara);
					if (usFail != SVCH_OK){
						ph_ptr->ret = usFail;
						break;
					}

					do
					{
						Sleep(WAIT_TIME);
						usFail=Response_ReadDriveParameter(ph_ptr->drv_nbr, &ulData,(USHORT*)(&ulLength));
						iTimeCounter++;
			//			rtl_printf("ph_ptr->ident_nbr=0x%08x\n",ph_ptr->ident_nbr);
			//			rtl_printf("iTimeCounter=%d,usFail=0x%08x\n",iTimeCounter,usFail);
						if(iTimeCounter>10){
							ph_ptr->ret = ERR_ANF_UZL;
							break;
						}
//						rtl_printf("Response_ReadDriveParameter Sleep(WAIT_TIME)\n");

					}while(usFail == SVCH_IN_PROGRESS || usFail == SVCH_NO_READ);
					if (usFail != SVCH_FINISHED){
						if( ph_ptr->ret	==	ERR_ANF_UZL)
							break;
						if( usFail == SVCH_ERROR){
							ph_ptr->ret = ulData;
							break;
						}
						ph_ptr->ret = usFail;
						break;
					}

					if(ph_ptr->bSinglePara)
					{
						ph_ptr->ldata = ulData;//非列表参数将操作数写到ph_ptr->ldata 
					}else{
						memcpy(ph_ptr->vdata,(pbBaseAdress+0x200000)+ulData,ulLength+4);//列表参数,将SERCANSII卡内存首地址(list container #0)写入ph_ptr->vdata 
					}
				  break;

				case PAR_SCHREIBEN:
				  /* C- oder A-Parameter schreiben (Standard) */
					usFail = Request_WriteDriveParameter(ph_ptr->drv_nbr,ph_ptr->ident_nbr,
						ph_ptr->element,ph_ptr,ph_ptr->size,ph_ptr->bSinglePara);
					if (usFail != SVCH_OK){
						ph_ptr->ret = usFail;
						break;
					}

					do
					{
						Sleep(WAIT_TIME);
						usFail=Response_WriteDriveParameter(ph_ptr->drv_nbr, &ulData);
						if(iTimeCounter>10){
							ph_ptr->ret = ERR_ANF_UZL;
							break;
						}
					//	rtl_printf("Response_WriteDriveParameter Sleep(WAIT_TIME)\n");
					}while(usFail == SVCH_IN_PROGRESS || usFail == SVCH_NO_WRITE);
					if (usFail != SVCH_FINISHED){
						if( ph_ptr->ret	==	ERR_ANF_UZL)
							break;
						if( usFail == SVCH_ERROR){
							ph_ptr->ret = ulData;
							break;
						}
						ph_ptr->ret = usFail;
						break;
					}
					break;
			}
			break;
		case HMI_SVCH:
			switch ( ph_ptr->rd_wrt ){
    			case PAR_LESEN:
				  /* C- oder A-Parameter lesen */
					usFail=Request_HMIReadDriveParameter(ph_ptr->ident_nbr,
						ph_ptr->element,ph_ptr->bSinglePara);
					if (usFail != SVCH_OK){
						ph_ptr->ret = usFail;
						break;
					}

					do
					{
						Sleep(WAIT_TIME);
						usFail=Response_HMIReaDriveParameter(&ulData,(USHORT*)(&ulLength));
						if(iTimeCounter>10){
							ph_ptr->ret = ERR_ANF_UZL;
							break;
						}
						rtl_printf("Sleep(WAIT_TIME)\n");
					}while(usFail == SVCH_IN_PROGRESS || usFail == SVCH_NO_READ);
					if (usFail != SVCH_FINISHED){
						if( ph_ptr->ret	==	ERR_ANF_UZL)
							break;

						if( usFail == SVCH_ERROR){
							ph_ptr->ret = ulData;
							break;
						}
						ph_ptr->ret = usFail;
						break;
					}
					if(ph_ptr->bSinglePara)
					{
						ph_ptr->ldata = ulData;
					}else{
						memcpy(ph_ptr->vdata,(pbBaseAdress+0x28018)+ulData,ulLength+4);
					}
				  break;

				case PAR_SCHREIBEN:
				  /* C- oder A-Parameter schreiben (Standard) */
					usFail = Request_HMIWriteDriveParameter(ph_ptr->ident_nbr,
						ph_ptr->element,ph_ptr,ph_ptr->size,ph_ptr->bSinglePara);
					if (usFail != SVCH_OK){
						ph_ptr->ret = usFail;
						break;
					}
					do
					{
						Sleep(WAIT_TIME);
						usFail=Response_HMIWriteDriveParameter(&ulData);
						if(iTimeCounter>10){
							ph_ptr->ret = ERR_ANF_UZL;
							break;
						}
						rtl_printf("Sleep(WAIT_TIME)\n");
					}while(usFail == SVCH_IN_PROGRESS || usFail == SVCH_NO_WRITE);
					
					if (usFail != SVCH_FINISHED){
						if( ph_ptr->ret	==	ERR_ANF_UZL)
							break;
						if( usFail == SVCH_ERROR){
							ph_ptr->ret = ulData;
							break;
						}
						ph_ptr->ret = usFail;
						break;
					}
					break;
			}
			break;
	}
	sem_post(&ipc_handles.ACPH_READY);	
  }
  return(0);
}
unsigned long  syst( PVOID	arg_ptr )
{
	HANDLE acSHMhdl;              /* Shared-Memory fuer A/C Parameter */
	  SYST_t* syst_ptr;          /* Pointer auf die Uebergabe-Struktur       */
	  ULONG ret;                    /* Rueckgabewert fuer RTX-Funktionsaufrufe */
	  BOOL  bret;
	  T_IPC_NAMES *pSMemNames;      /* Namensliste aller named objects */
	  HANDLE hIPCNames;
	  ////////
		USHORT usFail;
		ULONG ulData,ulLength,ulErrorMessage;

	if(!strcmp( "SUSPEND", (char *)arg_ptr )){
//		sem_wait(&syst_suspend_sem);
		pthread_suspend_np(pthread_self());
	}
  SCS_Task[SYST].Status = STARTED;
	p.sched_priority = MIN_PRI;
  pthread_setschedparam(pthread_self(),SCHED_FIFO,&p);
  syst_ptr = ipc_handles.SYST_CNL;
  SCS_Task[SYST].Status = READY;        /* ACPH-Task ist 'ready to work'    */
  while( TRUE )
  {
    /* Warte auf eine Anforderung von einer anderen Task */
	  sem_wait(&ipc_handles.SYST_FLAG);
 	switch (syst_ptr->SYST_TYPE){
		case CLEAR_ERROR:
			*(pbBaseAdress+0x20000)=3;
			break;
		case CHANGE_PHASE:
			*(SHORT*)(pbBaseAdress+0x20004)=syst_ptr->usData;
			rtl_printf("syst_ptr->usData=%d\n",syst_ptr->usData);
			break;
		case SAVE_SYSTEM_PARA:
			*(pbBaseAdress+0x20008)=3;
			break;
		case CLEAR_ALL_ERRORS:
			*(pbBaseAdress+0x2000C)=3;
			break;
		case SET_LIFECOUNTER_DIF:
			*(USHORT*)(pbBaseAdress+0x20010)=syst_ptr->usData;
			break;
		case GET_PHASE:
			syst_ptr->usData=*(pbBaseAdress+0x20024);
			break;
		case GET_DIAG_MESSAGE:
			memcpy(syst_ptr->chData,pbBaseAdress+0x20048,64);
			break;
	}
	sem_post(&ipc_handles.SYST_READY);	
  }
}

void synchronize_user_isr()
{
BOOL  bret;
 
  usCount_NC_SERCOS_TAKT_SYNC_USER--;

  if( !usCount_NC_SERCOS_TAKT_SYNC_USER )
  {

    usCount_NC_SERCOS_TAKT_SYNC_USER=usNC_SERCOS_TAKT;
	sem_post(&ipc_handles.REAL_CNL);	
  }
}/* End of synchronize_user_isr */

void get_nc_serc_cyc()
{
	ULONG ulNcCycleTime,ulSERCANSCycleTime,ulNcAccessTime;
	CRead_Y_Parameter(5,&ulNcCycleTime);
//	rtl_printf("ulNcCycleTime= %d\n",ulNcCycleTime);
	CRead_Y_Parameter(4,&ulNcCycleTime);
//	rtl_printf("ulNcCycleTime= %d\n",ulNcCycleTime);
//	ulNcCycleTime = 2500;
//	ulSERCANSCycleTime = 1000;

	usNC_SERCOS_TAKT =  ulNcCycleTime/ulSERCANSCycleTime;

	if(usNC_SERCOS_TAKT==0)
		usNC_SERCOS_TAKT=1;
	if(ulNcCycleTime % ulSERCANSCycleTime)
		usNC_SERCOS_TAKT++;

	rtl_printf("usNC_SERCOS_TAKT = %d\n",usNC_SERCOS_TAKT);

    usCount_NC_SERCOS_TAKT_SYNC_USER=1;
    usCount_NC_SERCOS_TAKT_USER_ACC =1;

	CRead_Y_Parameter(13,&ulNcAccessTime);
	rtl_printf("ulNcAccessTime= %d\n",ulNcAccessTime);
}

void get_exist_drives()
{
	int i,ret,iLength,iIndex;
	USHORT * uspData;
	ULONG * ulData;
	for(i=1;i<255;i++)
	{
		DriveExist[i] = FALSE;
	}
	ret = CRead_Y_Parameter(2,&ulData);
	uspData=(USHORT*)ulData;
	iLength = uspData[0]/2;//一个驱动器有两个字节
	rtl_printf("get_exist_drives iLength =%d\n",iLength);

	for (i=0;i<iLength;i++)
	{
		iIndex = uspData[i+2];
		rtl_printf("get_exist_drives iIndex =%d\n",iIndex);
		DriveExist[iIndex] = TRUE;
	}


//	HeapFree(GetProcessHeap(),0,(void*)ulData);
}

⌨️ 快捷键说明

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