static void rtExtModeSingleTaskUpload(RT_MODEL * S) { int stIdx; rtExtModeUploadCheckTrigger(rtmGetNumSampleTimes(S)); for (stIdx=0; stIdx < 2; stIdx++) { if (rtmIsSampleHit(S, stIdx, 0 /*unused*/ )) { rtExtModeUpload(stIdx,rtmGetTaskTime(S,stIdx)); } } }
/* Function: rtOneStep ======================================================== * * Abstract: * Perform one step of the model. This function is modeled such that * it could be called from an interrupt service routine (ISR) with minor * modifications. * * This routine is modeled for use in a multitasking environment and * therefore needs to be fully re-entrant when it is called from an * interrupt service routine. * * Note: * Error checking is provided which will only be used if this routine * is attached to an interrupt. * */ static void rt_OneStep(RT_MODEL *S) { int_T i; real_T tnext; int_T *sampleHit = rtmGetSampleHitPtr(S); /*********************************************** * Check and see if base step time is too fast * ***********************************************/ if (GBLbuf.isrOverrun++) { GBLbuf.stopExecutionFlag = 1; return; } /*********************************************** * Check and see if error status has been set * ***********************************************/ if (rtmGetErrorStatus(S) != NULL) { GBLbuf.stopExecutionFlag = 1; return; } /* enable interrupts here */ /* * In a multi-tasking environment, this would be removed from the base rate * and called as a "background" task. */ rtExtModeOneStep(rtmGetRTWExtModeInfo(S), rtmGetNumSampleTimes(S), (boolean_T *)&rtmGetStopRequested(S)); /*********************************************** * Update discrete events * ***********************************************/ tnext = rt_SimUpdateDiscreteEvents(rtmGetNumSampleTimes(S), rtmGetTimingData(S), rtmGetSampleHitPtr(S), rtmGetPerTaskSampleHitsPtr(S)); rtsiSetSolverStopTime(rtmGetRTWSolverInfo(S),tnext); for (i=FIRST_TID+1; i < NUMST; i++) { if (sampleHit[i] && GBLbuf.eventFlags[i]++) { GBLbuf.isrOverrun--; GBLbuf.overrunFlags[i]++; /* Are we sampling too fast for */ GBLbuf.stopExecutionFlag=1; /* sample time "i"? */ return; } } /******************************************* * Step the model for the base sample time * *******************************************/ MdlOutputs(FIRST_TID); rtExtModeUploadCheckTrigger(rtmGetNumSampleTimes(S)); rtExtModeUpload(FIRST_TID,rtmGetTaskTime(S, FIRST_TID)); /* GBLbuf.errmsg = rt_UpdateTXYLogVars(rtmGetRTWLogInfo(S), rtmGetTPtr(S)); if (GBLbuf.errmsg != NULL) { GBLbuf.stopExecutionFlag = 1; return; }*/ /* rt_UpdateSigLogVars(rtmGetRTWLogInfo(S), rtmGetTPtr(S));*/ MdlUpdate(FIRST_TID); if (rtmGetSampleTime(S,0) == CONTINUOUS_SAMPLE_TIME) { rt_UpdateContinuousStates(S); } else { rt_SimUpdateDiscreteTaskTime(rtmGetTPtr(S), rtmGetTimingData(S), 0); } #if FIRST_TID == 1 rt_SimUpdateDiscreteTaskTime(rtmGetTPtr(S), rtmGetTimingData(S),1); #endif /************************************************************************ * Model step complete for base sample time, now it is okay to * * re-interrupt this ISR. * ************************************************************************/ GBLbuf.isrOverrun--; /********************************************* * Step the model for any other sample times * *********************************************/ for (i=FIRST_TID+1; i<NUMST; i++) { /* If task "i" is running, don't run any lower priority task */ if (GBLbuf.overrunFlags[i]) return; if (GBLbuf.eventFlags[i]) { GBLbuf.overrunFlags[i]++; MdlOutputs(i); rtExtModeUpload(i, rtmGetTaskTime(S,i)); MdlUpdate(i); rt_SimUpdateDiscreteTaskTime(rtmGetTPtr(S), rtmGetTimingData(S),i); /* Indicate task complete for sample time "i" */ GBLbuf.overrunFlags[i]--; GBLbuf.eventFlags[i]--; } } rtExtModeCheckEndTrigger(); } /* end rtOneStep */