📄 sys_arch.c
字号:
/*
* sys_arch.c
* reference to sys_arch.txt.
*/
#include <string.h>
#include "lwip/debug.h"
#include "lwip/sys.h"
#include "lwip/opt.h"
#include "lwip/stats.h"
#include "arch/sys_arch.h"
/* dooloo relate header files */
#include <rtthread.h>
struct timeoutlist {
struct sys_timeouts timeouts;
struct rt_thread *pid;
};
static struct timeoutlist timeoutlist[SYS_LWIP_THREAD_MAX];
void sys_init(void)
{
int i;
for(i=0; i<SYS_LWIP_THREAD_MAX; i++)
timeoutlist[i].pid = RT_NULL;
}
sys_sem_t sys_sem_new(u8_t count)
{
return rt_sem_create("lwip_sem", count, RT_IPC_FLAG_FIFO);
}
void sys_sem_free(sys_sem_t sem)
{
rt_sem_delete(sem);
}
void sys_sem_signal(sys_sem_t sem)
{
rt_sem_release(sem);
}
u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
{
u32_t ret;
int t;
// time_t end_time = 0, start_time = 0;
if(timeout == 0)
t = RT_WAITING_FOREVER;
else
t = timeout;
if(rt_sem_take(sem, t) == RT_ETIMEOUT)
ret = SYS_ARCH_TIMEOUT;
else
ret = 1;
return ret;
}
sys_mbox_t sys_mbox_new(void)
{
static int counter = 0;
char tname[8];
rt_snprintf(tname, 8, "%s%d", SYS_LWIP_MBOX_NAME, counter);
counter++;
return rt_mb_create(tname, SYS_MBOX_SIZE, RT_IPC_FLAG_FIFO);
}
void sys_mbox_free(sys_mbox_t mbox)
{
rt_mb_delete(mbox);
}
void sys_mbox_post(sys_mbox_t mbox, void *msg)
{
rt_uint32 mail;
if(msg) mail = (rt_uint32)msg;
rt_mb_send(mbox, mail);
}
u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
{
u32_t ret;
int t;
rt_uint32 mail;
if(timeout == 0)
t = RT_WAITING_FOREVER;
else
t = timeout;
if(rt_mb_recv(mbox, (rt_uint32 *)&mail, t) == RT_ETIMEOUT)
{
ret = SYS_ARCH_TIMEOUT;
}
else
{
ret = 1;
if(msg)
*(rt_uint32 *)msg = mail;
}
return ret;
}
struct sys_timeouts *sys_arch_timeouts(void)
{
rt_thread_t pid;
int i;
pid = rt_thread_self();
for(i=0; i<SYS_LWIP_THREAD_MAX; i++)
{
if(timeoutlist[i].pid != RT_NULL && timeoutlist[i].pid == pid)
return &(timeoutlist[i].timeouts);
}
#if 0
return NULL;
#else
/*
* There is only one LWIP thread, so we can return the first timeoutlist structure safely.
* This modification avoids to create a LWIP thread for ARP timer if it works:)
*/
return &(timeoutlist[0].timeouts);
#endif
}
sys_thread_t sys_thread_new(void (* thread)(void *arg), void *arg, int prio)
{
rt_thread_t t;
static int counter = 0;
char tname[8];
if(counter >= SYS_LWIP_THREAD_MAX)
{
LWIP_PLATFORM_DIAG(("lwip thread number exceed!\n"));
return RT_NULL;
}
rt_snprintf(tname, 8, "%s%d", SYS_LWIP_THREAD_NAME, counter);
t = rt_thread_create(tname, thread, arg,
SYS_LWIP_THREAD_STACK_SIZE, prio, 100);
rt_thread_startup(t);
timeoutlist[counter].pid = t;
counter++;
return t;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -