문제점
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 정상 연결을 알리는 데이터 출력 화면
'Firmware > stm32' 카테고리의 다른 글
FSMC HAL_SRAM_Write_16b Bug 문제 (0) | 2020.06.13 |
---|---|
stm32 uart interrupt 멈추는 현상( RXNEIE disable, overrun) (7) | 2020.06.06 |
OV5642_LWIP_RTOS Project -2(Camera API) (0) | 2020.04.24 |
OV5642_LWIP_RTOS Project -2(Camera Interface 구현 ) (1) | 2020.04.23 |
OV5642_LWIP_RTOS Project -1(Netconn_write 호출 시 문제) (0) | 2020.04.23 |