본문 바로가기

Firmware/stm32

OV5642_LWIP_RTOS Project -1(osThreadSetPriority 문제)

Project 진행 중 osThreadSetPriority 함수 실행에 문제가 발생했다.

 

위 함수의 문제는 ThreadSetPriority(defaultTaskHandle,osPriorityNone)에서 2번 째 인자 값이 0(osPriorityNone) 일 때 

 

우선 순위가 변경 되지 않는다.

 

defaultTask의 우선순위 = 0으로 하였을시 fail

즉 Task의 우선순위를 변경 할려면 IDLE Task의 우선순위보다 커야하며 (Priority>0) 같게 하였을 경우 우선순위가 변경 되지 않고 이전 priority를 유지한다.

defaultTask의 우선순위 = 1로 하였을시 osDelay가 아닌 함수 안에서 Context Switching이 일어난다.

 

netconn_accept 함수에서는 Client가 Connect 할 때 까지 Task는 Block 상태가 된다.

netconn_write (struct netconn *conn , void *data , u16_t len , u8_t aApiFlags );

netconn_write 함수에 3번쨰 인자 값을 보면 aApiFlags 로 되어있는데 이 플래그는 전송 할 때 버퍼의 상태를 나타낸다.

플래그는 다음과 같이 조합을 할 수 있다.

 

#define NETCONN_NOFLAG 0x00  // 데이터를 복사하지 않고 참조한다.
#define NETCONN_COPY 0x01 	 // 데이터를 내부 버퍼에 복사한다.
#define NETCONN_MORE 0x02    // TCP 연결에 사용 되며 마지막 전송 된 세그먼트에 psh 플래그가 설정됨을 나타낸다.
#define NETCONN_DONTBLOCK 0x04 //스택에 있는 모든 데이터를 한번에 쓸수 있는 경우 데이터를 쓰도록 지시한다.

 

void Tcp_Task(void *argument)
{
  /* USER CODE BEGIN Tcp_Task */
  struct netconn *conn, *newconn;
  err_t err, accept_err;
  struct netbuf *buf;
  char *data;
  u16_t len;
  
  LWIP_UNUSED_ARG(argument);
  
  conn = netconn_new(NETCONN_TCP);
  
  if (conn!=NULL)
  {  
    err = netconn_bind(conn, NULL, 1460);
    
    if (err == ERR_OK)
    {
      netconn_listen(conn);
      
      while (1) 
      {
        accept_err = netconn_accept(conn, &newconn); //Client가 Connect 될때까지 Block 한다.
        tcpconn = newconn;
        
        if (accept_err == ERR_OK) 
        {
          
          while (netconn_recv(newconn, &buf) == ERR_OK) 
          {

              netbuf_data(buf, &data, &len);   

	      if(strcmp(data,"CMRA") == 0)
	      {
                netconn_write(newconn, data, len, NETCONN_COPY);
	      }
	      else
	      {
                netconn_write(newconn, data, len, NETCONN_COPY);
                char* data2 = "Netconn Write";
                netconn_write(newconn, data2, sizeof("Netconn Write"), NETCONN_MORE);
                //netconn_write에서 같은 데이터 주소를 참조하여 보낼 시 2번 출력이 되지 않는다.
                //netconn_write(newconn, data, len, NETCONN_COPY); 43번 코드 대신 이코드로 할시 동작x
	      }
            netbuf_delete(buf);


          }
          netconn_close(newconn);
          netconn_delete(newconn);
        }

        
      osDelay(100);
      }
      
    }
    else
    {
      netconn_delete(newconn);
    }
    
   
  }

위 코드와 같이 netconn_write에서 NETCONN_COPY 후 다시 NETCONN_MORE 를 호출해야 TCP Client로 전송된다.