3

私は 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ませんが、これまでのところ手がかりがありません。

誰でもアイデアを教えてもらえますか?または何か?

ありがとう、ジン

4

1 に答える 1

2

/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() を呼び出していることがわかります。キュー ハンドルは 2 番目の関数で必要になるため、最初の関数で上書きしないでください。

sys_sem_set_invalid() は sems[] 配列をスイープし、sem->queue との一致が見つかった場合、sems[] 内のそのコピーをゼロにする必要があります。それが完了したら、sem->queue を 0 に設定する必要があります。

これは、Dunkel の sys_arch.txt ドキュメントの内容と最もよく一致し、システムのリソース リークを修正したと思います。

メールボックスが同じ形であることに同意します。Fwiw、私は先に進み、セムについて説明したのと同様の方法でそれらを修正しました.

ところで、私が使用していた lwip ファイルは、TivaWare_C_Series 2.1.0.12573 third_party フォルダーからのものでした。

于 2015-04-17T19:25:14.467 に答える