Пример #1
0
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;

} 
Пример #2
0
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;
            
} 
Пример #3
0
// 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;
}
Пример #4
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;

} 
Пример #5
0
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;
    }

}