305 lines
8.0 KiB
C
305 lines
8.0 KiB
C
|
/*
|
|||
|
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|||
|
* All rights reserved.
|
|||
|
*
|
|||
|
* Redistribution and use in source and binary forms, with or without modification,
|
|||
|
* are permitted provided that the following conditions are met:
|
|||
|
*
|
|||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|||
|
* this list of conditions and the following disclaimer.
|
|||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|||
|
* this list of conditions and the following disclaimer in the documentation
|
|||
|
* and/or other materials provided with the distribution.
|
|||
|
* 3. The name of the author may not be used to endorse or promote products
|
|||
|
* derived from this software without specific prior written permission.
|
|||
|
*
|
|||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|||
|
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|||
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|||
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|||
|
* OF SUCH DAMAGE.
|
|||
|
*
|
|||
|
* This file is part of the lwIP TCP/IP stack.
|
|||
|
*
|
|||
|
* Author: Adam Dunkels <adam@sics.se>
|
|||
|
*
|
|||
|
*/
|
|||
|
/* lwIP includes. */
|
|||
|
#include "lwip/debug.h"
|
|||
|
#include "lwip/def.h"
|
|||
|
#include "lwip/sys.h"
|
|||
|
#include "lwip/mem.h"
|
|||
|
#include "pdebug.h"
|
|||
|
#include <stdint.h>
|
|||
|
#include "comm_types.h"
|
|||
|
|
|||
|
#ifdef USE_RTOS
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>Ϣָ<CFA2><D6B8>Ϊ<EFBFBD><CEAA>ʱ,ָ<><D6B8>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pvNullPointer<65><72>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ֵ.
|
|||
|
//<2F><>UCOS<4F><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OSQPost()<29>е<EFBFBD>msg==NULL<4C>᷵<EFBFBD><E1B7B5>һ<EFBFBD><D2BB>OS_ERR_POST_NULL
|
|||
|
//<2F><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>lwip<69>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>sys_mbox_post(mbox,NULL)<29><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ,<2C><><EFBFBD><EFBFBD>
|
|||
|
//<2F>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>NULL<4C><4C><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>0Xffffffff
|
|||
|
const void * const pvNullPointer = (mem_ptr_t*)0xffffffff;
|
|||
|
|
|||
|
|
|||
|
err_t sys_mbox_new( sys_mbox_t *mbox, int size)
|
|||
|
{
|
|||
|
(*mbox) = mem_malloc(sizeof(TQ_DESCR));
|
|||
|
memset((*mbox),0,sizeof(TQ_DESCR));
|
|||
|
|
|||
|
if(*mbox)
|
|||
|
{
|
|||
|
if(size > MAX_QUEUE_ENTRIES)
|
|||
|
{
|
|||
|
size=MAX_QUEUE_ENTRIES;
|
|||
|
}
|
|||
|
(*mbox)->pQ = OSQCreate(&((*mbox)->pvQEntries[0]), size); //ʹ<><CAB9>UCOS<4F><53><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
LWIP_ASSERT("OSQCreate",(*mbox)->pQ!=NULL);
|
|||
|
if((*mbox)->pQ != NULL)
|
|||
|
{
|
|||
|
return ERR_OK;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
mem_free((*mbox));
|
|||
|
return ERR_MEM;
|
|||
|
}
|
|||
|
}
|
|||
|
else return ERR_MEM;
|
|||
|
}
|
|||
|
|
|||
|
void sys_mbox_free(sys_mbox_t * mbox)
|
|||
|
{
|
|||
|
u8_t ucErr;
|
|||
|
(void)OSQDel((*mbox)->pQ, OS_DEL_ALWAYS, &ucErr);
|
|||
|
LWIP_ASSERT( "OSQDel ",ucErr == OS_ERR_NONE );
|
|||
|
mem_free((*mbox));
|
|||
|
*mbox=NULL;
|
|||
|
}
|
|||
|
|
|||
|
void sys_mbox_post(sys_mbox_t *mbox,void *msg)
|
|||
|
{
|
|||
|
if(msg == NULL)
|
|||
|
{
|
|||
|
msg=(void*)&pvNullPointer;//<2F><>msgΪ<67><CEAA>ʱ msg<73><67><EFBFBD><EFBFBD>pvNullPointerָ<72><D6B8><EFBFBD><EFBFBD>ֵ
|
|||
|
}
|
|||
|
while(OSQPost((*mbox)->pQ,msg) != OS_ERR_NONE);
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䷢<EFBFBD><E4B7A2><EFBFBD><EFBFBD>Ϣ
|
|||
|
//<2F>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sys_mbox_post<73><74><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
|
|||
|
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>᳢ܺ<F3B2BBBB>Եڶ<D4B5><DAB6>η<EFBFBD><CEB7><EFBFBD>
|
|||
|
//*mbox:<3A><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
//*msg:Ҫ<><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ϣ
|
|||
|
//<2F><><EFBFBD><EFBFBD>ֵ:ERR_OK,<2C><><EFBFBD><EFBFBD>OK
|
|||
|
// ERR_MEM,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
|
|||
|
{
|
|||
|
if(msg == NULL)
|
|||
|
{
|
|||
|
msg=(void*)&pvNullPointer;//<2F><>msgΪ<67><CEAA>ʱ msg<73><67><EFBFBD><EFBFBD>pvNullPointerָ<72><D6B8><EFBFBD><EFBFBD>ֵ
|
|||
|
}
|
|||
|
if((OSQPost((*mbox)->pQ, msg)) != OS_ERR_NONE)
|
|||
|
{
|
|||
|
return ERR_MEM;
|
|||
|
}
|
|||
|
return ERR_OK;
|
|||
|
}
|
|||
|
|
|||
|
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>Ϣ
|
|||
|
//*mbox:<3A><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
//*msg:<3A><>Ϣ
|
|||
|
//timeout:<3A><>ʱʱ<CAB1>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>timeoutΪ0<CEAA>Ļ<EFBFBD>,<2C><>һֱ<D2BB>ȴ<EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><>timeout<75><74>Ϊ0ʱ<30><CAB1><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9>Ļ<EFBFBD><C4BB>ͷ<EFBFBD><CDB7>صȴ<D8B5><C8B4><EFBFBD>ʱ<EFBFBD>䣬
|
|||
|
// ʧ<>ܵĻ<DCB5><C4BB>ͷ<EFBFBD><CDB7>س<EFBFBD>ʱSYS_ARCH_TIMEOUT
|
|||
|
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
|
|||
|
{
|
|||
|
u8_t ucErr;
|
|||
|
u32_t ucos_timeout,timeout_new;
|
|||
|
void *temp;
|
|||
|
sys_mbox_t m_box=*mbox;
|
|||
|
if(timeout!=0)
|
|||
|
{
|
|||
|
ucos_timeout=(timeout*OS_TICKS_PER_SEC)/1000; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ΪUCOS<4F><53>ʱʹ<CAB1>õ<EFBFBD><C3B5>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD>,<2C><>LWIP<49><50><EFBFBD><EFBFBD>ms
|
|||
|
if(ucos_timeout<1)ucos_timeout=1;//<2F><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}else ucos_timeout = 0;
|
|||
|
timeout = OSTimeGet(); //<2F><>ȡϵͳʱ<CDB3><CAB1>
|
|||
|
temp=OSQPend(m_box->pQ,(u16_t)ucos_timeout,&ucErr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>,<2C>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>Ϊucos_timeout
|
|||
|
if(msg!=NULL)
|
|||
|
{
|
|||
|
if(temp==(void*)&pvNullPointer)*msg = NULL; //<2F><>Ϊlwip<69><70><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD>Ϣ<EFBFBD><CFA2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>pvNullPointerָ<72><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>pvNullPointerָ<72><D6B8><EFBFBD><EFBFBD>ֵ
|
|||
|
else *msg=temp; //<2F>Ϳ<EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F3B5BDB5><EFBFBD>Ϣ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|||
|
}
|
|||
|
if(ucErr==OS_ERR_TIMEOUT)timeout=SYS_ARCH_TIMEOUT; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|||
|
else
|
|||
|
{
|
|||
|
LWIP_ASSERT("OSQPend ",ucErr==OS_ERR_NONE);
|
|||
|
timeout_new=OSTimeGet();
|
|||
|
if (timeout_new>timeout) timeout_new = timeout_new - timeout;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʹ<EFBFBD>õ<EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
else timeout_new = 0xffffffff - timeout + timeout_new;
|
|||
|
timeout=timeout_new*1000/OS_TICKS_PER_SEC + 1;
|
|||
|
}
|
|||
|
return timeout;
|
|||
|
}
|
|||
|
|
|||
|
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
|
|||
|
{
|
|||
|
return sys_arch_mbox_fetch(mbox, msg, 1);
|
|||
|
}
|
|||
|
|
|||
|
int sys_mbox_valid(sys_mbox_t *mbox)
|
|||
|
{
|
|||
|
u8_t ucErr;
|
|||
|
int ret;
|
|||
|
OS_Q_DATA q_data;
|
|||
|
memset(&q_data, 0, sizeof(OS_Q_DATA));
|
|||
|
ucErr = OSQQuery ((*mbox)->pQ,&q_data);
|
|||
|
ret=(ucErr<2 && (q_data.OSNMsgs<q_data.OSQSize))?1:0;
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
void sys_mbox_set_invalid(sys_mbox_t *mbox)
|
|||
|
{
|
|||
|
*mbox = NULL;
|
|||
|
}
|
|||
|
|
|||
|
err_t sys_sem_new(sys_sem_t * sem, u8_t count)
|
|||
|
{
|
|||
|
*sem = OSSemCreate((u16_t)count);
|
|||
|
if(*sem == NULL)
|
|||
|
{
|
|||
|
return ERR_MEM;
|
|||
|
}
|
|||
|
return ERR_OK;
|
|||
|
}
|
|||
|
//<2F>ȴ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
|
|||
|
//*sem:Ҫ<>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
|
|||
|
//timeout:<3A><>ʱʱ<CAB1><CAB1>
|
|||
|
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><>timeout<75><74>Ϊ0ʱ<30><CAB1><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9>Ļ<EFBFBD><C4BB>ͷ<EFBFBD><CDB7>صȴ<D8B5><C8B4><EFBFBD>ʱ<EFBFBD>䣬
|
|||
|
// ʧ<>ܵĻ<DCB5><C4BB>ͷ<EFBFBD><CDB7>س<EFBFBD>ʱSYS_ARCH_TIMEOUT
|
|||
|
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
|
|||
|
{
|
|||
|
u8_t ucErr;
|
|||
|
u32_t ucos_timeout, timeout_new;
|
|||
|
if( timeout!=0)
|
|||
|
{
|
|||
|
ucos_timeout = (timeout * OS_TICKS_PER_SEC) / 1000;//ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ΪUCOS<4F><53>ʱʹ<CAB1>õ<EFBFBD><C3B5>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD>,<2C><>LWIP<49><50><EFBFBD><EFBFBD>ms
|
|||
|
if(ucos_timeout < 1)
|
|||
|
ucos_timeout = 1;
|
|||
|
}else ucos_timeout = 0;
|
|||
|
timeout = OSTimeGet();
|
|||
|
OSSemPend (*sem,(u16_t)ucos_timeout, (u8_t *)&ucErr);
|
|||
|
if(ucErr == OS_ERR_TIMEOUT)timeout=SYS_ARCH_TIMEOUT;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|||
|
else
|
|||
|
{
|
|||
|
timeout_new = OSTimeGet();
|
|||
|
if (timeout_new>=timeout) timeout_new = timeout_new - timeout;
|
|||
|
else timeout_new = 0xffffffff - timeout + timeout_new;
|
|||
|
timeout = (timeout_new*1000/OS_TICKS_PER_SEC + 1);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʹ<EFBFBD>õ<EFBFBD>ʱ<EFBFBD><CAB1>(ms)
|
|||
|
}
|
|||
|
return timeout;
|
|||
|
}
|
|||
|
|
|||
|
void sys_sem_signal(sys_sem_t *sem)
|
|||
|
{
|
|||
|
OSSemPost(*sem);
|
|||
|
}
|
|||
|
|
|||
|
void sys_sem_free(sys_sem_t *sem)
|
|||
|
{
|
|||
|
u8_t ucErr;
|
|||
|
(void)OSSemDel(*sem,OS_DEL_ALWAYS,&ucErr);
|
|||
|
if(ucErr != OS_ERR_NONE)
|
|||
|
{
|
|||
|
LWIP_ASSERT("OSSemDel ",ucErr==OS_ERR_NONE);
|
|||
|
}
|
|||
|
*sem = NULL;
|
|||
|
}
|
|||
|
|
|||
|
int sys_sem_valid(sys_sem_t *sem)
|
|||
|
{
|
|||
|
OS_SEM_DATA sem_data;
|
|||
|
return (OSSemQuery (*sem,&sem_data) == OS_ERR_NONE )? 1:0;
|
|||
|
}
|
|||
|
|
|||
|
void sys_sem_set_invalid(sys_sem_t *sem)
|
|||
|
{
|
|||
|
*sem = NULL;
|
|||
|
}
|
|||
|
|
|||
|
void sys_init(void)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
OS_STK TCPIP_THREAD_TASK_STK[TASK_TCPIP_THREAD_STK_SIZE];
|
|||
|
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
|
|||
|
{
|
|||
|
CPU_INT08U task_err;
|
|||
|
CPU_INT08U name_err;
|
|||
|
|
|||
|
//OSTaskCreate(thread,arg, &TCPIP_THREAD_TASK_STK[stacksize-1], prio);
|
|||
|
task_err = OSTaskCreateExt((void (*)(void *)) thread,
|
|||
|
(void *) 0,
|
|||
|
(OS_STK *)&TCPIP_THREAD_TASK_STK[stacksize - 1],
|
|||
|
(INT8U ) prio,
|
|||
|
(INT16U ) prio,
|
|||
|
(OS_STK *)&TCPIP_THREAD_TASK_STK[0],
|
|||
|
(INT32U ) stacksize,
|
|||
|
(void *) 0,
|
|||
|
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
|
|||
|
|
|||
|
#if (OS_TASK_NAME_EN > 0)
|
|||
|
OSTaskNameSet(prio, (u_int8_t *)name, &name_err);
|
|||
|
#endif
|
|||
|
|
|||
|
// if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
|
|||
|
// pdebug(DEBUG_LEVEL_INFO,"create %s success...\n\r",(u_int8_t *)name);
|
|||
|
// } else {
|
|||
|
// pdebug(DEBUG_LEVEL_FATAL,"create %s failed...\n\r",(u_int8_t *)name);
|
|||
|
// }
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
u32_t sys_now(void)
|
|||
|
{
|
|||
|
return (OSTimeGet()*1000/OS_TICKS_PER_SEC+1);
|
|||
|
}
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
static uint32_t lwip_timer;//lwip<69><70><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>λ:ms
|
|||
|
|
|||
|
void PIT_ISR(void)
|
|||
|
{
|
|||
|
lwip_timer++;
|
|||
|
}
|
|||
|
|
|||
|
u32_t sys_now(void)
|
|||
|
{
|
|||
|
return lwip_timer*10;
|
|||
|
}
|
|||
|
|
|||
|
u8_t timer_expired(u32_t *last_time,u32_t tmr_interval)
|
|||
|
{
|
|||
|
u32_t time;
|
|||
|
time = *last_time;
|
|||
|
if((lwip_timer-time)>=tmr_interval){
|
|||
|
*last_time = lwip_timer;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|