본문 바로가기

Firmware/stm32

OV5642_LWIP_RTOS Project -1(Netconn_write 호출 시 문제)

Protject 진행 중 Netconn_write 호출 시 다른 Task가 unknown이 되어버리는 현상이 발생하였다.

 

문제가 발생 전 화면

 

netconn_write 호출 후 Task 깨지는 화면

디버깅 결과 이 문제는 netconn_write 문제라기 보다 tcp초기화를 하지 않은 상태에서 netconn api를 호출하여 발생하는 문제로 보인다.(애초에 netconn_bind에서 ERR_OK를 Return하면 안되는거 아닌가?)

 

저 상태에서 몇번 ContextSwitching 하다가 CameraTask 까지 깨진다.

 

앞서 언급한 대로 tcp 초기화 진행 후 TCP_Task를 만들어주면 또는 세마포어나 뮤텍스를 활용하여 TCP초기화 전에 netconn api를 건들 지 못하도록 하면 된다

 

여기서는 main에서 생성 했던 TCP_TASK를 DefaultTask에서 MX_LWIP_INIT을 호출 후 생성하게 하였다.

void MX_FREERTOS_Init(void) {
  
  TCPLinkSemaphoreHandle = osSemaphoreNew(1, 1, &TCPLinkSemaphore_attributes);

  /* creation of CmraSemaphore */
  CmraSemaphoreHandle = osSemaphoreNew(1, 1, &CmraSemaphore_attributes);

  TCPQUEUEHandle = osMessageQueueNew (16, sizeof(uint16_t), &TCPQUEUE_attributes);

  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

  /* creation of TcpTask */
  //TcpTaskHandle = osThreadNew(Tcp_Task, NULL, &TcpTask_attributes); 초기화에서 TCP_TASK 생성 x
  
  /* creation of CameraTask */
  CameraTaskHandle = osThreadNew(Camera_Task, NULL, &CameraTask_attributes);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  
  TCP_arg.netconn = tcpconn;
  TCP_arg.semaphore = TCPLinkSemaphoreHandle; 
  
  CMRA_arg.netconn = tcpconn;
  CMRA_arg.semaphore = CmraSemaphoreHandle;
  /* USER CODE END RTOS_THREADS */

}

초기화에서 제거한 osThreadNew 함수를 StartDefaultTask에 추가한 코드

void StartDefaultTask(void *argument)
{
  /* init code for LWIP */
  MX_LWIP_Init();
  /* USER CODE BEGIN StartDefaultTask */
  TcpTaskHandle = osThreadNew(Tcp_Task, NULL, &TcpTask_attributes);
  /* Infinite loop */
  for(;;)
  {
    osThreadTerminate(defaultTaskHandle);
  }
  /* USER CODE END StartDefaultTask */
}

 

위와 같이 StartDefaultTask에서 Tcp_Task를 생성 후 netconn_write를 호출 후 Task 상태 화면

 

Link_Thr은 ethernetif_set_link 함수로 케이블이 연결 되었을 시 netif_set_link_up(link_arg->netif);를 호출하고

 

만약 분리 하였을 시 netif_set_link_down(link_arg->netif); 을 호출하여 지속적으로 update 한다.

 

defaultTask와 CameraTask는 정상 동작 확인함 

 

일단 각 Task 실행에는 문제 없어서 계속 진행