본문 바로가기

Firmware/stm32

OV5642_LWIP_RTOS Project -3(최종 구현 및 디버깅)

문제점

 

1. 메모리 Hardfault_Handler

Netconn으로 데이터 전송 중 불특정하게 뻗는 현상이 이 있는데 이 문제는 십중팔구 메모리 fault 문제이다.

 

위 문제를 해결하기 위해 Netconn Heap size를 5640 -> 11680Bytes로 증가하여 문제를 해결하였다.

 

 

 

2. Task Scheldule 중 Hardfault_Handler

 

돌리는 중에 Context Switching 중 Hardfault 가 발생 하였다.

 

디버깅 해본 결과 TCP_Task가 Blocked 이 되면서 Default_Task가 계속 실행되지만 다른 코드 실행 없이

바로 osDelay를 호출해보면 얼마 못가 Hardfault가 발생한다.

 

이 문제를 해결하기 위해 조치로 다음과 같이 코드를 수정하였다.

 

void StartDefaultTask(void *argument)
{
  /* init code for LWIP */
  MX_LWIP_Init();
  /* USER CODE BEGIN StartDefaultTask */
  set_format(JPEG);
  initCAM();
  set_bit(0x03,0x02);
  clear_fifo_flag();
  write_reg(0x01,0x00);
  OV5642_set_JPEG_size(OV5642_1600x1200);

  TcpTaskHandle = osThreadNew(Tcp_Task, NULL, &TcpTask_attributes);
 // CameraTaskHandle = osThreadNew(Camera_Task, NULL, &CameraTask_attributes);
  /* Infinite loop */
  for(;;)
  {
   HAL_Delay(100);  // -> HAL_Delay(100)호출로 Task가 호출되자마자 Context Switching 현상 방지.
   osDelay(100);


  }
  /* USER CODE END StartDefaultTask */
}

 

 

3. Netconn_write 호출 시 Hardfault_Handler

void second_picture_data(struct netconn *cmraconn)
{
  while (picture_flag)
  {
    
    temp_last = temp;
    
    HAL_SPI_TransmitReceive(&hspi3, (uint8_t*) &spi_dummy, &temp, 1, 1000);
    
    cmra_buf[cmra_flag++] = temp;
    Real_length++;
    
    if ((temp == 0xD9) && (temp_last == 0xFF))
    {
      picture_flag = false;
      cmra_buf[cmra_flag++] = 0xFF;
      cmra_buf[cmra_flag++] = 0xFF;
      cmra_buf[cmra_flag++] = 0xFF;
      cmra_buf[cmra_flag++] = 0xFF;
      cmra_buf[cmra_flag++] = Real_length >> 24;
      cmra_buf[cmra_flag++] = Real_length >> 16;
      cmra_buf[cmra_flag++] = Real_length >> 8;
      cmra_buf[cmra_flag++] = Real_length;
      
      clear_fifo_flag();
      netconn_write(cmraconn,cmra_buf,cmra_flag,NETCONN_COPY);
      cmra_flag = 0;
      
      
    }
    
    
    if (cmra_flag == SEND_SIZE)
    {
      netconn_write(cmraconn,cmra_buf,cmra_flag,NETCONN_COPY);
      cmra_flag = 0;
     // osDelay(1); 호출하면 사진 데이터 보내는 중간 중간 다른 Task 실행
     // 해도 그만~ 안해도 그만~             
    }
    
  }
  
}

 

위 문제는 1번과 관련된 문제로 메모리가 부족해서 발생했던 문제로 확인함

추가로 netconn_write 호출 하였을 시 osDelay를 따로 호출 하지 않아도 정상적으로 동작 확인.

 

***** Check 필요 *****

while(1) 함수를 통해 netconn_write를 여러번 호출하는건 괜찮으나 netconn_write를 연속 호출 하면 문제가 생기는 듯 

향 후 Test 필요

 

 

4. Wireshark를 통해 출력된 사진 데이터

 

 첫 패킷에서 JPEG 헤더(SOI) 데이터

 

마지막 패킷에서 JPEG 마지막 헤더(End of Image) 데이터

Camera 인터페이스인 I2C와 SPI 정상 연결을 알리는 데이터 출력 화면