硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1718|回复: 3
收起左侧

[LwIP] uCOS-III移植LwIP,sys_arch.c文件的一些

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2021-9-5 15:40:02 | 显示全部楼层 |阅读模式
最近在学习uCOS-III和网络相关的知识,尝试在uCOS上移植LwIP来练手,本身对操作系统有一定了解但是不深刻,对LwIP更是没多少了解。在改写sys_arch.c中涉及到消息队列的函数时遇到了困难。
1. sys_mbox_post()函数是一个阻塞调用,如果队列满则一直阻塞直到有消息被取出,新消息被填入队列为止。

2. uCOS的OSQPost()就我所知没有阻塞的功能,为了实现sys_mbox_post()我想到的办法是使用一个计数信号量,当往队列里塞消息的时候OSSemPend(),取消息的时候就OSSemPost(),这样在队列满了之后,就能保证塞消息的任务被阻塞,从而实现sys_mbox_post()的功能。这样做的代价是在操作队列的时候,还必须要操作信号量,不然功能上就会出错。

3. 但是这个方法在sys_mbox_trypost()这个函数上似乎有逻辑上的问题,首先LwIP的文档中说明了sys_mbox_trypost()是可以用于中断的,我使用的方法在post队列时要pend信号量,post队列在中断中是可以的,但是在中断中pend信号量是否有问题我没有试验过,不过从我看过的文档中就没说能这样做的。

所以我想请教下论坛上的各位大佬,对目前我遇到的这个问题各位有没什么好的建议能给我,听君一席话我很可能就茅塞顿开了,先谢谢各位啦。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2021-9-5 16:17:23 | 显示全部楼层
OSQPost()返回值可以知道消息队列满,然后配合OS的Delay函数如何,定时查询。
中断里面调用的话,可以通过寄存器查询是否在中断里面,无需调用Delay。

查询方式缺点是实时性差点。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2021-9-5 16:34:08 | 显示全部楼层
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2021-9-6 10:07:54 | 显示全部楼层
谢谢硬汉,我看了你贴出来的代码,我的思路和他类似,使用信号量只要不是在中断中调用,实时性肯定是最好而且对CPU压力应该是最小的,至于trypost我再想一下有没其他办法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 03:23 , Processed in 0.158328 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表