gpt4 book ai didi

c - 无法分配信号量/netconn Tiva C TM4C1294

转载 作者:行者123 更新时间:2023-12-02 01:40:48 27 4
gpt4 key购买 nike

我使用的是tm4c1294+lwip1.4.1+FreeRTOS。

netconn_alloc() 被调用用于套接字通信 时,它会分配一个未使用的信号量。信号量的个数定义为SYS_SEM_MAX,所以不能超过SYS_SEM_MAX。然而,由于信号量被连续分配,它达到 SYS_SEM_MAX 并停止工作,因为我猜 sys_sem_free() 没有正确释放它

这是在 sys_arch.c 中实现的创建信号量的函数

err_t
sys_sem_new(sys_sem_t *sem, u8_t count)
{

void *temp;
u32_t i;

/* Find a semaphore that is not in use. */
for(i = 0; i < SYS_SEM_MAX; i++) {
if(sems[i].queue == 0) {
break;
}
}

if(i == SYS_SEM_MAX) {
#if SYS_STATS
STATS_INC(sys.sem.err);
#endif /* SYS_STATS */
return ERR_MEM;
}

/* Create a single-entry queue to act as a semaphore. */
#if RTOS_FREERTOS
sem->queue = xQueueCreate(1, sizeof(void *));
if(sem->queue == NULL) {
#endif /* RTOS_FREERTOS */

#if SYS_STATS
STATS_INC(sys.sem.err);
#endif /* SYS_STATS */
return ERR_MEM;
}



/* Acquired the semaphore if necessary. */
if(count == 0) {
temp = 0;
xQueueSend(sem->queue, &temp, 0);
}

/* Update the semaphore statistics. */
#if SYS_STATS
STATS_INC(sys.sem.used);
#if LWIP_STATS
if(lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) {
lwip_stats.sys.sem.max = lwip_stats.sys.sem.used;
}
#endif
#endif /* SYS_STATS */

/* Save the queue handle. */
sems[i].queue = sem->queue;

/* Return this semaphore. */
return (ERR_OK);
}

这是在 sys_arch.c 中实现的另一个释放信号量的函数

void
sys_sem_free(sys_sem_t *sem)
{

/* Delete Sem , By Jin */
vQueueDelete(sem->queue);
/* Clear the queue handle. */
sem->queue = 0;

/* Update the semaphore statistics. */
#if SYS_STATS
STATS_DEC(sys.sem.used);
#endif /* SYS_STATS */

}

每当调用 netconn_free() 时,sys_sem_free() 都会释放信号量,但不会释放 sem[] 数组中分配的信号量 .

我添加了有人建议的 vQueueDelete(sem->queue);,但还是一样。

不仅函数创建/释放 semaphore 而且处理 mbox 的函数与上面的函数相同,因此处理 mbox 的函数可能是错误的好吧。

已经有人向TI反馈了这个问题,但是好像还没有解决问题。

因此,我可能需要在 sys_arch.c 中实现我自己的处理 semaphore/mbox 的函数,但目前我没有任何线索。

谁能给我点意见?还是什么?

谢谢,进

最佳答案

/doc 中的 sys_arch.txt 文件有些帮助。显然,查看该文档以及 lwip 1.3.2 曾经做过的事情,看起来 ports/tiva-tm4c129/sys_arch.c 不正确且不完整。

sys_sem_free() 确实应该像您发现的那样执行 vQueueDelete()。它应该做“sem->queue = 0”。如果您查看 src/api/api_msg.c 中的 netconn_free(),您可以看到它调用 sys_sem_free(),然后调用 sys_sem_set_invalid()。队列句柄将在第二个函数中需要,不应在第一个函数中被破坏。

sys_sem_set_invalid() 应该扫描 sems[] 数组,如果它找到与 sem-> 队列的匹配项,它应该将 sems[] 中的副本清零。完成后,它应该将 sem->queue 设置为 0。

我认为这与 Dunkel 的 sys_arch.txt 文档中的内容最匹配,并修复了我系统上的资源泄漏。

我同意邮箱的形状相同。 Fwiw,我继续以与刚才为 sems 描述的相似的方式修改了它们。

顺便说一句,我使用的 lwip 文件来自 TivaWare_C_Series 2.1.0.12573 third_party 文件夹。

关于c - 无法分配信号量/netconn Tiva C TM4C1294,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28637558/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com