본문 바로가기

Developement/eLinux

(4)
서비스 데몬을 만드려다 노가다 하다 ... 시스템을 이제 다 만들어 가는지라, 기존에 일일히 실행 해서 쓰던 서버들을 이제 데몬으로 올리려 임베디드 리눅스 파일 시스템 /etc/rc.local 뒤에 뙇 넣어 놨더니 ... 하 ... rcS.d 세션이 끝나니 다들 죽으신다 ... 대체 언제적 문제인가 해서 back to the past. 현재 개발 하는 시스템은 squashfs 를 이용한 NAND writing 을 하기 때문에 미리 sqfs 를 만들 위치에서 부터 ARM ELF 로 만들어진 바이너리를 각각 /usr/sbin 안에 넣어 준다. 예를 들어 서비스 서버로 만들었던 것 중 하나가 asctrld 이라면 /usr/sbin/ 안에 asctrld 를 넣어 주는 것. 그런 다음, 아래 스크립트를 복붙 으로 /etc/init.d 안에 asctrld ..
ALSA + mpg123 출력시 clicking noise 발생 대처 방안. 요즘 대부분의 Embedded Linux 환경이 좋아져서 개발 환경이 매우 용이해 졌습니다. 심지어 F*사 쪽은 Kernel 을 3.14 로 올리는 시대가 왔습니다만, 모든 환경이 그렇게 우아하게 좋을리가 없다는게 또 현실이 아닐까 합니다. 근래 하는 일 중에 ALSA 를 통해 mp3 를 재생 하는 일을 수행 하는 중, 다음과 같은 문제가 발생 하였습니다.사용된 mpg123 은 최신 버젼 (1.17.0 )mpg123 를 ALSA 와 붙이기 위해 mpg123 재생 예제를 응용하여 pthread로 play 부분을 처리.실제 Windows 환경에서는 문제가 발생 하지 않지만 Embedded Linux 상에서 mpg123 으로 decode 된 PCM buffer 를 재생시 최초 와 재생 종료시 clicking ..
socket 의 recv() 는 항상 원하는 크기대로 오지 않는다 ! 이전의 버퍼를 다 받아 오지 않던 문제를 ... 그간 PC 에서 socket processing 하던 편리함에 빠져 그 근본을 잊었던 것 같습니다. 임베디드 보드가 지속적인 메모리의 malloc() 과 free() 때문인지 죽어 버리는 문제가 발생 하지만, 적어도 30MB 의 데이터를 지속적으로 500번 가량 전송 하는데 성공을 했습니다. 이유는 간단히, recv() 함수가 가진 특성을 그간 간과 했기 때문 입니다. socket 에서 recv() 로 원하는 크기가 다 넘어 오지 않는다. 이 사실을 제가 간과 하고 있었네요. 너무나 기초적인 부분인데, 어찌 이런걸 제가 그간 잊고 있었을까요? 그래서 코드를 다음과 같이 수정 하였습니다. int nRecvSize = 0; bool bRecvDone = fal..
임베디드 리눅스의 이 난감한 상황은 ... 시그윈에서 socket 과 inet 만으로 단순 socket server 를 만들었습니다. class 로 wrapping 해서 쓰기 편하게 만들어서 돌렸더만 잘 돌기에 힘들게 porting 한 embedded linux 에 넣고 짠! 하고 잘 돌줄 알았더니, 흠 - 얘가 뭔가 뾰로퉁 하게 도네요 .. 30MB 짜리 버퍼를 보내는데 4KB 보내고 멎어 있습니다. socket server 를 non-blocking, async 로 설계한 이유는 아닌거 같은데, FD_ISSET() 이나 ioctl() 에서 멎는 문제도 아닐텐데, 그 이유를 찾기가 어려운 난감한 상황이 아닌가 합니다. 현재 GbE 로 연결된 상태라 전체 속도의 반인 60MBytes/sec 정도가 나와 주면 좋겠는데, 설계의 문제인지 아니면 제가..