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

📄 sys_arch.c

📁 此代码是在S3C44B0公板上的测试程序
💻 C
字号:
#include "lwip/sys.h"
#include "lwip/mem.h"

#include "arch/sys_arch.h"

static OS_MEM *pQueueMem;

__align(4) static u8_t pcQueueMemoryPool[MAX_QUEUES][sizeof(TQ_DESCR)];

struct sys_timeouts lwip_timeouts[LWIP_TASK_MAX];
struct sys_timeouts null_timeouts;

OS_STK LWIP_TASK_STK[LWIP_TASK_MAX][LWIP_STK_SIZE];

///////////////////////////////////////////////////////////////////////////////
//	系统初始化

void sys_init(void)
{
	INT8U err;
	int i;

	pQueueMem = OSMemCreate(pcQueueMemoryPool, MAX_QUEUES, sizeof(TQ_DESCR), &err);

	for(i = 0; i < LWIP_TASK_MAX; i++)
		lwip_timeouts[i].next = NULL;
}

///////////////////////////////////////////////////////////////////////////////
//	信号量支持

sys_sem_t sys_sem_new(u8_t count)
{
	return OSSemCreate(count);
}

void sys_sem_free(sys_sem_t sem)
{
	INT8U err;
	OSSemDel(sem, OS_DEL_NO_PEND, &err);
}

void sys_sem_signal(sys_sem_t sem)
{
	OSSemPost(sem);
}

u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
{
	INT8U err;
	INT32U ticks = OSTimeGet();
	if(timeout)
	{
		timeout = timeout * OS_TICKS_PER_SEC / 1000;
		if(!timeout)
			timeout = 1;
		else if(timeout >> 16)
			timeout = 65535;
	}
	OSSemPend(sem, timeout, &err);

	if(err == OS_TIMEOUT)
		return SYS_ARCH_TIMEOUT;
	else
		return (OSTimeGet() - ticks) * 1000 / OS_TICKS_PER_SEC;
}

///////////////////////////////////////////////////////////////////////////////
//	邮箱支持

sys_mbox_t sys_mbox_new(void)
{
	INT8U err;
	PQ_DESCR pQDesc = OSMemGet(pQueueMem, &err);

	if(err == OS_NO_ERR)
	{
		pQDesc->pQ = OSQCreate(pQDesc->pvQEntries, MAX_QUEUE_ENTRIES);
		if(pQDesc->pQ)
			return pQDesc;
		OSMemPut(pQueueMem, pQDesc);
	}
	return SYS_MBOX_NULL;
}

void sys_mbox_free(sys_mbox_t mbox)
{
	INT8U err;
	OSQFlush(mbox->pQ);
	OSQDel(mbox->pQ, OS_DEL_NO_PEND, &err);
	OSMemPut(pQueueMem, mbox);
}

void sys_mbox_post(sys_mbox_t mbox, void *msg)
{
	OSQPost(mbox->pQ, msg);
}

u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
{
	INT8U err;
	void *m;
	INT32U ticks = OSTimeGet();

	if(timeout)
	{
		timeout = timeout * OS_TICKS_PER_SEC / 1000;
		if(!timeout)
			timeout = 1;
		else if(timeout >> 16)
			timeout = 65535;
	}
	m = OSQPend(mbox->pQ, timeout, &err);
	if(msg)
		*msg = m;

	if(err == OS_TIMEOUT)
		return SYS_ARCH_TIMEOUT;
	else
		return (OSTimeGet() - ticks) * 1000 / OS_TICKS_PER_SEC;
}

///////////////////////////////////////////////////////////////////////////////
//	超时事件

struct sys_timeouts *sys_arch_timeouts(void)
{
	int index;
	OS_TCB curr_task_pcb;

	null_timeouts.next = NULL;

	OSTaskQuery(OS_PRIO_SELF, &curr_task_pcb);
	index = curr_task_pcb.OSTCBPrio - LWIP_START_PRIO;

	if(index < 0 || index >= LWIP_TASK_MAX)
		return &null_timeouts;
	else
		return lwip_timeouts + index;
}

///////////////////////////////////////////////////////////////////////////////
//	线程支持

sys_thread_t sys_thread_new(void (* thread)(void *arg), void *arg, int prio)
{
	if(prio - LWIP_START_PRIO  < LWIP_TASK_MAX){
		OSTaskCreate(thread, (void *)0, LWIP_TASK_STK[prio - LWIP_START_PRIO] + (LWIP_STK_SIZE - 1), prio);
		return prio;
	} else {
		LWIP_PLATFORM_DIAG((" lwip task prio out of range ! error! "));
		return 0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -