私は tm4c1294+lwip1.4.1+FreeRTOS を使用しています。
netconn_alloc()
で呼び出されるようsocket communication
に、未使用のセマフォを割り当てます。セマフォの数は 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[] array
。
誰かが提案したことを追加vQueueDelete(sem->queue);
しましたが、それでもすべて同じです。
関数の作成/解放だけでなくsemaphore
、関数の処理もmbox
上記の関数と同じであるため、関数の処理mbox
も間違っている可能性があります。
この問題はすでに TI に報告されていますが、まだ問題は解決していないようです。
したがって、 で処理semaphore/mbox
する独自の関数を実装する必要があるかもしれsys_arch.c
ませんが、これまでのところ手がかりがありません。
誰でもアイデアを教えてもらえますか?または何か?
ありがとう、ジン