硬汉嵌入式论坛

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

[RL-TCPnet] RL-TCPnet移植FreeRTOS的疑问

[复制链接]

9

主题

18

回帖

9

积分

新手上路

积分
9
QQ
发表于 2017-9-1 17:02:55 | 显示全部楼层 |阅读模式
FreeRTOS移植RL-TCPnet需要更改Net_lib.c文件。关于这个有个疑问。
RTX中使用RL-TCPnet的Net_lib.c中的两个函数是这样的:

#if (BSD_ENABLE && __RTX)
__used void bsd_suspend (U8 *tsk_id) {
  /* Suspend a socket owner task. */
  *tsk_id = (U8)os_tsk_self ();
  os_mut_release (bsd_mutex);
  os_evt_wait_or (0x8000, 0xFFFF);
  os_mut_wait (bsd_mutex, 0xFFFF);
}

__used void bsd_resume (U8 tsk_id) {
  /* Resume a task waiting for a socket event. */
  if (tsk_id) {
    os_evt_set (0x8000, tsk_id);
  }
}
#endif

而在FreeRTOS中使用是这样的:

#if (BSD_ENABLE && __RTX)
__used void bsd_suspend (U8 *tsk_id) {
  /* Suspend a socket owner task. */
  xSemaphoreGive(bsd_mutex);
  xSemaphoreTake(bsd_sem, portMAX_DELAY);
  xSemaphoreTake(bsd_mutex, portMAX_DELAY);   
}

__used void bsd_resume (U8 tsk_id) {
  /* Resume a task waiting for a socket event. */
  xSemaphoreGive(bsd_sem);
}
#endif
疑问在于信号量bsd_sem。
假如要使用BSD,建立两个server,在两个任务中进行,没有连接时,这两个任务会同时在accept函数中等待,而accept中是调用bsd_suspend ()的(这个在keil调试时能看到),也就是说,两个任务同时阻塞在同一个信号量bsd_sem,当连接来临时,必定会给信号量的。这样问题来了,能获得信号量的任务就不一定是响应这个连接的任务,那样就出错了。经过测试,有这样的问题,能继续运行的任务,不一定是响应这个连接的。例如一个是端口5900(这个优先级高点),一个是端口10001,连接10001时,继续运行的是5900的任务,如果优先级一样,响应就随机了。
我是先发现这样的问题,再分析反推回去的,不知道对不对,和大家讨论下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2017-9-1 17:29:35 | 显示全部楼层
这样的话,就使用FreeRTOS的任务信号量,每个任务都有自己的信号量,其实就是个全局变量,这样就区分开了,你测试下,是否还有问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 18:15 , Processed in 0.164376 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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