youngz1990 发表于 2021-9-5 15:40:02

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

最近在学习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信号量是否有问题我没有试验过,不过从我看过的文档中就没说能这样做的。

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

eric2013 发表于 2021-9-5 16:17:23

OSQPost()返回值可以知道消息队列满,然后配合OS的Delay函数如何,定时查询。
中断里面调用的话,可以通过寄存器查询是否在中断里面,无需调用Delay。

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

eric2013 发表于 2021-9-5 16:34:08

https://github.com/xiaosuo/lwip-ucos-ii/blob/master/port/sys_arch.c

youngz1990 发表于 2021-9-6 10:07:54

谢谢硬汉,我看了你贴出来的代码,我的思路和他类似,使用信号量只要不是在中断中调用,实时性肯定是最好而且对CPU压力应该是最小的,至于trypost我再想一下有没其他办法
页: [1]
查看完整版本: uCOS-III移植LwIP,sys_arch.c文件的一些