static void EplEventuRxSignalHandlerCb ( tShbInstance pShbRxInstance_p, unsigned long ulDataSize_p) { tEplEvent *pEplEvent; tShbError ShbError; BYTE* pabDataBuffer; TGT_DBG_SIGNAL_TRACE_POINT(21); pabDataBuffer = &EplEventuInstance_g.m_abRxBuffer[0]; // copy data from event queue ShbError = ShbCirReadDataBlock (pShbRxInstance_p, pabDataBuffer, sizeof(EplEventuInstance_g.m_abRxBuffer), &ulDataSize_p); if(ShbError != kShbOk) { EplEventuPostError(kEplEventSourceEventu, kEplEventReadError, sizeof (ShbError), &ShbError); // error goto exit goto Exit; } // resolve the pointer to the event structure pEplEvent = (tEplEvent *) pabDataBuffer; // set Datasize pEplEvent->m_uiSize = (ulDataSize_p - sizeof(tEplEvent)); if(pEplEvent->m_uiSize > 0) { // set pointer to argument pEplEvent->m_pArg = &pabDataBuffer[sizeof(tEplEvent)]; } else { //set pointer to NULL pEplEvent->m_pArg = NULL; } BENCHMARK_MOD_28_SET(1); // call processfunction EplEventuProcess(pEplEvent); BENCHMARK_MOD_28_RESET(1); Exit: return; }
tEplKernel PUBLIC EplEventkPost(tEplEvent * pEvent_p) { tEplKernel Ret; #if EPL_USE_SHAREDBUFF != FALSE tShbError ShbError; tShbCirChunk ShbCirChunk; unsigned long ulDataSize; unsigned int fBufferCompleted; #endif Ret = kEplSuccessful; // the event must be posted by using the abBuffer // it is neede because the Argument must by copied // to the buffer too and not only the pointer #if EPL_USE_SHAREDBUFF != FALSE // 2006/08/03 d.k.: Event and argument are posted as separate chunks to the event queue. ulDataSize = sizeof(tEplEvent) + ((pEvent_p->m_pArg != NULL) ? pEvent_p->m_uiSize : 0); #endif // decide in which buffer the event have to write switch(pEvent_p->m_EventSink) { // kernelspace modules case kEplEventSinkSync: case kEplEventSinkNmtk: case kEplEventSinkDllk: case kEplEventSinkDllkCal: case kEplEventSinkPdok: case kEplEventSinkPdokCal: case kEplEventSinkErrk: { BENCHMARK_MOD_27_SET(2); #if (EPL_USE_SHAREDBUFF != FALSE) \ && (EPL_EVENT_USE_KERNEL_QUEUE != FALSE) // post message ShbError = ShbCirAllocDataBlock (EplEventkInstance_g.m_pShbKernelInternalInstance, &ShbCirChunk, ulDataSize); switch (ShbError) { case kShbOk: break; case kShbBufferFull: { EplEventkInstance_g.m_uiUserToKernelFullCount++; Ret = kEplEventPostError; goto Exit; } default: { EPL_DBGLVL_EVENTK_TRACE("EplEventkPost(): ShbCirAllocDataBlock(U2K) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } } ShbError = ShbCirWriteDataChunk (EplEventkInstance_g.m_pShbKernelInternalInstance, &ShbCirChunk, pEvent_p, sizeof (tEplEvent), &fBufferCompleted); if (ShbError != kShbOk) { EPL_DBGLVL_EVENTK_TRACE("EplEventkPost(): ShbCirWriteDataChunk(U2K) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } if (fBufferCompleted == FALSE) { ShbError = ShbCirWriteDataChunk (EplEventkInstance_g.m_pShbKernelInternalInstance, &ShbCirChunk, pEvent_p->m_pArg, (unsigned long) pEvent_p->m_uiSize, &fBufferCompleted); if ((ShbError != kShbOk) || (fBufferCompleted == FALSE)) { EPL_DBGLVL_EVENTK_TRACE("EplEventkPost(): ShbCirWriteDataChunk2(U2K) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } } #else #if EPL_EVENT_USE_KERNEL_QUEUE == FALSE EplTgtEnableGlobalInterrupt(FALSE); #endif Ret = EplEventkProcess(pEvent_p); #if EPL_EVENT_USE_KERNEL_QUEUE == FALSE EplTgtEnableGlobalInterrupt(TRUE); #endif #endif BENCHMARK_MOD_27_RESET(2); break; } // userspace modules case kEplEventSinkNmtu: case kEplEventSinkNmtMnu: case kEplEventSinkSdoAsySeq: case kEplEventSinkApi: case kEplEventSinkDlluCal: case kEplEventSinkErru: { #if EPL_USE_SHAREDBUFF != FALSE // post message // BENCHMARK_MOD_27_SET(3); // 74 µs until reset ShbError = ShbCirAllocDataBlock (EplEventkInstance_g.m_pShbKernelToUserInstance, &ShbCirChunk, ulDataSize); if(ShbError != kShbOk) { EPL_DBGLVL_EVENTK_TRACE("EplEventkPost(): ShbCirAllocDataBlock(K2U) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } ShbError = ShbCirWriteDataChunk (EplEventkInstance_g.m_pShbKernelToUserInstance, &ShbCirChunk, pEvent_p, sizeof (tEplEvent), &fBufferCompleted); if(ShbError != kShbOk) { EPL_DBGLVL_EVENTK_TRACE("EplEventkPost(): ShbCirWriteDataChunk(K2U) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } if (fBufferCompleted == FALSE) { ShbError = ShbCirWriteDataChunk (EplEventkInstance_g.m_pShbKernelToUserInstance, &ShbCirChunk, pEvent_p->m_pArg, (unsigned long) pEvent_p->m_uiSize, &fBufferCompleted); if ((ShbError != kShbOk) || (fBufferCompleted == FALSE)) { EPL_DBGLVL_EVENTK_TRACE("EplEventkPost(): ShbCirWriteDataChunk2(K2U) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } } // BENCHMARK_MOD_27_RESET(3); // 82 µs until ShbCirGetReadDataSize() in EplEventu #else Ret = EplEventuProcess(pEvent_p); #endif break; } default: { Ret = kEplEventUnknownSink; } }// end of switch(pEvent_p->m_EventSink) #if EPL_USE_SHAREDBUFF != FALSE Exit: #endif return Ret; }
static void EplEventuRxSignalHandlerCb ( tShbInstance pShbRxInstance_p, unsigned long ulDataSize_p) { tEplEvent *pEplEvent; tShbError ShbError; //unsigned long ulBlockCount; //unsigned long ulDataSize; BYTE abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE]; // d.k.: abDataBuffer contains the complete tEplEvent structure // and behind this the argument // TGT_DBG_SIGNAL_TRACE_POINT(21); // d.k. not needed because it is already done in SharedBuff /* do { BENCHMARK_MOD_28_SET(1); // 4 µs until reset // get messagesize ShbError = ShbCirGetReadDataSize (pShbRxInstance_p, &ulDataSize); if(ShbError != kShbOk) { // error goto exit goto Exit; } BENCHMARK_MOD_28_RESET(1); // 14 µs until set */ // copy data from event queue ShbError = ShbCirReadDataBlock (pShbRxInstance_p, &abDataBuffer[0], sizeof(abDataBuffer), &ulDataSize_p); if(ShbError != kShbOk) { // error goto exit goto Exit; } // resolve the pointer to the event structure pEplEvent = (tEplEvent *) abDataBuffer; // set Datasize pEplEvent->m_uiSize = (ulDataSize_p - sizeof(tEplEvent)); if(pEplEvent->m_uiSize > 0) { // set pointer to argument pEplEvent->m_pArg = &abDataBuffer[sizeof(tEplEvent)]; } else { //set pointer to NULL pEplEvent->m_pArg = NULL; } BENCHMARK_MOD_28_SET(1); // call processfunction EplEventuProcess(pEplEvent); BENCHMARK_MOD_28_RESET(1); // read number of left messages to process // d.k. not needed because it is already done in SharedBuff /* ShbError = ShbCirGetReadBlockCount (pShbRxInstance_p, &ulBlockCount); if (ShbError != kShbOk) { // error goto exit goto Exit; } } while (ulBlockCount > 0); */ Exit: return; }
//--------------------------------------------------------------------------- // // Function: EplEventuPost // // Description: post events from userspace // // // // Parameters: pEvent_p = pointer to event-structur from buffer // // // Returns: tEpKernel = errorcode // // // State: // //--------------------------------------------------------------------------- tEplKernel PUBLIC EplEventuPost(tEplEvent * pEvent_p) { tEplKernel Ret; #if EPL_USE_SHAREDBUFF != FALSE tShbError ShbError; tShbCirChunk ShbCirChunk; unsigned long ulDataSize; unsigned int fBufferCompleted; #endif Ret = kEplSuccessful; #if EPL_USE_SHAREDBUFF != FALSE // 2006/08/03 d.k.: Event and argument are posted as separate chunks to the event queue. ulDataSize = sizeof(tEplEvent) + ((pEvent_p->m_pArg != NULL) ? pEvent_p->m_uiSize : 0); #endif // decide in which buffer the event have to write switch(pEvent_p->m_EventSink) { // kernelspace modules case kEplEventSinkSync: case kEplEventSinkNmtk: case kEplEventSinkDllk: case kEplEventSinkDllkCal: case kEplEventSinkPdok: case kEplEventSinkPdokCal: case kEplEventSinkErrk: { #if (EPL_USE_SHAREDBUFF != FALSE) \ && (EPL_EVENT_USE_KERNEL_QUEUE != FALSE) // post message ShbError = ShbCirAllocDataBlock (EplEventuInstance_g.m_pShbUserToKernelInstance, &ShbCirChunk, ulDataSize); if (ShbError != kShbOk) { //EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirAllocDataBlock(U2K) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } ShbError = ShbCirWriteDataChunk (EplEventuInstance_g.m_pShbUserToKernelInstance, &ShbCirChunk, pEvent_p, sizeof (tEplEvent), &fBufferCompleted); if (ShbError != kShbOk) { //EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirWriteDataChunk(U2K) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } if (fBufferCompleted == FALSE) { ShbError = ShbCirWriteDataChunk (EplEventuInstance_g.m_pShbUserToKernelInstance, &ShbCirChunk, pEvent_p->m_pArg, (unsigned long) pEvent_p->m_uiSize, &fBufferCompleted); if ((ShbError != kShbOk) || (fBufferCompleted == FALSE)) { //EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirWriteDataChunk2(U2K) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } } #else #if EPL_EVENT_USE_KERNEL_QUEUE == FALSE && TARGET_SYSTEM == _NO_OS_ EplTgtEnableGlobalInterrupt(FALSE); #endif Ret = EplEventkProcess(pEvent_p); #if EPL_EVENT_USE_KERNEL_QUEUE == FALSE && TARGET_SYSTEM == _NO_OS_ EplTgtEnableGlobalInterrupt(TRUE); #endif #endif break; } // userspace modules case kEplEventSinkNmtMnu: case kEplEventSinkNmtu: case kEplEventSinkSdoAsySeq: case kEplEventSinkApi: case kEplEventSinkDlluCal: case kEplEventSinkErru: case kEplEventSinkLedu: { #if EPL_USE_SHAREDBUFF != FALSE // post message ShbError = ShbCirAllocDataBlock (EplEventuInstance_g.m_pShbKernelToUserInstance, &ShbCirChunk, ulDataSize); if(ShbError != kShbOk) { //EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirAllocDataBlock(K2U) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } ShbError = ShbCirWriteDataChunk (EplEventuInstance_g.m_pShbKernelToUserInstance, &ShbCirChunk, pEvent_p, sizeof (tEplEvent), &fBufferCompleted); if(ShbError != kShbOk) { //EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirWriteDataChunk(K2U) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } if (fBufferCompleted == FALSE) { ShbError = ShbCirWriteDataChunk (EplEventuInstance_g.m_pShbKernelToUserInstance, &ShbCirChunk, pEvent_p->m_pArg, (unsigned long) pEvent_p->m_uiSize, &fBufferCompleted); if ((ShbError != kShbOk) || (fBufferCompleted == FALSE)) { //EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirWriteDataChunk2(K2U) -> 0x%X\n", ShbError); Ret = kEplEventPostError; goto Exit; } } #else Ret = EplEventuProcess(pEvent_p); #endif break; } default: { Ret = kEplEventUnknownSink; } }// end of switch(pEvent_p->m_EventSink) #if EPL_USE_SHAREDBUFF != FALSE Exit: #endif return Ret; }