微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM硬件平台上基于UCOS移植Lwip网络协议栈

ARM硬件平台上基于UCOS移植Lwip网络协议栈

时间:11-20 来源:互联网 点击:

初始化lwip操作系统模拟层。

- sys_sem_t sys_sem_new(u8_t count)

创建一个信号量,count表示初始化后的信号量状态。

- void sys_sem_free(sys_sem_t sem)

删除指定的信号量。

- void sys_sem_signal(sys_sem_t sem)

发送一个信号量。

- u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
等待指定的信号并阻塞线程。timeout 参数为 0,线程会一直被阻塞至收到指定的信号;非 0,则线程仅被阻塞至指定的 timeout时间(单位为毫秒)。在timeout 参数值非 0 的情况下,返回值为等待指定的信号所消耗的毫秒数。如果在指定的时间内并没有收到信号,返回值为SYS_ARCH_TIMEOUT。如果线程不必再等待这个信号(也就是说,已经收到信号) ,返回值也可以为 0。注意,LwIP实现了一个名称与之相似的函数来调用这个函数,sys_sem_wait(),注意区别。
- sys_mbox_t sys_mbox_new(void)
创建一个空消息邮箱。

- void sys_mbox_free(sys_mbox_t mbox)
释放一个邮箱。

- void sys_mbox_post(sys_mbox_t mbox, void *msg)
投递消息“msg”到指定的邮箱“mbox” 。

- u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
阻塞线程直至邮箱收到至少一条消息。最长阻塞时间由 timeout 参数指定(与
sys_arch_sem_wait()函数类似) 。msg 是一个结果参数,用来保存邮箱中的消息指针 (即*msg = ptr) ,它的值由这个函数设置。 “msg”参数有可能为空,这表明当前这条消息应该被丢弃。 返回值与 sys_arch_sem_wait()函数相同:等待的毫秒数或者 SYS_ARCH_TIMEOUT――如果时间溢出的话。LwIP实现的函数中,有一个名称与之相似的――sys_mbox_fetch(),注意区分。

- struct sys_timeouts *sys_arch_timeouts(void)
返回一个指向当前线程使用的 sys_timeouts 结构的指针。LwIP 中,每一个线程都有一个timeouts 链表,这个链表由 sys_timeout 结构组成,sys_timeouts 结构则保存了指向这个链表的指针。这个函数由 LwIP 的超时调度程序调用,并且不能返回一个空(NULL)值。 单线程 sys_arch 实现中,这个函数只需简单返回一个指针即可。这个指针指向保存在 sys_arch 模块中的 sys_timeouts 全局变量

- sys_thread_t sys_thread_new(void (* thread)(void *arg), void *arg, int prio)

创建一个新的线程。

实现sys_sem_t sys_sem_new(u8_t count)函数:
sys_sem_t sys_sem_new(u8_t count)
{
return OSSemCreate((u16_t)count);
}
这个函数实现比较简单,UCOS提供了信号量的操作函数,直接调用即可。
实现void sys_sem_free(sys_sem_t sem)函数:
void sys_sem_free(sys_sem_t sem)
{
u8_t Err;
OSSemDel(sem, OS_DEL_ALWAYS, &Err);
}
实现void sys_sem_signal(sys_sem_t sem)函数:
void sys_sem_signal(sys_sem_t sem)
{
OSSemPost(sem);
}
实现u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)函数:
u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
{
u8_t Err;
u32_t wait_ticks;

if (OSSemAccept(sem))/* 如果已经收到, 则返回0 */
{
return 0;
}

wait_ticks = 0;
if(timeout!=0){
wait_ticks = (timeout * OS_TICKS_PER_SEC)/1000;
if(wait_ticks < 1)
wait_ticks = 1;
else if(wait_ticks > 65535)
wait_ticks = 65535;
}

OSSemPend(sem, (u16_t)wait_ticks, &Err);

if (Err == OS_NO_ERR)
return timeout/2; //将等待时间设置为timeout/2
else
return SYS_ARCH_TIMEOUT;
}
阻塞进程,等待一个信号量的到来。如果timeout不为0,则进程阻塞的时间最多为相关的毫秒数,否则进程一直阻塞,直到收到信号量。
返回值:如果timeout不为0,则返回值为等待该信号量的毫秒数,如果函数在规定的时间内没有等到信号量,则返回值为SYS_ARCH_TIMEOUT,如果信号量在调用函数时已经可用,则函数不会发生任何阻塞操作,返回值这时可以是0。
实现sys_mbox_t sys_mbox_new(int size)函数功能:
sys_mbox_t sys_mbox_new(int size)
{
u8_t Err;
sys_mbox_t pQDesc;

pQDesc = OSMemGet( MboxMem, &Err );
if( Err == OS_NO_ERR ) {
pQDesc->ucos_queue = OSQCreate( &(pQDesc->mbox_msg_entris[0]), MAX_MSG_IN_MBOX );
if( pQDesc->ucos_queue != NULL ) {
return pQDesc;
}
else{
OSMemPut(MboxMem,pQDesc);
}
}
return SYS_MBOX_NULL;
}
邮箱用于消息传递,用户即可以将其实现为一个队列,允许多条消息投递到这个邮箱,也可以每次只允许投递一个消息,这两种方式 LwIP都可以正常运作。不过,前者更加有效。这里我们使用消息队列的方式,允许投递多条消息。
实现void sys_mbox_free(sys_mbox_t mbox)函数:
void sys_mbox_free(sys_mbox_t mbox)
{
u8_t Err;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top