📄 net_os.c
字号:
timeout_ms = (CPU_INT16U)NetOS_TimeoutCalc_ms(os_tick); /* Calculate timeout value (in milliseconds). */
*perr = NET_ERR_NONE;
return (timeout_ms);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*********************************************************************************************************
* NETWORK TIMER MANAGEMENT FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NetOS_Tmr_Init()
*
* Description : (1) Perform Timer/OS initialization :
*
* (a) Create network timer task
*
*
* Argument(s) : perr Pointer to variable that will receive the return error code from this function :
*
* NET_OS_ERR_NONE Network timer/OS initialization successful.
* NET_OS_ERR_INIT_TMR_TASK Network timer task NOT successfully
* initialized.
* NET_OS_ERR_INIT_TMR_TASK_NAME Network timer task name NOT successfully
* configured.
*
* Return(s) : none.
*
* Caller(s) : NetTmr_Init().
*
* Note(s) : none.
*********************************************************************************************************
*/
/*$PAGE*/
void NetOS_Tmr_Init (NET_ERR *perr)
{
INT8U os_err;
/* Create NetOS_Tmr_Task() [see Note #1a]. */
#if (OS_TASK_CREATE_EXT_EN == 1)
#if (OS_STK_GROWTH == 1)
os_err = OSTaskCreateExt((void (*)(void *)) NetOS_Tmr_Task,
(void * ) 0,
(OS_STK * )&NetOS_Tmr_TaskStk[NET_OS_CFG_TMR_TASK_STK_SIZE - 1],
(INT8U ) NET_OS_CFG_TMR_TASK_PRIO,
(INT16U ) NET_OS_CFG_TMR_TASK_PRIO, /* Set task id same as task prio. */
(OS_STK * )&NetOS_Tmr_TaskStk[0],
(INT32U ) NET_OS_CFG_TMR_TASK_STK_SIZE,
(void * ) 0,
(INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));
#else
os_err = OSTaskCreateExt((void (*)(void *)) NetOS_Tmr_Task,
(void * ) 0,
(OS_STK * )&NetOS_Tmr_TaskStk[0],
(INT8U ) NET_OS_CFG_TMR_TASK_PRIO,
(INT16U ) NET_OS_CFG_TMR_TASK_PRIO, /* Set task id same as task prio. */
(OS_STK * )&NetOS_Tmr_TaskStk[NET_OS_CFG_TMR_TASK_STK_SIZE - 1],
(INT32U ) NET_OS_CFG_TMR_TASK_STK_SIZE,
(void * ) 0,
(INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));
#endif
#else
#if (OS_STK_GROWTH == 1)
os_err = OSTaskCreate((void (*)(void *)) NetOS_Tmr_Task,
(void * ) 0,
(OS_STK * )&NetOS_Tmr_TaskStk[NET_OS_CFG_TMR_TASK_STK_SIZE - 1],
(INT8U ) NET_OS_CFG_TMR_TASK_PRIO);
#else
os_err = OSTaskCreate((void (*)(void *)) NetOS_Tmr_Task,
(void * ) 0,
(OS_STK * )&NetOS_Tmr_TaskStk[0],
(INT8U ) NET_OS_CFG_TMR_TASK_PRIO);
#endif
#endif
if (os_err != OS_NO_ERR) {
*perr = NET_OS_ERR_INIT_TMR_TASK;
return;
}
#if (OS_TASK_NAME_SIZE >= NET_TASK_NAME_SIZE_MAX)
OSTaskNameSet((INT8U ) NET_OS_CFG_TMR_TASK_PRIO,
(INT8U *) NET_TMR_TASK_NAME,
(INT8U *)&os_err);
if (os_err != OS_NO_ERR) {
*perr = NET_OS_ERR_INIT_TMR_TASK_NAME;
return;
}
#endif
*perr = NET_OS_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetOS_Tmr_Task()
*
* Description : OS-dependent shell task to schedule & run Timer Task Handler.
*
* (1) Shell task's primary purpose is to schedule & run NetTmr_TaskHandler(); shell task
* should run NetTmr_TaskHandler() at NET_TMR_CFG_TASK_FREQ rate forever (i.e. shell
* task should NEVER exit).
*
*
* Argument(s) : p_data Pointer to task initialization data (required by uC/OS-II).
*
* Return(s) : none.
*
* Created by : NetOS_Tmr_Init().
*
* Note(s) : (2) Assumes OS_TICKS_PER_SEC frequency is greater than NET_TMR_CFG_TASK_FREQ. Otherwise,
* timer task scheduling rate will NOT be correct.
*********************************************************************************************************
*/
static void NetOS_Tmr_Task (void *p_data)
{
INT16U dly;
(void)&p_data; /* Prevent compiler warning. */
dly = OS_TICKS_PER_SEC / NET_TMR_CFG_TASK_FREQ; /* Delay task at NET_TMR_CFG_TASK_FREQ rate. */
while (DEF_ON) {
OSTimeDly(dly);
NetTmr_TaskHandler();
}
}
/*$PAGE*/
/*
*********************************************************************************************************
*********************************************************************************************************
* NETWORK INTERFACE CARD FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NetOS_NIC_Init()
*
* Description : (1) Perform NIC/OS initialization :
*
* (a) Implement NIC transmit ready signal by creating a binary semaphore.
*
* Initialize transmit ready signal based on configuration :
*
* (1) NET_NIC_CFG_TX_RDY_INIT_VAL configured to initialize the NIC-transmit-ready
* OS object with one of the following values :
*
* (A) 0, for NIC driver's that implement the NIC's transmit-ready status using
* the Transmit Empty interrupt.
*
* (B) 1, for NIC driver's that implement the NIC's transmit-ready status using
* the Transmit Complete interrupt.
*
* See also 'net_cfg NETWORK INTERFACE CARD CONFIGURATION Note #2'.
*
*
* Argument(s) : perr Pointer to variable that will receive the return error code from this function :
*
* NET_OS_ERR_NONE NIC/OS initialization successful.
* NET_OS_ERR_INIT_NIC_TX_RDY NIC transmit ready signal NOT successfully
* initialized.
* NET_OS_ERR_INIT_NIC_TX_RDY_NAME NIC transmit ready name NOT successfully
* configured.
*
* Return(s) : none.
*
* Caller(s) : NetNIC_Init().
*
* Note(s) : none.
*********************************************************************************************************
*/
void NetOS_NIC_Init (NET_ERR *perr)
{
#if (OS_EVENT_NAME_SIZE >= NET_OBJ_NAME_SIZE_MAX)
INT8U os_err;
#endif
/* Create transmit ready signal (see Note #1a). */
NetOS_NIC_TxRdySignalPtr = OSSemCreate((INT16U)NET_NIC_CFG_TX_RDY_INIT_VAL);
if (NetOS_NIC_TxRdySignalPtr == (OS_EVENT *)0) {
*perr = NET_OS_ERR_INIT_NIC_TX_RDY;
return;
}
#if (OS_EVENT_NAME_SIZE >= NET_OBJ_NAME_SIZE_MAX)
OSEventNameSet((OS_EVENT *) NetOS_NIC_TxRdySignalPtr,
(INT8U *) NET_NIC_TX_RDY_NAME,
(INT8U *)&os_err);
if (os_err != OS_NO_ERR) {
*perr = NET_OS_ERR_INIT_NIC_TX_RDY_NAME;
return;
}
#endif
*perr = NET_OS_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetOS_NIC_TxRdyWait()
*
* Description : Wait on NIC transmit ready signal.
*
* Argument(s) : perr Pointer to variable that will receive the return error code from this function :
*
* NET_NIC_ERR_NONE NIC transmit ready signal received.
* NET_NIC_ERR_TX_RDY_SIGNAL_TIMEOUT NIC transmit ready signal NOT received
* by timeout.
*
* Return(s) : none.
*
* Caller(s) : NetIF_Pkt_Tx(),
* NetIF_Char_Tx().
*
* Note(s) : (1) If timeouts NOT desired, wait on NIC transmit ready signal forever (i.e. do NOT exit).
*
* (2) If timeout desired, return NET_NIC_ERR_TX_RDY_SIGNAL_TIMEOUT error on transmit ready
* timeout. Implement timeout with OS-dependent function.
*********************************************************************************************************
*/
void NetOS_NIC_TxRdyWait (NET_ERR *perr)
{
INT8U os_err;
OSSemPend(NetOS_NIC_TxRdySignalPtr, (INT16U)0, &os_err); /* Wait on NIC transmit ready signal. */
switch (os_err) {
case OS_NO_ERR:
*perr = NET_NIC_ERR_NONE;
break;
case OS_TIMEOUT:
case OS_ERR_EVENT_TYPE:
case OS_ERR_PEVENT_NULL:
case OS_ERR_PEND_ISR:
default:
*perr = NET_NIC_ERR_TX_RDY_SIGNAL_TIMEOUT;
break;
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetOS_NIC_TxRdySignal()
*
* Description : Signal NIC transmit that NIC transmit buffer is ready.
*
* Argument(s) : psignal Pointer to value that signals NIC transmit.
*
* Return(s) : none.
*
* Caller(s) : NetNIC_TxISR_Handler().
*
* Note(s) : (1) #### NIC transmit ready MUST be signaled--i.e. MUST signal without failure.
*
* Failure to signal NIC transmit ready will prevent NIC from transmitting packets.
*********************************************************************************************************
*/
void NetOS_NIC_TxRdySignal (void)
{
INT8U os_err;
/* Signal NIC transmit that transmit ready. */
os_err = OSSemPost(NetOS_NIC_TxRdySignalPtr);
(void)os_err; /* See Note #1. */
}
/*$PAGE*/
/*
*********************************************************************************************************
*********************************************************************************************************
* NETWORK INTERFACE LAYER FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NetOS_IF_Init()
*
* Description : (1) Perform network interface/OS initialization :
*
* (a) Implement network interface queue by creating a counting semaphore.
*
* Initialize network interface queue with no received packets by setting the semaphore
* count to 0 to block the network interface queue semaphore.
*
* (b) Create network IF Receive Task.
*
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -