|
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的任务,如果优先级一样,响应就随机了。
我是先发现这样的问题,再分析反推回去的,不知道对不对,和大家讨论下 |
|