분류 전체보기124 MP3 총 재생 시간 계산하기 MP3 파일의 총 재생 시간을 구하는 방법은 다음과 같다. 총 재생시간(초) 계산식 1 = ( 파일 크기 - ID3를 제외한 첫 MP3 프레임 시작 offset) * 8 / 비트레이트 파일크기 : 파일 전체 크기 ID3를 제외한 첫 MP3 프레임 시작 offset : 첫 번째 MP3 Sync word 가 시작하는 파일 오프셋 비트레이트 : 음원의 비트레이트 (192kbps 등) 예를 들어 파일 크기가 6013734byte 이고, 비트레이드가 192 kbps일때, 시작 offset이 138 이면 ( 6013734 - 138 ) * ( 8 / 192000 ) = 250.56 이 나온다. 분 단위로 변경 하면 250 / 60 = 4분, 250 % 60 = 10초 즉, 4분 10초 짜리 음원이 된다. 단 C언어.. 2022. 1. 24. 펌웨어에서 FAT파일시스템의 확장자 구분 파일 확장자란 해당파일의 종류를 표시하기 위해 사용한다. FAT에서는 기본적으로 파일명은 8자리, 확장자는 3자리를 사용했으나, 긴 파일명도 지원하기에 파일명도 255자, 확장자도 .xlxs 같이 4자리도 사용한다. 이번에 하는 프로젝트에서 USB 메모리 스틱에서 특정 파일 리스트를 정리하는 함수가 필요했다. 음악파일인 MP3만 정리해서 파일 리스트를 뽑아주는 함수였다. 폴더내 파일중에 확장자 .mp3 만 찾아 변수에 정리만 하면 되는데, 특정mp3들이 추가가 안되는 이슈가 발생했다. mp3를 구분하는 함수는 다음과 같다. bool APP_SDCARD_AUDIO_Card_isSupportedAudioFile(int8_t *name) { int i = 0; if(name == NULL) return fal.. 2022. 1. 18. Helix MP3 Decoder 와 ID3 처리 요즘은 원만한 디바이스에도 리눅스가 포팅되기에 오디오나 비디오 코덱 적용이 어렵지 않다. 하지만 아직도 펌웨어로 오디오 코덱을 개발해야 하는 경우도 있고, MP3를 재생하기 위해 Helix MP3 Decoder를 포팅하여 사용했다. https://github.com/ultraembedded/libhelix-mp3 포팅방법에 대해서는 그다지 복잡하지 않고, 인터넷에 샘플 소스가 많아 찾기 어렵지 않으며 http://ww1.microchip.com/downloads/en/Appnotes/01367A.pdf https://www.silabs.com/documents/public/application-notes/an1112-efm32-helix-mp3-decoder.pdf문서들을 참조하면 좋다. 또 MP3 대한.. 2022. 1. 18. 동적 라이브러리 SO의 체크섬이 달라지는 이유 개발 환경을 테스트하는 도중, 오브젝트 파일은 똑같은데 왜 그걸 합친 SO 파일이 체크섬이 다른 케이스가 나타났다. 왜 다를까? 이해가 되지 않는다. 그래서 각 다른 개발 환경에서 빌드 한 so를 헥사 에디터로 비교해 봤다. 헥사 에디터로는 내용 분석이 어려워서 readelf로 분석을 다시 하기로 했다. 첫 헤더는 정상이고, 아래로 내려보니 메모리맵에 로드되는 함수 순서가 서로 다른 것이 나타났다. 위치만 바뀌어서 메모리 주소도 변경되었지만 그 외 차이점은 보이지 않았다. 그럼 왜 메모리 로드되는 순서가 바뀌었을까? 설마 하고 빌드 되는 내역을 다시 조사했다. 빌드 하기 전에 이전 오브젝트 파일을 삭제를 하는데 여기서부터 차이점이 나타났다. 파일 순서가 바뀌었다. makefile 을 살펴보니 rm 을.. 2021. 12. 18. 크로스컴파일러 개발환경 구축에 대한 팁 개발서버가 다른 PC로 이전하는 바람에 크로스 컴파일러는 전부 옮기는 일이 발생했다. 우분투 OS 버전도 20 버전대로 올라갔고, i7 CPU에서 제온으로 향상되었다. 컴파일러도 전부 옮기고 파일도 옮기고, 개발 환경에 필요한 SVN , SAMBA, NFS, TFTP 등을 설치하고 계정을 만들고 정신이 없었다. 그리고 마지막으로 개발 환경을 구축하고 잘 빌드 되는지, 같은 소스로 같은 파일이 나오는지 테스트를 하는데.... 체크섬이 다른 문제가 나타났다. 같은 컴파일러, 같은 소스인데 결과가 다르다? 우선 문제를 찾기 위해 다음과 같이 비교했다. 1. 소스코드와 Makefile 이 같은지 비교 1차로 소스가 같은지 비교를 했다. 완전히 똑같았다. 2. 각 소스별 .o (Object) 파일 비교 .. 2021. 12. 18. 무거운 프로그램에 대한 최적화 #sleep과 #select 리눅스에서 c프로그램을 만들다 보면 실행하고 동작을 보고 테스트를 해보 끝을 내는 경우가 많다. 스펙대로 동작한다 단위 테스트를 해도 문제없었다 하면서 프로그램을 개발, 테스트를 하고 결국 문제가 없다 하면 배포가 되곤 한다. 하지만 “동작”이 잘되는 프로그램을 살펴보면 cpu사용량이 90%를 넘는 경우가 상당수이다. 외부장치의 키보드에서 키 입력을 기다리거나 특정 조건이 되면 처리를 하는 반복문 등에서 cpu를 쉬지 않고 계속 해당 루프를 돌게 해서 발생하는 문제다. 개발자 눈에는 소소의 각 함수가 천천히 돈다고 생각하지만 사실 임베디드 장치의 cpu라 해도 1초에 몇백만 번의 클럭이 발생하고 있고 함수는 몇만 번이 실행되고 있다. 그리고 cpu는 비명을 지르면서 개발자의 소스를 돌린다. 개발 초기라면.. 2021. 11. 28. 이전 1 ··· 3 4 5 6 7 8 9 ··· 21 다음