Moyka/OS/uc/tcpip/Source/net_tmr.h
dimoniche f74fdcceac первый коммит
первый коммит
2019-05-27 23:42:26 +03:00

415 lines
22 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************************************
* uC/TCP-IP
* The Embedded TCP/IP Suite
*
* (c) Copyright 2003-2007; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
*
* uC/TCP-IP is provided in source form for FREE evaluation, for educational
* use or peaceful research. If you plan on using uC/TCP-IP in a commercial
* product you need to contact Micrium to properly license its use in your
* product. We provide ALL the source code for your convenience and to help
* you experience uC/TCP-IP. The fact that the source code is provided does
* NOT mean that you can use it without paying a licensing fee.
*
* Knowledge of the source code may NOT be used to develop a similar product.
*
* Please help us continue to provide the Embedded community with the finest
* software available. Your honesty is greatly appreciated.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* NETWORK TIMER MANAGEMENT
*
* Filename : net_tmr.h
* Version : V1.89
* Programmer(s) : ITJ
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* EXTERNS
*********************************************************************************************************
*/
#ifdef NET_TMR_MODULE
#define NET_TMR_EXT
#else
#define NET_TMR_EXT extern
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* DEFINES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NETWORK TIMER FLAG DEFINES
*********************************************************************************************************
*/
/* ------------------ NET TMR FLAGS ------------------- */
#define NET_TMR_FLAG_NONE DEF_BIT_NONE
#define NET_TMR_FLAG_USED DEF_BIT_00 /* Tmr cur used; i.e. NOT in free tmr pool. */
/*$PAGE*/
/*
*********************************************************************************************************
* NETWORK TIMER TASK TIME DEFINES
*
* Note(s) : (1) Time constants based on NET_TMR_CFG_TASK_FREQ, NetTmr_TaskHandler()'s frequency [i.e. how
* often NetTmr_TaskHandler() is scheduled to run per second as implemented in NetOS_Tmr_Task()].
*
* (2) NET_TMR_CFG_TASK_FREQ MUST NOT be configured as a floating-point frequency.
*
* (3) NET_TMR_TIME_MAX #define'd as longest time constant internally required by the network
* protocol suite.
*********************************************************************************************************
*/
#define NET_TMR_TIME_0S ( 0L)
#define NET_TMR_TIME_10MS (( 10L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_20MS (( 20L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_30MS (( 30L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_40MS (( 40L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_50MS (( 50L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_60MS (( 60L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_70MS (( 70L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_80MS (( 80L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_90MS (( 90L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_100MS ((100L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_200MS ((200L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_300MS ((300L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_400MS ((400L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_500MS ((500L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_600MS ((600L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_700MS ((700L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_800MS ((800L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_900MS ((900L * NET_TMR_CFG_TASK_FREQ) / DEF_TIME_NBR_mS_PER_SEC)
#define NET_TMR_TIME_1S ( 1L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_2S ( 2L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_3S ( 3L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_4S ( 4L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_5S ( 5L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_6S ( 6L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_7S ( 7L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_8S ( 8L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_9S ( 9L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_10S ( 10L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_15S ( 15L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_20S ( 20L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_25S ( 25L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_30S ( 30L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_35S ( 35L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_40S ( 40L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_45S ( 45L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_50S ( 50L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_55S ( 55L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_60S ( 60L * NET_TMR_CFG_TASK_FREQ)
/*$PAGE*/
#define NET_TMR_TIME_1M ( 1L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_2M ( 2L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_3M ( 3L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_4M ( 4L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_5M ( 5L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_6M ( 6L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_7M ( 7L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_8M ( 8L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_9M ( 9L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_10M ( 10L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_15M ( 15L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_20M ( 20L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_25M ( 25L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_30M ( 30L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_35M ( 35L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_40M ( 40L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_45M ( 45L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_50M ( 50L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_55M ( 55L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_60M ( 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_1H ( 1L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_2H ( 2L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_3H ( 3L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_4H ( 4L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_5H ( 5L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_6H ( 6L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_7H ( 7L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_8H ( 8L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_9H ( 9L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_10H ( 10L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_11H ( 11L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_12H ( 12L * 60L * 60L * NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TIME_INFINITE_MS DEF_INT_32U_MAX_VAL
#define NET_TMR_TIME_INFINITE_SEC DEF_INT_32U_MAX_VAL
#define NET_TMR_TIME_MIN NET_TMR_TIME_0S
#define NET_TMR_TIME_MAX NET_TMR_TIME_12H
#define NET_TMR_TIME_TICK 1
#define NET_TMR_TIME_TICK_PER_SEC NET_TMR_TIME_1S
#define NET_TMR_TASK_PERIOD_SEC NET_TMR_CFG_TASK_FREQ
#define NET_TMR_TASK_PERIOD_mS (DEF_TIME_NBR_mS_PER_SEC / NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TASK_PERIOD_uS (DEF_TIME_NBR_uS_PER_SEC / NET_TMR_CFG_TASK_FREQ)
#define NET_TMR_TASK_PERIOD_nS (DEF_TIME_NBR_nS_PER_SEC / NET_TMR_CFG_TASK_FREQ)
/*$PAGE*/
/*
*********************************************************************************************************
* NETWORK TIMER TYPE DEFINES
*
* Note(s) : (1) NET_TMR_TYPE_??? #define values specifically chosen as ASCII representations of the network
* timer types. Memory displays of network timers will display the timer TYPE with the chosen
* ASCII name.
*********************************************************************************************************
*/
/* ------------------ NET TMR TYPES ------------------- */
#if (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG)
#define NET_TMR_TYPE_NONE 0x4E4F4E45 /* "NONE" in ASCII. */
#define NET_TMR_TYPE_TMR 0x544D5220 /* "TMR " in ASCII. */
#else
#if (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_32)
#define NET_TMR_TYPE_NONE 0x454E4F4E /* "NONE" in ASCII. */
#define NET_TMR_TYPE_TMR 0x20524D54 /* "TMR " in ASCII. */
#elif (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_16)
#define NET_TMR_TYPE_NONE 0x4F4E454E /* "NONE" in ASCII. */
#define NET_TMR_TYPE_TMR 0x4D542052 /* "TMR " in ASCII. */
#else /* Dflt CPU_WORD_SIZE_08. */
#define NET_TMR_TYPE_NONE 0x4E4F4E45 /* "NONE" in ASCII. */
#define NET_TMR_TYPE_TMR 0x544D5220 /* "TMR " in ASCII. */
#endif
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* DATA TYPES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NETWORK TIMER QUANTITY DATA TYPE
*********************************************************************************************************
*/
typedef CPU_INT16U NET_TMR_QTY; /* Defines max qty of net tmrs to support. */
/*
*********************************************************************************************************
* NETWORK TIMER TICK DATA TYPE
*
* Note(s) : (1) 'NET_TMR_TICK' data type size determined by selecting the smaller data type size of
* 'CPU_INT16U'/'CPU_INT32U' whose maximum unsigned value is NOT less than NET_TMR_CFG_TICK_TH.
*
* (2) NET_TMR_TIME_INFINITE_TICK & NET_TMR_TIME_INFINITE MUST be globally #define'd AFTER
* 'NET_TMR_TICK' data type declared.
*********************************************************************************************************
*/
#define NET_TMR_CFG_TICK_TH NET_TMR_TIME_MAX
/* Defines max TMR tick cnts. */
#if (NET_TMR_CFG_TICK_TH < 65536)
typedef CPU_INT16U NET_TMR_TICK;
#define NET_TMR_TIME_INFINITE_TICK DEF_INT_16U_MAX_VAL /* Define as max unsigned val (see Note #2). */
#else
typedef CPU_INT32U NET_TMR_TICK;
#define NET_TMR_TIME_INFINITE_TICK DEF_INT_32U_MAX_VAL /* Define as max unsigned val (see Note #2). */
#endif
#define NET_TMR_TIME_INFINITE NET_TMR_TIME_INFINITE_TICK
/*$PAGE*/
/*
*********************************************************************************************************
* NETWORK TIMER DATA TYPE
*
* NET_TMR
* |-------------|
* | Timer Type |
* Previous |-------------|
* Timer <----------O |
* |-------------| Next
* | O----------> Timer
* |-------------| -------------
* | O-------------------------> | |
* |-------------| Object | Object |
* | O----------> Expiration | that |
* |-------------| Function | requested |
* | Current | | Timer |
* | Timer value | | |
* |-------------| -------------
* | Flags |
* |-------------|
*
*
* Note(s) : (1) Forced word-alignment at start of timer NOT required since first data member 'Type' is
* declared as 'CPU_INT32U'.
*
* (2) 'PrevPtr'/'NextPtr' ideally declared as 'NET_TMR' pointers; declared as 'void' pointers
* because 'NET_TMR' NOT fully defined at time of declaration.
*********************************************************************************************************
*/
/* --------------------- NET TMR ---------------------- */
typedef struct net_tmr {
NET_TYPE Type; /* Type cfg'd @ init : NET_TMR_TYPE_TMR. */
void *PrevPtr; /* Ptr to PREV tmr. */
void *NextPtr; /* Ptr to NEXT tmr. */
void *Obj; /* Ptr to obj using TMR. */
CPU_FNCT_PTR Fnct; /* Ptr to fnct used on obj when TMR expires. */
NET_TMR_TICK TmrVal; /* Cur tmr val (in NET_TMR_TICK ticks). */
NET_TMR_QTY ID; /* Tmr id. */
CPU_INT16U Flags; /* Tmr flags. */
} NET_TMR;
/*$PAGE*/
/*
*********************************************************************************************************
* GLOBAL VARIABLES
*********************************************************************************************************
*/
NET_TMR_EXT NET_TMR NetTmr_Tbl[NET_TMR_CFG_NBR_TMR];
NET_TMR_EXT NET_TMR *NetTmr_PoolPtr; /* Ptr to pool of free net tmrs. */
NET_TMR_EXT NET_STAT_POOL NetTmr_PoolStat;
NET_TMR_EXT NET_TMR *NetTmr_TaskListHead; /* Ptr to head of Tmr Task List. */
NET_TMR_EXT NET_TMR *NetTmr_TaskListPtr; /* Ptr to cur Tmr Task List tmr to update. */
#if (NET_CTR_CFG_ERR_EN == DEF_ENABLED) /* ------------------- NET TMR ERRS ------------------- */
NET_TMR_EXT NET_CTR NetTmr_ErrNoneAvailCtr; /* Nbr net tmr unavail accesses. */
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
NET_TMR_EXT NET_CTR NetTmr_ErrNullPtrCtr; /* Nbr null net tmr accesses. */
NET_TMR_EXT NET_CTR NetTmr_ErrNullObjCtr; /* Nbr null net tmr obj accesses. */
NET_TMR_EXT NET_CTR NetTmr_ErrNullFnctCtr; /* Nbr null net tmr fnct accesses. */
NET_TMR_EXT NET_CTR NetTmr_ErrNotUsedCtr; /* Nbr unused net tmr accesses. */
NET_TMR_EXT NET_CTR NetTmr_ErrInvalidTypeCtr; /* Nbr net tmr invalid type accesses. */
#endif
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void NetTmr_Init (NET_ERR *perr);
void NetTmr_TaskHandler (void);
/* ----------- TMR ALLOCATION FNCTS ----------- */
NET_TMR *NetTmr_Get (void *obj,
CPU_FNCT_PTR fnct,
NET_TMR_TICK time,
CPU_INT16U flags,
NET_ERR *perr);
void NetTmr_Free (NET_TMR *ptmr);
/* -------------- TMR API FNCTS --------------- */
void NetTmr_Set (NET_TMR *ptmr,
CPU_FNCT_PTR fnct,
NET_TMR_TICK time,
NET_ERR *perr);
/* ------------- TMR STATUS FNCTS ------------ */
NET_STAT_POOL NetTmr_PoolStatGet (void);
void NetTmr_PoolStatResetMaxUsed(void);
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
* DEFINED IN OS'S net_os.c
*********************************************************************************************************
*/
void NetOS_Tmr_Init (NET_ERR *perr); /* Create & start Tmr Task. */
/*$PAGE*/
/*
*********************************************************************************************************
* CONFIGURATION ERRORS
*********************************************************************************************************
*/
#ifndef NET_TMR_CFG_NBR_TMR
#error "NET_TMR_CFG_NBR_TMR not #define'd in 'net_cfg.h'"
#error " [MUST be > 0] "
#error " [ && < 65536] "
/* See 'NETWORK TIMER QUANTITY DATA TYPE'. */
#elif ((NET_TMR_CFG_NBR_TMR < 1) || \
(NET_TMR_CFG_NBR_TMR > DEF_INT_16U_MAX_VAL))
#error "NET_TMR_CFG_NBR_TMR illegally #define'd in 'net_cfg.h'"
#error " [MUST be > 0] "
#error " [ && < 65536] "
#endif
#ifndef NET_TMR_CFG_TASK_FREQ
#error "NET_TMR_CFG_TASK_FREQ not #define'd in 'net_cfg.h'"
#error " [MUST be > 0 Hz] "
#elif (NET_TMR_CFG_TASK_FREQ < 1)
#error "NET_TMR_CFG_TASK_FREQ illegally #define'd in 'net_cfg.h'"
#error " [MUST be > 0 Hz] "
#endif