?? sys_arch.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];
///////////////////////////////////////////////////////////////////////////////
// 系統(tǒng)初始化
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;
}
///////////////////////////////////////////////////////////////////////////////
// 超時(shí)事件
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;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -