⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 porttimer.c

📁 一个开源的Modbus协议栈
💻 C
字号:
/* 
 * MODBUS Library: AT91SAM7X/FreeRTOS port
 * Copyright (c) 2007 Christian Walter <wolti@sil.at>
 * All rights reserved.
 *
 * $Id: porttimer.c,v 1.1 2007/09/12 10:15:56 wolti Exp $
 */

/* ----------------------- System includes ----------------------------------*/
#include <stdlib.h>

/* ----------------------- FreeRTOS includes --------------------------------*/
#include "FreeRTOS.h"
#include "task.h"

/* ----------------------- Platform includes --------------------------------*/
#include "port.h"

/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"

/* ----------------------- Defines ------------------------------------------*/
#define TIMER_TIMEOUT_INVALID	( 65535U )

/* ----------------------- Type definitions ---------------------------------*/
typedef struct
{
    volatile USHORT usNTimeOutMS;
    volatile USHORT usNTimeLeft;
} xTimerInternalHandle;

/* ----------------------- Static variables ---------------------------------*/
STATIC xTimerInternalHandle arxTimerHdls[1];
STATIC BOOL     bIsInitalized = FALSE;

/* ----------------------- Static functions ---------------------------------*/

/* ----------------------- Start implementation -----------------------------*/

BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
{
    USHORT          usTimeoutMS;

    ENTER_CRITICAL_SECTION(  );
    usTimeoutMS = ( usTim1Timerout50us + 10 ) / 20;
    if( 0 == usTimeoutMS )
    {
        usTimeoutMS = 1;
    }
    arxTimerHdls[0].usNTimeOutMS = usTimeoutMS;
    arxTimerHdls[0].usNTimeLeft = TIMER_TIMEOUT_INVALID;
    bIsInitalized = TRUE;
    EXIT_CRITICAL_SECTION(  );

    return TRUE;
}

void
vMBPortTimerClose( void )
{
    ENTER_CRITICAL_SECTION(  );
    if( bIsInitalized )
    {
        arxTimerHdls[0].usNTimeLeft = TIMER_TIMEOUT_INVALID;
        bIsInitalized = FALSE;
    }
    EXIT_CRITICAL_SECTION(  );
}

void
vMBPortTimersEnable(  )
{
    assert( bIsInitalized );
    ENTER_CRITICAL_SECTION(  );
    arxTimerHdls[0].usNTimeLeft = arxTimerHdls[0].usNTimeOutMS;
    EXIT_CRITICAL_SECTION(  );
}

void
vMBPortTimersDisable(  )
{
    assert( bIsInitalized );
    ENTER_CRITICAL_SECTION(  );
    arxTimerHdls[0].usNTimeLeft = TIMER_TIMEOUT_INVALID;
    EXIT_CRITICAL_SECTION(  );
}

void
vApplicationTickHook( void )
{
    if( bIsInitalized )
    {
        if( TIMER_TIMEOUT_INVALID != arxTimerHdls[0].usNTimeLeft )
        {
            arxTimerHdls[0].usNTimeLeft--;
            if( 0 == arxTimerHdls[0].usNTimeLeft )
            {
                arxTimerHdls[0].usNTimeLeft = TIMER_TIMEOUT_INVALID;
                pxMBPortCBTimerExpired(  );
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -