MW22-02A/LWIP/arch/sys_arch.c

305 lines
8.0 KiB
C
Raw Normal View History

2025-05-21 01:55:40 +00:00
/*
* 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