약 30분 정도를 삽질한 끝에 시리얼로 데이터를 송신할 수 있게 되었다. 시리얼 설정하
는 레지스터가 PC의 메인보드에 달려있는 시리얼 설정하는 레지스터랑 거의 비슷해서
별 무리없이 된거 같다.
혹시 똑같은건가?? ㅡ_ㅡ;;; 워낙 오래되서 PC꺼는 생각이 잘 안나는데.. 쩝쩝...
메뉴얼을 보고 요것 조것 넣어가면서 어설프게 9600으로 송신하는걸 만들었으니,
이제 쫌더 손봐서 송수신 하도록 하고 Baud Rate도 쫌더 높여야겠다.
쩝... 이제야 먼가 되가는거 같군.
컥.. 이런.. 다른 PC에서 Cygwin을 깔고 툴을 컴파일하니까..




가 난다. ㅡ_ㅡ;;; 몬산다 몬살아... 이상하네 분명히 같은 버전인데 왜 여기서는
안될까나??
으으.. 머리에 스팀이 꽉차서 죽겠다. ㅡㅠㅡ;;;;
음냥.. 프로젝트 전체에 넘치는 Global 들로인해 드뎌 어디서 머가 되고, 어떤 파일에
이 Global 들이 있는지 파악하기 어려운 단계에 이르렀다.
쿨럭..;; 여튼 정리를 하긴 해야 할 것 같은데...
Class를 만들어서 처리를 할려고 하니 쓰는 곳이 한두군데가 아니어서 상당히 빡시게
구르고 있다.
완전 노가다다.. ㅡ_ㅡ;;;
우쒸... 이러다가 관절염 걸리겠네 그려...
아아.. 참 길고도 험한 여정이었다. ㅡ_ㅠ
Cache 땜시롱 한번 헤매고, EDMA 땜시롱 한번 헤매고, AD535 ADC 땜시롱 또 헤매
고... 음메, 왜 일케 빡신겨...
사실 Sampling 처리에 문제가 조금 있었는데, 내가 녹음한 MP3 파일은 44khz Stero
형식인데, C6711의 AD535는 Mono에 8khz다.
따라서 변환이 필요한데, 머 마땅히 어디서 손쉽게(??) 긁어올 수 있는 곳은 안보이고,
고민하던중 또 나의 얍삽이가 고개를 들었다. (어찌나 고마운지.. ㅋㅋ)

"음... 8khz는 44khz의 약 1/5 쯤이니까 버퍼를 5개씩 뛰어가면서 0xFFFE로 AND한
다음 그걸 담아서 EDMA로 전송하게 하면... +ㅁ+/~~"

지금 생각해보니, 정말 하드코어(??) 얍삽인데.. ㅡ_ㅡ;;; 여튼 급하니까 일단 구현을
했었다.
MP3 Codec이 한번 디코딩을 하면 4068(?? 확실치 않음)byte 정도의 데이터가 나왔
는데, 이걸 내가 만든 얍삽이로 play를 하게되면 아래와 같이 된다.


정상적인 44khz Stero를 쓸때 :
4068 / ( 44 * 1024 * 2 ) = 0.0451초

하드코어 얍삽이 + 8khz Mono를 쓸때 :
4068 / ( 2 * 5 ) / ( 8 * 1024 ) = 0.0497초


따라서 소리가 약간 늘어지고 거칠게 들리긴 하는데, 나름대로



고 생각한다. ㅡ_ㅡ;;;; (절대 타협하는건 아니고, 진짜 들을만 하다 +ㅁ+/~)
근데 허무한건, 난 아무것도 아직 한게 없다는 것이다.
기껏해야 EDMA랑 MCBSP랑을 연결해서 출력을 하게 했는데 걍 소리 나오고.. ㅡ_ㅡ;
C5510 할때는 실수 연산하는 함수까지 내가 만들어서 Clock을 줄일려고 난리쳤는데...
FPU의 힘을 강하게 느끼는 계기가 되었다.

없는놈이 있는 놈을 이기려면, 같은 조건가지고는 영 어렵겠군.
여튼 1차 완료~ @0@/~
음... 오늘 ARM 문서를 보면서 여러개의 레지스터의 값을 메모리로 저장하고, 메모리
에서 읽어오고 하는 문서를 봤는데... 역시 책으로만 보니 별로 잘 모르겠다. ㅡ_ㅡ;;
일단 명령을 실행하고 메모리를 보면 금방 알꺼 같은데.. 그러기 위해서는 눈으로
멀 표시하게 하는게 최고 우선인거 같다.
당장 붙어있는 놈이라고는 LED하고 시리얼 정돈데... LED로 보는건 좀 어의없는거
같고 그렇다면 역시 시리얼쪽을....... +ㅁ+
흠... 일단 UART쪽 프로그래밍을 쬐금 해서 write만 구현해 놓고 PC에서 확인하는
쪽으로 진행을 해야겠다.
LCD가 없으니 쫌 답답하군... ㅡ_ㅡ;;;
음냐.. ㅡ_ㅡ;;; MP3 디코딩된 버퍼를 EDMA를 통해 MCBSP로 AD535에 쏘고 있는데,
(얼래.. 말이 좀 희한하게 됬네. 단어의 나열같은...) 이놈이 잘 가다가 갑자기 MCBSP
에서 XRDY가 뜨지 않는다.
으음... 사인 버퍼를 넣으면 잘 출력되는데, MP3 디코딩된 버퍼를 넣으면 갑자기 어느
순간에 멈춘다.
AD535랑은 따로 제어 MCBSP를 쓰는건 아니고, 하나의 MCBSP로 음성 송수신,
AD535제어를 다 하고 있기 때문에...
아무래도 제어 문자가 있는거 같다. 음냥.. 어쩌징.. ㅡ_ㅡ;;;
낼 일단 AD535문서를 한번 뒤져볼 필요가 있겠다.
쿨럭..;; 머가 이래 빡신지.. 쩝쩝..
쿨럭.. ㅡ_ㅡ;;;; 오늘 AD535에 대한 문서를 줄줄이 뽑아서 읽어보던중... DSP -> AD535로 가는 Voice Data 중 0bit가 특별한 의미를 갖는다는걸 알았다.

0bit가 1로 설정되면 다음 16bit data는 Codec Register 설정에 대한 데이터를 의미하는 것이었었더랬었던 것이다.(?? ㅡ_ㅡ;;; 상당히 문법이 의심스러운... 갑자기 회사 사람이 이야기 해준 Hello,World 누가 길게 찍나가 생각나네.. ㅋㅋ)

쿨럭..;;
그렇다면 AD535는 0xFFFE로 AND 연산을 해준다음 데이터를 쏴야~ 제대로 소리가나온다는.. 쿨럭..;;;

여튼 그래서 AND를 해주고 데이터를 송신하니 별 이상없이 소리가 나긴 나는거 같다.
거참 어렵구만.. ㅡ_ㅡ;;;
쿨럭.. ㅡ_ㅡ;;;; 오늘 AD535에 대한 문서를 줄줄이 뽑아서 읽어보던중... DSP -> AD535로 가는 Voice Data 중 0bit가 특별한 의미를 갖는다는걸 알았다.

0bit가 1로 설정되면 다음 16bit data는 Codec Register 설정에 대한 데이터를 의미하는 것이었었더랬었던 것이다.(?? ㅡ_ㅡ;;; 상당히 문법이 의심스러운... 갑자기 회사 사람이 이야기 해준 Hello,World 누가 길게 찍나가 생각나네.. ㅋㅋ)

쿨럭..;;
그렇다면 AD535는 0xFFFE로 AND 연산을 해준다음 데이터를 쏴야~ 제대로 소리가나온다는.. 쿨럭..;;;

여튼 그래서 AND를 해주고 데이터를 송신하니 별 이상없이 소리가 나긴 나는거 같다.
거참 어렵구만.. ㅡ_ㅡ;;;
컥.. 이런이런.. 한참을 헤맨끝에 문득 떠오른 생각...

"음... 혹시 빌드 옵션에서 본 call 방식때문에 그런가.. ㅡ_ㅡ;;;"

빌드 옵션에 들어가보니 near call/near data인가??? 머 이걸로 되어있었다.
MP3코드가 좀 길다보니 near call은 안되는 것도 몇개 있겠다 싶어서 far call/data로
수정하고 링크했더니 링크가 되공.. ㅡ_ㅡ;;;
머 이제 보드에 MP3 데이터를 올려야 하니, 내가만든 C55용 툴을 개조해서 C67용으
로 수정하고 메모리에 올려서 테스트 하는데,
얼래... 계속 MP3 Frame이 잘못됬다는 에러가 나네.. ㅡ_ㅡ;;;
산넘어 산이라고, 것참 만만한게 아니구만 쩝쩝.

죽어라 삽질끝에, 디버깅하다가 데이터가 이상해지는 걸 발견... 함수에서 넘겨받은
파라메터의 값이 실행도중에 바뀌는 것이다. 역 어셈해봐도 딱히 이거다 짐작가는건
없고... 근데 웃기는건 그 함수에서 다른 함수로 파라메터를 넘겨주면 넘겨받은 함수
의 파라메터는 변하지 않은 정상적인 값으로 나옴.

음냥, 결국 C67의 디버그는 못믿겠다는 결론에 봉착하고 메모리를 살피던 도중, 올라
간 메모리가 먼가 이상함을 발견했다.
자세히 들여다 보니, 헉... C55는 데이터를 Word 단위로 받기때문에 C67도 그런줄
알고 Word 단위로 데이터를 만들어서 CCS로 로딩했더니, 이게 실은 Dword로 읽어
들여 상위를 모두 0x0000으로 체웠던것이다.
그러니 프레임 에러가 날 수 밖에.. ㅡ_ㅡ;;;

툴 수정후에 다시 로딩해서 실행하니, 프레임 에러는 없음.
으으... 토하겠다 ㅡㅠㅡ;;;;
머가 이렇노..
Boot Code를 분석하던 중에 LDR과 MOV의 명령을 보게 되었다.
ARM 문서를 보니 둘다 레지스터에 값을 넣는거던데.. ㅡ_ㅡ;;;
이래 저래 서로 명령어를 스위칭해가면서 테스트 했는데 실패...
웹상에서 아는 분께 물었더니,

LDR ==> 메모리에서 레지스터로 값을 넣음.
MOV ==> 레지스터 또는 Immediate를 레지스터로 넣음.

이었던 것이다.
음냥.. 근데 여기서 이상한걸 발견할 수가 있는데, LDR과 MOV 모두 12bit Address
bit를 가지고 있다.
근데, LED 포트는 0x90040000로 표기되는 32bit인데 어떻게 LDR r0, =0x90040000
를 통해 레지스터에 32bit 값을 넣을 수 있는 것일가??

arm-linux-gcc로 일단 컴파일 링크를 거친다음 arm-linux-objdump로 역어셈블해본
결과 위의 코드는 아래와 같이 되어있었다.

80c8: e59f0068 ldr r0, [pc, #68] ; 8138 <LedFlashing+0x1c>
.....
8138: 90040000 andls r0, r4, lr

컥... 결국 메모리에 0x90040000를 어딘가에 써넣고, LDR 명령에는 해당 OFFSET의
메모리 Address만 넣어둔 것이었다 @0@/~~
쿠.. 쿨럭..;;
저.. 저런식인가.. ㅡ_ㅡ;;;
으으.. 나의 허접한 ARM 어셈실력으로 메뉴얼을 뒤져가며 삽질한 결과...
드뎌 LED가 라운드로빈되면서 켜지기 시작했다.
하려하는 구체적은 생각은 있는데, 어셈명령을 몰라 일단 생각나는 x86 어셈을 마구
난타한다음 컴파일 실행 @0@/~
역시나



!!!

눈물을 줄줄 흘리면서 Linux 커널에 있는 .S 파일을 뒤져서 보던중 BLE 란놈을 발견
하고 문서를 뒤진결과 B + 조건 의 형태로 구성되어있는 명령어들을 발견 @0@/~~
코딩후 바로 실행~~
오오~~ LED가 돌아가는걸 확인 할 수 있었다.
아아.. 드뎌 한 걸음 땠구나... ㅡ0ㅠ..
Flash에 구워서 되는걸 확인했으니, 이제 슬슬 해보면 될꺼 같다.
흐믓하군. ㅋㅋ
홧팅 >ㅁ</~
으으.. ㅡ_ㅡ;;; 왜일케 복잡한지... 믿었던 문서에 약간 미비한점도 있고...
여튼 이래 저래 하다보니 결국 크로스 컴파일러를 만들었다.
근데, 이놈도 마찬가지로 링크할때 바로 binary로 링크가 안되고 ELF로 링크가
되었다. binary를 사용하게 포멧을 binary로 줬더니 ARM링크할때는 ELF말고는
안된다는 에라 메시지가 나온다.
힘들게 컴파일 했더니만, 결국 GNUARM과 같은 결과가 나왔다.
일케되면 GNUARM을 걍 설치하고 PATH만 잡아주는거랑 같은결관데.. ㅡ0ㅠ/~
완전 생쇼를 했군... ㅡ_ㅡ;;;
머 그래도 제대로 설치 됬으니, 그것 하나는 다행인거 같고...
부트로더 같은거 만들려면... 순수 Binary가 필요한데 멀로 만드나...
ObjCopy라는게 있긴하던데, 이걸로 만드는감...
일단 낼 또 한번 뺑이를 쳐봐야 겠군.

오.. 글고 신기한건, 어셈 파일 형식인데 .S라는 확장자를 가지고 내부적으로는 C파일
전처리기 + 어셈코드 인거 같다.
어셈코드안에 #include 가 있는걸 보니...
으음.. 일케되면 걍 쓰면 된다는 결론이 나오네...

좋구로.. ㅋㅋㅋ
아.. 야심하군. 자야긋다.
홧팅 @0@/~~
쿠오~ 오늘 KESL 사이트를 뒤지다가
Cygwin에서 소스를 다 받아서 크로스 컴파일러를 만드는 문서를 구했다.
문서에 보니깐 테스트까지 해봤다고 해서, 속는 셈 치고 해봤더니
얼래.. ㅡ_ㅡ;;
gcc와 glibc가 만들어지는거 까지 확인했다.





!!!

이것만 되면 또 열심히 삽질하면서 플래쉬 굽고 리셋하고를 반복하겠군.
아아.. x86 커널 만들면서 다시는 안하겠다고 다짐했는데.. ㅡ_ㅡ;;;
시간이 좀 지나니 또 관심이 가는것이... 으으.. ㅡ_ㅠ...
일단 어셈코드부터 익숙해져야 겠다.
다 알 필요는 없지만 부트 코드랑 어셈 함수 정도는 만들 수 있어야 나중에 편해지니
까 고정도까지만 해둬야징...

여튼 좋구나아아아아~~~
쿠하하핫 @0@/~
음메... Cygwin과 GNUARM의 조합으로 구축해 보려던 환경은 오늘 실패로 끝났다.
으으... 설정파일 같은걸 시도하다가 결국 실패하여 파일을 한 폴더에 몰아넣는
'하드코어' 테크닉을 구사하여 머 실행까지는 시켰는데... ㅡ_ㅡ;;;
문제가 3가지 정도 있었다.

1. library 파일을 못찾는다.
2. include 파일을 못찾는다.
3. elf 파일 포멧 말고는 못만든다. (난 Binary 파일하고 coff 파일이 필요한데.. ㅡ_ㅡ)

쿠.. 쿨럭..;;;
걍 리눅스 깔아서 거기서 쓸까나.. ㅡ_ㅡ;;;;
요즘 또 ARM쪽에 문서를 보기 시작했는데, 이놈이 참 재밌는 구조를 하고 있다.
특히 IRQ위에 상위 Fast IRQ인가 하는게 더 있던데...(명칭 불확실) IRQ보다 우선순위
가 높아서 IRQ가 발생한 시점에도 Fast IRQ가 선점가능하다.
그리고 운영 모드도 여러 모드가 있어서 상당히 세분화 되있는듯한 느낌을 받았는데,
인상적인건 각 모드마다 banked register라는게 있어서 모드가 변경될때 이 레지스터
들은 이전 모드에서 사용하는 레지스터가 아니라는 것이다. @0@/~
오우~ 얼마나 헷갈리는 이야기인가.. ㅡ_ㅡ;;;
머 여튼 뺑이 쳐보면 알겠지.. ㅋㅋ
글고 어셈 명령이 좀 특이하던데, 어셈명령하나로 여러개의 레지스터에 줄줄이 넣고
빼고 할 수 있는거 같넹.
스택에 줄줄이 넣고 빼던데 이걸 사용하면 걍 스택에 넣는걸로 해서 Task Switching
을 구현할 수 있을꺼 같다.
쿠핫핫핫핫~
뺑이다 뺑이 @0@/~~
아래 바로가기 누르기

GNU ARM
컥..;;; 소스를 열심히 갖다 붓고 컴파일 에라를 잡은다음 링크를 거는 순간...
또 억장이 무너지는.. ㅡ_ㅠ;;;
살포시 떠오르는 빨간색의 링크 에라는 정체를 알 수 없는 문제를 ㅡ_ㅡ;;;;
머 오브젝트 파일에 특정 헥사값을 적고 빨간색으로 메모리 블럭이 머 어쩌구 이런
에라던데... ㅡ_ㅡ;;;;
참으로 당황스럽군.
Endian도 똑같고 각 변수 키워드들의 메모리 크기 같은것도 거의 차이가 없어서
금방될 줄 알았는데......
우우... 먼일일까나...
DSP는 역시 만만하게 볼 께 아닌거 같다.
ㅠ_ㅠ/~~ 크윽...
오늘 하루종일 삽질한 결과가 드뎌 나왔다.
EDMA하고 MCBSP를 오만 삽질끝에 드뎌 연결한것이다. @0@/~~
사인파가 삘삘 거리면서 스피커로 나오고 있다. ㅡ_ㅡ;;;;;
얼마나 해멨는지.. 말도 몬한다. ㅡ0ㅠ...
분명 XEVT0로 신호가 와서 EDMA가 사인파 데이터를 AD535쪽으로 퍼줘야 함에도 불
구하고, 전혀 소리가 안나는 것이다.
그리고 웃긴건, 간혹가다가 Transfer가 되고 그러고 난 뒤에는 AD535 초기화 실패..
잇단 코드 붕괴(??) ㅡㅠㅡ;;;;;

당체 먼일인지...

처음에는 EDMA쪽 설정이 잘못된줄 알고 죽어라 설정을 바꿨으나 똑같은 결과..
그나마 Transfer 갯수를 줄이면, 코드 붕괴(??)가 덜됨.. ㅡ_ㅡ;;;
일단 EDMA의 오동작으로 내맘대로 정하고 잠깐 쉬다가 다시 생각해보니 말도 안됨.

그리 해메다가 구석에 짱 박혀있는 책을 발견하고 뒤짐. 음냥.. 별 내용 없음 ㅡㅠㅡ;;;
또 한참을 삽질하고 MCBSP의 XINT를 강제로 Enable도 시켜보고 별 삽질 다했으나
결과는 나의 장렬한 전사. >ㅁ</~~

낡은 책을 한참을 뒤지던 끝에 대략 다음과 같은 간단한 문구 발견
"This is same as send to AD535 Dummy Data..."
쿨럭.. 번쩍이며 내 뒷골을 때리는 생각과 동시에 눈에 들어오는 코드...
EDMA를 Enable하고 났으니 이제 본격적으로 XEVT0를 발생시키기 위한 Trigger가
필요했던 것이다.

아아아아아아앍~~~ @0@/~~
그래서 걍 더미 데이터를 딱 나리자 마자 걍 소리남.. ㅡ_ㅡ;;;;
우이 씨...
왜이리 멍청한걸까?? ㅡㅠㅡ;;;;

자.. 그람 좀 쉬어볼까나... ㅋㅋㅋ
C6711 Chip의 Cache는 상당히 복잡한 구조를 가지고 있는거 같다.

L1, L2 Cache 간의 coherence는 snoop 커맨드로 지들이 알아서 동기화를 하는거 같
다.
L2, external 간의 coherence는 지들이 알아서 하는게 아니라 내 책임이란다. ㅡ_ㅡ;;
쿨럭.. 그래서 다음과 같은 상황에서는 앞서 아래와 같이 먼저 하라고 권고한다.

periperal -> external ram dma transfer 후 CPU가 buffer를 읽어야 할때
-> L2 write back Invalidate
CPU가 buffer를 조작 후 external ram -> periperal로 Transfer 할때
-> L2 write back

글고 CPU와 EDMA간에 external memory를 통한 array transfer를 할 시, array는
-> cache line 크기의 배수
-> cache line 경계에 정렬
되어야 한댄다. ㅡ_ㅡ;;;

이제야 지난번에 내가 EDMA로 external memory -> external memory로 transfer
를 했을때, 안됬는지 이유를 대강(??)알겠다.
쿨럭..;; 복합적인 이유였군.. @ㅠ@/~~
으으... 요즘 MP3처리때문에 여러 책들을 뒤지고 있다. 머 뒤지기만 할 뿐 크게 깨닫지
를 못하고 있어 상당한 에라지만... 언젠가는 도가 터질날이 있겠지...
우웅... kkamaugi 커널 만들때도 일케 빡시지는 않았는데...
그때는 OS에 대해 잘 몰라서 그걸 이해하는데 빡셨을뿐, Audio 처리는 알고리즘에
이해도 힘들고 구현은 더 빡신.. ㅡ_ㅡ;;;;
으으.. 여튼 큰일이다. 큰일 쩝쩝..
머 열심히 하는 수 밖에...
홧팅 @0@/~~
커억... 지난번에 DSP 보드는 Big Endian에 Word Addressing을 지원하는 칩이었는
데, 이번놈은 상당히 재밌다. 그냥 PC같은 Little Endian에 Byte Addressing을 지원
하고, 더 충격적인것은 long이 8byte라는 것이다. ㅡㅠㅡ;;; 쿨럭..
같은 dsp인데 일케 다를수가... 가장 충격적인것은....
이놈이 달고있는 ADC가 8khz짜리라는 것이고, 11khz까지 된다고는 되어있으나,
지금 보드 문서를 뒤지고 있는데, Clock Generator를 건드릴 방법이 없다는...
컥.. 이놈은 전화기쪽하고 관계된 일을 하는 놈인가?? ㅡ0ㅜ/~~
완전 음질이 전화기 음질, 그리고 잭은 스테레오 잭이지만, 출력 아웃풋은 모노인거
같은데, 모노를 그냥 스테레오 잭에 실어서 날리는거 같다.
아아~ 몬산다 몬살아... 소스도 손봐야 되고, Sample rate도 변환을 해줘야 할꺼 같다.
험난한 길이군.. ㅡ0ㅠ/~~
컥... 이런 이런... 같은 TI에서 나온 DSP인데... Endian이 모델마다 틀리게 설정되서
나오는 낭패를.. ㅡ_ㅡ;;; 얼마전까지 하던 DSP는 Big Endian이었는데, 이제는 Little
Endian으로.. ㅡㅠㅡ;;;; 크음.. 일단 걍 어디 하드웨어적인 셋팅으로 다시 Big Endian
으로 수정할 수 있는가 확인을 해봐야겠다. 소스를 수정할려니 좀 귀찮아야지 >_<
여튼 희한하군 @0@/~~
으으.. 오늘 또 실컷 코딩하고 Commit을 날렸는데, 얼래.. up-to-date에러가 난다. 당체 먼지.. ㅡ_ㅡ;;; 분명 내 Sandbox에 있는 놈은 최신판이고 소스는 나밖에 안건드리는데.. ㅡ_ㅡ;;

물론 소스를 Commit하기전에 백업했기땜시롱 크게 문제는 없는데, 자꾸 에라가 나는걸 보면 먼가 문제가 확실히 있는거 같다.

쩝쩝... 이를 어쩌징...아무래도 CVS 클라이언트가 버그가 있는거 같기도 하고, 내 사용법이 문제가 있는거 같기도 한데, 조심해서 쓰도록 해야겠다.

낼 가서 또 삽질을 해야겠군. 제길... ㅡ0ㅠ/~


ps) 흐흐 나중에 알고 봤더니 Sandbox의 파일들을 일정시간 이상 Update하지 않으면 나타나는 경고(?)같은 현상이었음.. ㅋㅋ
으으... 오늘도 안돌아가는 꼴통을 붙잡고 MP3관련 문서들을 죽어라 보고 있다. 그러나 오늘도 역시 처참한 패배.. ㅡ0ㅠ/~~ 당췌 잘 몰겄구만... 머 자꾸 여러문서를 뒤지다보니 깨닫는건 있지만...

그래도 아직 멀었다는 생각이 든다. 음성처리이론쪽으로 책을 한권 봐야 할듯도 하고... 혹시나 모를 다른 디코더 소스들도 뒤져서 어케 처리하는가 확인을 한번 해봐야 겠다.

정말 참.. 어렵구나.. 쩝쩝..
그래도 홧팅 @0@/~~
크윽.. 얼마전까지만해도 실수 연산 속도만 높이면 해결될꺼라고 생각했던 문제가, 오늘 적용해보니 문제 해결에는 크게 도움이 되지 못했다. 약간의 속도 향상은 있었지만, 워낙 Floating Point Unit을 가지고 있는 놈들에 비해서 실수 연산 속도가 차이가 나니까 커버가 영 어려웠다.

으음.. 방법이 없을까나... 선배가 웹을 뒤지던 중에 fixed Point DSP를 이용해서 Real Time MP3 Player를 구현했다는 중국인( 추측.. ㅡ0ㅡ;; ) 의 석사 논문을 구했는데, 이게 아주 예술이다. Decoding 하는데 사용하는 알고리즘을 수학적 기법을 용해서 좀더 나은 알고리즘으로 구현했다는거 같던데, 그걸 어셈코드로 작성을 했다고 나와있공.. ㅡ_ㅡ;;;;

난 수학적으로 풀어낼 능력도, 어셈코드를 작성할 능력도 아직 안되는데...
더욱 큰 문제는 소스가 없다는 것이다. 크헉.. 몬산다... ㅡ0ㅠ/~~
아아.. 어찌하란 말이냐아아아아...

정말 아찔하지 않을 수 없다.
에궁.. 갈길이 멀구나... 멀어.. ㅡ0ㅠ/~~
몇주째 계속 진행하고 있는 MP3의 디코딩이 역시 쉽지 않다. 오늘 시내에 갈일이 있어 교보문고에서 혹시나하며 책을 뒤지고 있었는데, MPEG에 대한 자료를 몇개 구할 수 있었다.

몇권을 뒤져본 결과 한권의 쓸만한 책을 찾았는데, MP3에 대한 간략한 설명만해놓아서, 크게 도움이 되지 않았다.

인터넷에서 자료를 찾을려고 했었는데, 내가 왜 책 생각을 못했을까...

이 기회에 책을 한권 사볼까나??
음.. 요즘 아는 선배가 내가 MP3 Decoder를 하는 사이 MP3 Encoder를 하게 되어서 같은 분야를 얼마동안 하게 되었다. 흠... 근데... 내가 Decoder할때 그렇게 찾아도 나오지 않던 자료들이... 선배는 쏙쏙 잘도 뽑아내는것이 아닌가?? @0@/~~
컥.. 이 무슨일인가.. 혹시나 내가 안가본 사이트인지 확인하니...

다 들렸던 곳이다.. ㅡ0ㅡ;;;;;;;;

머징... 근데 난 왜 자료를 못찾았을까나... 나의 검색능력은... 빵점이었던 것이다.
쿠.. 쿨럭;;;;;; ㅡ_ㅡ;;;;;;
근데 참 선배들도 대단하지... 어케 그 많은 문서중에 그런걸 찾아냈을까나...
역시.. 내공.. 200%군.. ㅋㅋㅋ
난 Decoder 소스도 x86껄 찾아서 포팅한다고 쌩쑈를 했는데... 소스도 보니까 있공...
컥.. >_<.... 머.. 그래도 포팅하면서.. DSP칩에 대해 먼가 좀 알긴했지만...
삽질했다는 것 만큼은 변함이 없네. 음냥...

네트워크의 시대

지금 우리에게 가장 중요한건 원하는 자료를 얼마나 빨리 찾아내는것이 아닐까하는 생각이 든다.

여튼 홧팅이다. @0@/~~~

요즘 회사일때문에 한참 폭발코딩중이다. 그중에 하나가 스크립트 파일을 읽어서 조건에 맞는 어떤일을 해주는 스크립트 프로그램인데, 이게 아주 예술(??)이다.

학교를 얼마 다니지 못하고 일하러 끌려온(??) 나로서 오토마타니 컴파일러니.. 이런 것들에 대한 지식이 있을리 만무하다. ㅡ0ㅡ/~~ 그나마 예전에 x86 Assembler를 만든다고 책을 좀 봐놓은게 있어서 구현하는데 무리를 느끼는건 아니지만, 그래도 체
계적인 지식이 부족하다고 생각한다. (학교로 돌아가면 공부를 열심히 해야 겠군..)

그동안 회사에서 한 일들이 그렇게 복잡도를 요구하는것이 아니어서 시간에 쪼달릴 뿐 머리를 그렇게 많이 쓰게 만드는건 없었건만, 이건.. 아까 언급했듯.. 아주 예술이다.

내가 원체 프로그램 기능 추가하고 머하고 하는걸 싫어하기 때문에, 이번 프로젝트는 추가적인 기능을 하는 놈을 아예 스크립트로 빼버려서 텍스트만 밀어넣고 데이터만 몇개 주면 조건에 맞추어 추가적인 기능을 하는 놈을 실행해 버리는.. 그런 대찬 프로젝트를 계획했다.

한 3일해서 아래의 if/else if/else문을 약간의 문제를 남기로 처리하는데까지 구현을 했는데, 역시 머리가 윽시로 아프다. ㅡ0ㅠ/~~


 

if( ( ( NODEID == 1001 ) || ( NODEID == 1002 ) ) &amp;&amp; ( GROUPID == 1000 ) )
{
 if( ( NODEID == 1000 ) || ( GROUPID != 1000 ) )
 {
  if( NODEID == 1001 )
  {
   exec 1.exe;
  }
  else
  {
   exec 2.exe;
  }
  exec a.exe;
 }
 else if( GROUPID == 1000 )
 {
  exec b.exe;
 }
}
else if( ( GROUPID != 1000 ) &amp;&amp; ( ( NODEID &gt; 2000 ) &amp;&amp; ( NODEID &lt; 2002 ) )
{
 exec c.exe;
}
else if( GROUPID != 1000 )
{
 exec d.exe;
}
else
{
 exec e.exe;
}

exec f.exe;
kill PROCESSID;



음.. 적고나니 실제로 이것보다는 약간 더 복잡했던듯.. ㅡ_ㅡ;;;
사실 예전부터 이런걸 한번 해보고 싶었는데, 이번에 새로 프로젝트를 진행하게되어 한번 해볼 수 있었다.

역시나 복잡하군.. ㅡ_ㅡ;;;
조 30줄도 안되는걸 처리할라고 내가 아는 모든 지식은 총동원되고, 아아 빡심...
나의 내공은 아직도 멀었나 보다.

쩝쩝.. 좀 한가해지면 x86Assembly나 빨리 완성해야 겠다.
그람 먼가 내공이 좀 올라가겠지. ㅋㅋㅋ

어제 드뎌 Assembly를 함 해보겠다고 assembly function을 만들어 Call을 했는데, 머 복잡한 루틴은 아니고, 그냥 간단히 word를 dword로 변환시켜 리턴하는 그런함수였다.

이걸 루프에서 주기적으로 call해서 clock을 측정해 보려는 용도였는데, 얼래...
굉장히 clock이 적게 나왔다. ㅡ_ㅡ;;;;

Sum 한 결과도 이상하고 그래서 따라가보니, 얼래.. for문의 Exit를 비교하는 부분이 이상했다. 분명 종료조건이 들어가있는 레지스터는 AC1인데, 비교하는건 T0와 비교하지 않는가?? ㅡ0ㅡ/~~

커헉... 내가 만든 Assembly function을 Call하지 않으면 멀쩡하고... 쩝쩝...초반부터 기선 제압을 당하는거 같다.
어디 두고보자 @0@/~~
앗쌀~~ 오늘 Assembly에 대해서 나와있는 책을 구했다.
ㅎㅎㅎ 이제 열심히 삽질하는 길만 남았군. @0@/~~
에궁.. 역시 세상에 쉬운일은 없는거 같다.
쿨럭..;;; ㅡ0ㅠ/~~

+ Recent posts