⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_arch.c

📁 RT-Thread是发展中的下一代微内核嵌入式实时操作系统
💻 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 + -