?? net_os.c
字號:
/*
*********************************************************************************************************
* uC/TCP-IP
* The Embedded TCP/IP Suite
*
* (c) Copyright 2003-2006; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
* Knowledge of the source code may not be used to write a similar
* product. This file may only be used in accordance with a license
* and should not be redistributed in any way.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* OPERATING SYSTEM SUPPORT
*
* Micrium uC/OS-II
*
* Filename : net_os.c
* Version : V1.86
* Programmer(s) : ITJ
*********************************************************************************************************
* Note(s) : (1) Assumes uC/OS-II is included in the product build.
*
* (2) REQUIREs the following uC/OS-II features to be ENABLED :
*
* ---- FEATURE ---- --- MINIMUM NUMBER TO CONFIGURE FOR NET/OS PORT ---
*
* (a) Semaphores NET_OS_NBR_SEM (see 'OS OBJECT DEFINES')
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#define NET_OS_MODULE
#include <net.h>
#include <app_cfg.h>
/*
*********************************************************************************************************
* LOCAL DEFINES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL CONSTANTS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL DATA TYPES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL TABLES
*********************************************************************************************************
*/
/*$PAGE*/
/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*
* Note(s) : (1) (a) Signals & locks are implemented using binary semaphores.
*
* (b) Queues are implemented using counting semaphores.
*********************************************************************************************************
*/
/* -------------------- TASK STKs --------------------- */
static OS_STK NetOS_Tmr_TaskStk[NET_OS_CFG_TMR_TASK_STK_SIZE];
static OS_STK NetOS_IF_RxTaskStk[NET_OS_CFG_IF_RX_TASK_STK_SIZE];
/* --------------------- SIGNALS ---------------------- */
static OS_EVENT *NetOS_InitSignalPtr;
static OS_EVENT *NetOS_NIC_TxRdySignalPtr;
#if (NET_CFG_LOAD_BAL_EN == DEF_ENABLED)
static OS_EVENT *NetOS_TxSuspendSignalPtr;
#endif
#ifdef NET_SOCK_MODULE_PRESENT
#if (NET_SOCK_CFG_TYPE_STREAM_EN == DEF_ENABLED)
static OS_EVENT *NetOS_Sock_ConnReqSignalPtr[NET_SOCK_CFG_NBR_SOCK];
static OS_EVENT *NetOS_Sock_ConnAcceptSignalPtr[NET_SOCK_CFG_NBR_SOCK];
static OS_EVENT *NetOS_Sock_ConnCloseSignalPtr[NET_SOCK_CFG_NBR_SOCK];
#endif
#endif
/* ---------------------- LOCKS ----------------------- */
static OS_EVENT *NetOS_LockPtr;
/* --------------------- QUEUES ----------------------- */
static OS_EVENT *NetOS_IF_RxQPtr;
/* ---------------------- SEMS ------------------------ */
#ifdef NET_TCP_MODULE_PRESENT
static OS_EVENT *NetOS_TCP_RxQ_SemPtr[NET_TCP_CFG_NBR_CONN];
static OS_EVENT *NetOS_TCP_TxQ_SemPtr[NET_TCP_CFG_NBR_CONN];
#endif
#ifdef NET_SOCK_MODULE_PRESENT
static OS_EVENT *NetOS_Sock_RxQ_SemPtr[NET_SOCK_CFG_NBR_SOCK];
#endif
/* ---------------------- TMRS ------------------------ */
#if (NET_CFG_LOAD_BAL_EN == DEF_ENABLED)
static INT16U NetOS_TxSuspendTimeout_tick;
#endif
#ifdef NET_TCP_MODULE_PRESENT
static INT16U NetOS_TCP_RxQ_TimeoutTbl_tick[NET_TCP_CFG_NBR_CONN];
static INT16U NetOS_TCP_TxQ_TimeoutTbl_tick[NET_TCP_CFG_NBR_CONN];
#endif
#ifdef NET_SOCK_MODULE_PRESENT
static INT16U NetOS_Sock_RxQ_TimeoutTbl_tick[NET_SOCK_CFG_NBR_SOCK];
#if (NET_SOCK_CFG_TYPE_STREAM_EN == DEF_ENABLED)
static INT16U NetOS_Sock_ConnReqTimeoutTbl_tick[NET_SOCK_CFG_NBR_SOCK];
static INT16U NetOS_Sock_ConnAcceptTimeoutTbl_tick[NET_SOCK_CFG_NBR_SOCK];
static INT16U NetOS_Sock_ConnCloseTimeoutTbl_tick[NET_SOCK_CFG_NBR_SOCK];
#endif
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
/* ---- NETWORK TIMER MANAGEMENT FUNCTIONS ---- */
static void NetOS_Tmr_Task (void *p_data);
/* ---- NETWORK INTERFACE LAYER FUNCTIONS ----- */
static void NetOS_IF_RxTask (void *p_data);
/* - NETWORK/OS TIMEOUT CALCULATION FUNCTIONS - */
#if ((NET_CFG_LOAD_BAL_EN == DEF_ENABLED) || \
(defined(NET_TCP_MODULE_PRESENT )) || \
(defined(NET_SOCK_MODULE_PRESENT)))
static INT16U NetOS_TimeoutCalc_OS_tick(CPU_INT32U timeout_ms,
NET_ERR *perr);
static CPU_INT32U NetOS_TimeoutCalc_ms (INT16U os_tick);
#endif
/*
*********************************************************************************************************
* LOCAL CONFIGURATION ERRORS
*********************************************************************************************************
*/
#ifndef NET_OS_CFG_IF_RX_TASK_PRIO
#error "NET_OS_CFG_IF_RX_TASK_PRIO not #define'd in 'app_cfg.h'"
#error " [MUST be >= 0] "
#elif (NET_OS_CFG_IF_RX_TASK_PRIO < 0)
#error "NET_OS_CFG_IF_RX_TASK_PRIO illegally #define'd in 'app_cfg.h'"
#error " [MUST be >= 0] "
#endif
#ifndef NET_OS_CFG_TMR_TASK_PRIO
#error "NET_OS_CFG_TMR_TASK_PRIO not #define'd in 'app_cfg.h'"
#error " [MUST be >= 0] "
#elif (NET_OS_CFG_TMR_TASK_PRIO < 0)
#error "NET_OS_CFG_TMR_TASK_PRIO illegally #define'd in 'app_cfg.h'"
#error " [MUST be >= 0] "
#endif
#ifndef NET_OS_CFG_TMR_TASK_STK_SIZE
#error "NET_OS_CFG_TMR_TASK_STK_SIZE not #define'd in 'app_cfg.h'"
#error " [MUST be > 0] "
#elif (NET_OS_CFG_TMR_TASK_STK_SIZE < 1)
#error "NET_OS_CFG_TMR_TASK_STK_SIZE illegally #define'd in 'app_cfg.h'"
#error " [MUST be > 0] "
#endif
#ifndef NET_OS_CFG_IF_RX_TASK_STK_SIZE
#error "NET_OS_CFG_IF_RX_TASK_STK_SIZE not #define'd in 'app_cfg.h'"
#error " [MUST be > 0] "
#elif (NET_OS_CFG_IF_RX_TASK_STK_SIZE < 1)
#error "NET_OS_CFG_IF_RX_TASK_STK_SIZE illegally #define'd in 'app_cfg.h'"
#error " [MUST be > 0] "
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*********************************************************************************************************
* NETWORK FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NetOS_Init()
*
* Description : (1) Perform network/OS initialization :
*
* (a) Implement network initialization signal by creating a counting semaphore.
*
* Initialize network initialization signal with no signal by setting the semaphore
* count to 0 to block the initialization signal semaphore.
*
* (b) Implement global network lock by creating a binary semaphore.
*
* Initialize network lock as released by setting the semaphore count to 1.
*
* (c) Implement network transmit suspend signal by creating a counting semaphore.
*
* Initialize network transmit suspend signal with no signal by setting the semaphore
* count to 0 to block the transmit suspend signal semaphore.
*
*
* Argument(s) : perr Pointer to variable that will receive the return error code from this function :
*
* NET_OS_ERR_NONE Network/OS initialization successful.
*
* NET_OS_ERR_INIT_SIGNAL Network initialization signal
* NOT successfully initialized.
* NET_OS_ERR_INIT_SIGNAL_NAME Network initialization signal name
* NOT successfully configured.
*
* NET_OS_ERR_INIT_LOCK Network lock signal
* NOT successfully initialized.
* NET_OS_ERR_INIT_LOCK_NAME Network lock signal name
* NOT successfully configured.
*
* NET_OS_ERR_INIT_TX_SUSPEND Network transmit suspend signal
* NOT successfully initialized.
* NET_OS_ERR_INIT_TX_SUSPEND_NAME Network transmit suspend signal name
* NOT successfully configured.
* NET_OS_ERR_INIT_TX_SUSPEND_TIMEOUT Network transmit suspend signal timeout
* NOT successfully configured.
*
* Return(s) : none.
*
* Caller(s) : Net_Init().
*
* Note(s) : none.
*********************************************************************************************************
*/
/*$PAGE*/
void NetOS_Init (NET_ERR *perr)
{
#if (OS_EVENT_NAME_SIZE >= NET_OBJ_NAME_SIZE_MAX)
INT8U os_err;
#endif
#if (NET_CFG_LOAD_BAL_EN == DEF_ENABLED)
NET_ERR net_err;
#endif
NetOS_InitSignalPtr = OSSemCreate((INT16U)0); /* Create network initialization signal (see Note #1a). */
if (NetOS_InitSignalPtr == (OS_EVENT *)0) {
*perr = NET_OS_ERR_INIT_SIGNAL;
return;
}
#if (OS_EVENT_NAME_SIZE >= NET_OBJ_NAME_SIZE_MAX)
OSEventNameSet((OS_EVENT *) NetOS_InitSignalPtr,
(INT8U *) NET_INIT_NAME,
(INT8U *)&os_err);
if (os_err != OS_NO_ERR) {
*perr = NET_OS_ERR_INIT_SIGNAL_NAME;
return;
}
#endif
NetOS_LockPtr = OSSemCreate((INT16U)1); /* Create network lock (see Note #1b). */
if (NetOS_LockPtr == (OS_EVENT *)0) {
*perr = NET_OS_ERR_INIT_LOCK;
return;
}
#if (OS_EVENT_NAME_SIZE >= NET_OBJ_NAME_SIZE_MAX)
OSEventNameSet((OS_EVENT *) NetOS_LockPtr,
(INT8U *) NET_LOCK_NAME,
(INT8U *)&os_err);
if (os_err != OS_NO_ERR) {
*perr = NET_OS_ERR_INIT_LOCK_NAME;
return;
}
#endif
#if (NET_CFG_LOAD_BAL_EN == DEF_ENABLED)
NetOS_TxSuspendSignalPtr = OSSemCreate((INT16U)0); /* Create network transmit suspend signal (see Note #1c). */
if (NetOS_TxSuspendSignalPtr == (OS_EVENT *)0) {
*perr = NET_OS_ERR_INIT_TX_SUSPEND;
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -