임베디드 리눅스 시리얼 포트 통신속도 변경하면 메모리누수 발생..
void serial_init(int device){
close(serial_fd[2]);
serial_fd[2] = open("/dev/ttyS3", O_RDWR | O_NOCTTY);////이포인트에서 메모리 누수발생 point1
fcntl(serial_fd[2], F_SETFL, FASYNC);
tcgetattr(serial_fd[2],&g_oldtio);
memset((void *)&g_newtio,0, sizeof(g_newtio));
g_newtio.c_iflag = IGNPAR;
g_newtio.c_oflag = 0;
g_newtio.c_lflag = 0;
g_newtio.c_cc[VMIN] = 0;
g_newtio.c_cc[VTIME] = 1;
printf("==============================\n");
if(device == DEVICE_EP_METER || device == DEVICE_SIGN){
g_newtio.c_cflag = B9600 | CREAD | CS8 | CLOCAL;
printf("[485 SYSTEM] Baud Rate Open: 9600\n");
cfsetspeed(&g_newtio, B9600);
}
if(device == DEVICE_HACON || device == DEVICE_DIMMER || device == DEVICE_MULIT_TEMP){
g_newtio.c_cflag = B38400 | CREAD | CS8 | CLOCAL;
printf("[485 SYSTEM] Baud Rate Open: 38400\n");
cfsetspeed(&g_newtio, B38400);
}
tcflush(serial_fd[2], TCIFLUSH);
tcsetattr(serial_fd[2], TCSANOW, &g_newtio);////이포인트에서 메모리 누수발생 point2
}
물리적으로 포트가 하나이기 때문에 통신속도를 계속 스위칭 해주어야 하는데..
메모리 누수가 일어나지 않고 통신속도를 적절하게 스위칭 할 수 있는 방법이 있는지 문의드립니다.
누수된 메모리가 복구가 되지도 않고 결국엔 하드웨어가 다운되버리네요..
하..
포트를 닫지 않고 열어둔체로 통신속도만 변경해도..
point2번에서 메모리를 계속 까먹습니다.. free나 top명령어로 확인했습니다..
tcsetattr은 왜 호출해야 하는지요..
이미 오픈된 포트를 계속 사용하고, 통신속도만 바꿔주면 된다면 tcsetattr을 왜 다시 호출해야 하는지 궁금합니다.
포트를 새로 열지 않는다면 point2번은 안 해줘도 될 것 같거든요.
--
tcsetattr이.. 변경 설정 반영하는 함수로 알고있습니다.
구조체에서 통신속도만 변경하면 통신속도 반영이 안되고.
tcsetattr 를 사용하면 통신속도가 변경되는것같습니다..
아닌건가요..
아 맞네요. 제가 잘못 알고 있었네요. 죄송합니다.
같은 코드를 PC등 다른 플랫폼에서 실행해도 같은 누수가 발생하는지 궁금합니다.
제 생각에는 그렇지 않을 것 같고 그렇다면 좀더 아랫쪽을 살펴봐야 될 것 같네요.
--
시리얼통신에서 속도에 따라 에러가 발생을 합니다.
시리얼통신에서 속도에 따라 에러가 발생을 합니다. 그 에러의 이유가 메모리 누수일 수도 있지만, 다른 이유일 수도 있습니다.
속도를 올릴 수록, 에러율이 높아지는 이유? 무얼까요...
댓글 달기