Die Scanner Task besteht aus zwei Teilen: einer in klassischem C geschriebenen Interrupt Routine und der auswertenden C++ Task.
int ScanSrvC(void * s_pData, SRegs tStack) { int nRet = E_NOTME; int nIncr = 0; SCounterVal tCVal; // check if this is really my timer interrupt if ((GetDISLong(DIS_TC03_IRCA) & DIS_TC1IREN) == DIS_TC1IREN) { // reset timer cause register DisableDISLong(DIS_TC03_IRCA, DIS_TC1IREN); // reset counters if requested if (g_pHwSMod->bZeroIncr == TRUE) { g_pHwSMod->bZeroIncr = FALSE; ZeroInc2(); } // read all incremental counter values { tCVal.nTick = g_pCVMod->tBuffer.nNextWriteVal; tCVal.nCVal[0] = RadialIn2((UI08*)INCR_B131, 1); tCVal.nCVal[1] = RadialIn2((UI08*)INCR_B131, 2); tCVal.nCVal[2] = RadialIn2((UI08*)INCR_B132, 2); tCVal.nCVal[3] = RadialIn2((UI08*)INCR_B132, 1); tCVal.nCVal[4] = RadialIn2((UI08*)INCR_B133, 1); tCVal.nCVal[5] = RadialIn2((UI08*)INCR_B133, 2); tCVal.nCVal[6] = RadialIn2((UI08*)INCR_B134, 2); tCVal.nCVal[7] = RadialIn2((UI08*)INCR_B134, 1); tCVal.nCVal[8] = RadialIn2((UI08*)INCR_B141, 1); tCVal.nCVal[9] = RadialIn2((UI08*)INCR_B141, 2); tCVal.nCVal[10] = RadialIn2((UI08*)INCR_B142, 2); tCVal.nCVal[11] = RadialIn2((UI08*)INCR_B142, 1); tCVal.nCVal[12] = RadialIn2((UI08*)INCR_B143, 1); tCVal.nCVal[13] = RadialIn2((UI08*)INCR_B143, 2); tCVal.nCVal[14] = RadialIn2((UI08*)INCR_B144, 2); tCVal.nCVal[15] = RadialIn2((UI08*)INCR_B144, 1); } // write the values into hardwarestate data module for (nIncr = 0; nIncr < INCRCOUNTER; ++nIncr) { g_pHwSMod->uIO.aIO[INC_MOD0 + nIncr] = tCVal.nCVal[nIncr]; } // if scanner active is set, write values into countervals data module if (g_pCVMod->bScanActive == TRUE) { // increment the buffer index and start from beginning when reaching the end g_pCVMod->aCVals[g_pCVMod->tBuffer.nNextWriteVal % g_pCVMod->tBuffer.nValCount] = tCVal; ++g_pCVMod->tBuffer.nNextWriteVal; } nRet = 0; } return nRet; }