void SYS_TMR_Deinitialize ( SYS_MODULE_OBJ object ) { int ix; // we're up and running // make sure no new clients are accepted _UserGblLock(); // now kill all clients DRV_TMR_Stop(sSysTmrObject.driverHandle); DRV_TMR_Alarm16BitDeregister ( sSysTmrObject.driverHandle); SYS_TMR_CLIENT_OBJECT* pClient = sClientObjects + 0; for ( ix = 0; ix < sizeof(sClientObjects)/sizeof(*sClientObjects); ix++, pClient++ ) { pClient->isrEnable = 0; if ( pClient->currState != SYS_TMR_CLIENT_FREE) { _SYS_TMR_ClientDelete(pClient); } } _UserGblLockDelete(); sSysTmrObject.status = SYS_STATUS_UNINITIALIZED; }
static SYS_TMR_HANDLE _SYS_TMR_ClientCreate ( uint32_t periodMs, uintptr_t context, SYS_TMR_CALLBACK callback, SYS_TMR_FLAGS flags ) { SYS_TMR_CLIENT_OBJECT *timerObj; SYS_TMR_CLIENT_OBJECT *newObj; int index; if(!_SYS_TMR_ReadyCheck()) { return SYS_TMR_HANDLE_INVALID; } // lock user access _UserGblLock(); newObj = (SYS_TMR_CLIENT_OBJECT*)SYS_TMR_HANDLE_INVALID; timerObj = sClientObjects + 0; for ( index = 0; index < sizeof(sClientObjects)/sizeof(*sClientObjects); index++, timerObj++ ) { if ( timerObj->currState == SYS_TMR_CLIENT_FREE ) { // found free object memset(timerObj, 0x0, sizeof(*timerObj)); if(_SYS_TMR_ClientParamSet(timerObj, periodMs, context, callback)) { if((flags & SYS_TMR_FLAG_PERIODIC) != 0) { timerObj->flags.periodic = true; } else if((flags & SYS_TMR_FLAG_AUTO_DELETE) != 0) { timerObj->flags.auto_del = true; } // enable the object, seen by the ISR thread timerObj->currState = SYS_TMR_CLIENT_ACTIVE; timerObj->isrState = SYS_TMR_CLIENT_ISR_ACTIVE; timerObj->isrEnable = 1; newObj = timerObj; } // else wrong parameters break; } } _UserGblUnlock(); return (SYS_TMR_HANDLE)newObj; }
// check the validity of a client handle and locks the user threads // returns a valid pointer if success and _SYS_TMR_ClientSrvUnlock() needs to be called // returns 0 if invalid, do NOT call _SYS_TMR_ClientSrvUnlock ! // static SYS_TMR_CLIENT_OBJECT* _SYS_TMR_ClientCheckSrvLock(SYS_TMR_HANDLE handle) { // lock client access _UserGblLock(); if(handle != 0 && handle != SYS_TMR_HANDLE_INVALID) { // extra sanity check could be added here if( ((SYS_TMR_CLIENT_OBJECT*)handle)->currState > 0) { return (SYS_TMR_CLIENT_OBJECT*)handle; } } // not a valid client _UserGblUnlock(); return 0; }
void SYS_TMR_Deinitialize ( SYS_MODULE_OBJ object ) { int ix; if(!_SYS_TMR_ObjectCheck(object)) { return; } // we're up and running // make sure no new clients are accepted _UserGblLock(); // now kill all clients if ( sSysTmrObject.driverHandle != 0 && sSysTmrObject.driverHandle != DRV_HANDLE_INVALID ) { DRV_TMR_Close(sSysTmrObject.driverHandle); sSysTmrObject.driverHandle = 0; } // release all clients SYS_TMR_CLIENT_OBJECT* pClient = sClientObjects + 0; for ( ix = 0; ix < sizeof(sClientObjects)/sizeof(*sClientObjects); ix++, pClient++ ) { pClient->isrEnable = 0; if ( pClient->currState != SYS_TMR_CLIENT_FREE) { _SYS_TMR_ClientDelete(pClient); } } _UserGblLockDelete(); sSysTmrObject.status = SYS_STATUS_UNINITIALIZED; }
void SYS_TMR_Tasks ( SYS_MODULE_OBJ object ) { SYS_TMR_OBJECT* pTmrObject = (SYS_TMR_OBJECT*)object; // sanity check we're still here if(pTmrObject != &sSysTmrObject) { // no valid handle return; } switch ( sSysTmrObject.status ) { case SYS_STATUS_BUSY: // Performing the initialization // Try to open a TMR driver sSysTmrObject.driverHandle = DRV_TMR_Open ( sSysTmrObject.drvIndex, DRV_IO_INTENT_EXCLUSIVE ); if ( sSysTmrObject.driverHandle == DRV_HANDLE_INVALID ) { // spin here until the driver is opened break; } // try to set up the pservice parameters if(!_SYS_TMR_Setup(&sSysTmrObject)) { // some parameter error occurred sSysTmrObject.status = SYS_STATUS_ERROR; break; } // success /* Set the alarm */ DRV_TMR_Alarm16BitRegister ( sSysTmrObject.driverHandle, sSysTmrObject.driverPeriod, true, (uintptr_t)&sSysTmrObject, _SYS_TMR_AlarmCallback ); /* Start the timer */ DRV_TMR_Start ( sSysTmrObject.driverHandle ); /* Status of the state machine is changed to indicate initialization complete */ sSysTmrObject.status = SYS_STATUS_READY; break; case SYS_STATUS_READY: /* If there is no activity we need not run the loop */ #if (SYS_TMR_INTERRUPT_NOTIFICATION) // block user access; we may delete clients _UserGblLock(); _SYS_TMR_ProcessIsrClients(); _UserGblUnlock(); #else if ( sSysTmrObject.alarmReceived == true ) { sSysTmrObject.alarmReceived = false; // block user access; we may delete clients _UserGblLock(); _SYS_TMR_ProcessTmrAlarm(); _UserGblUnlock(); } #endif // (SYS_TMR_INTERRUPT_NOTIFICATION) break; default: // SYS_STATUS_ERROR // do nothing break; } }