winCE용 vector graphic Engine을 구성하는 중,,,


역시나 항상 나오는 호랭이~
Float 연산이 상당한 mips를 소비하고 있다.




다음과 같은 형식으로 기본 wave out format을

    WaveHeader.FormatTag = 1; // 1.WAVE_FORMAT_PCM 
    WaveHeader.NumChannels = num_channels;
    WaveHeader.SampleRate = GetSampleRate ();
    WaveHeader.BlockAlign = num_channels * bps;
    WaveHeader.BytesPerSecond = SampleRate * BlockAlign;
    WaveHeader.BitsPerSample = GetBitsPerSample ();

CE쪽에서는 block align과 bytes per second 순서가 살짝 다르다.
Linux 에서와의 달리 WinCE의 wave out에는 상당한 제약이 있다.

1. channel 은 1CH, 2CH (mono/stereo)
2. Sample rate 은 8.0khz, 11.025khz, 22.05khz, 44.1khz
3. Bit per sample 은 8bit와 16bit.

때문에 디코더를 셋팅에도 신경써야 하고,
해당 코덱을 이용해 오디오 파일을 디코딩하고 출력 시에
floating point 연산이 추가로 필요한 경우가 발생하기 때문에.. 
상당한 mips를 먹게된다.
(멀티 채널의 down mixing, sample rate 변환, bit per sample 변환 등.) 




거의 standard 한 건데 winCE 쪽에는 없어서 이런저런 놈들 포팅시에
한번 쯤은 걸린다.


static size_t strnlen (const char* string, size_t maxlen)
{
  size_t count = 0;
  for (; maxlen > 0 && *string != '\0'; maxlen--, string++)
  count++;
 
  return count;
}


프로젝트 내에서 arm asm을 사용해야 할 경우,
(코덱 같은 곳에서 빠른 연산을 위해 사용할 경우 사용.)
EVC를 위한 포맷 변경은 다음과 같다.

1. 프로젝트 설정
armasm.exe를 이용하여 빌드 하게 하기위해서
EVC에서 해당 sample.asm 또는 sample.S 파일을
우측마우스를 이용해 Settings를 연다.

Custom Build 탭에서
commands에 

armasm sample.S
추가하고

Outputs에

sample.obj
를 추가한다.

전체 project setting의 C/C++ -> Category Listing Files -> Listing file type을
Assembly with Source Code
로 설정해서
전체 빌드시에 asm이 포함 되도록 한다.

2. 소스 편집
arm 어셈 관련 헤더. 추가 

    INCLUDE kxarm.h
추가 

grobal 함수 선언

                                original CODE                                CODE for EVC
     .global         g_function_sample        EXPORT g_function_sample [FUNC]

코드에어리어 및 align관련 설정 추가
                                original CODE                                CODE for EVC
    .text
    .align  
    TEXTAREA
    ALIGN

코드 끝나는 부분에
    END
도 추가해 준다.

warning : A0063: missing END directive
* END가 빠진 경우 build에는 지장 없지만, warning이 뜬다.

함수 정의 변경
.function: <-- 이 형식이 허용되지 않는다.
앞에 . 도 붙일 수 없다.

error A0005: improper line syntax: .
function 또는 _function 으로 바꿔주자.

                                original CODE                                CODE for EVC
.function:   function  또는 _function 등등

각 주석 부분 수정
@ /* */ //  형식의 주석처리가 허용되지 않는다. 세미콜론(;)을 사용. (블럭단위 주석처리도 evc용이 따로 있긴 있을것이다..)

error A0005: improper line syntax: @

                                original CODE                                CODE for EVC
/* 주석  */
mov     r5, r0                  @ r5 = dpp  
;/* 주석  */
;mov     r5, r0                  @ r5 = dpp


+ Recent posts