[Speex-dev] ARM w/ assembly & fixed point crash

Zimman, Chris czimman at bloomberg.com
Wed Sep 29 07:54:36 PDT 2004


I've targeted Speex to run under eCos with Thumb interworking using
arm-elf-gcc 3.3.3

I'd written a small test case to verifiy the operation:

#include <speex/speex.h>

void
speex_test(void)
{
    SpeexBits bits;
    unsigned int frame_size;
    void *enc_state;
    float *speex_frame;
    cyg_uint64 t1, t2;
    int i;

    speex_frame = (float *)0x00030000;	/* Address of Speex data */

    speex_bits_init(&bits);

    printf("Initializing Speex encoder...");
    enc_state = speex_encoder_init(&speex_nb_mode);
    printf("done\n");

    printf("Retreiving frame size...");
    speex_encoder_ctl(enc_state, SPEEX_GET_FRAME_SIZE, &frame_size);
    printf("frame size is %d bytes\n", frame_size);
    
    printf("Encoding...\n");
    for(i = 0; i < 100; i++) {
	t1 = cyg_current_time();
	speex_encode(enc_state, speex_frame, &bits);
	t2 = cyg_current_time();
	speex_frame += (frame_size / sizeof(speex_frame));
	printf("Frame: %d (%lld ticks)\n", i, (t2 - t1));
    }
    printf("\n");

    speex_bits_destroy(&bits);
    speex_encoder_destroy(enc_state);

    return 0;
}

Compiling with -DFIXED_POINT, or -DFIXED_POINT/-DFIXED_ARM it works
totally fine (in ARM or Thumb mode).  Compiling with either of these and
-DARM_ASM seems to cause it to crash.

(gdb) where
#0  0x0004b324 in MULT16_16 (x=0, y=1310) at fixed_arm.h:57
#1  0x00044284 in nb_encode (state=0x86df8, vin=0x7f798, bits=0x7fce4)
at ../src/nb_celp.c:262
#2  0x00053b28 in speex_encode (state=0x86df8, in=0x30000, bits=0x7fce4)
at ../src/speex.c:104
#3  0x0004204c in speex_test (argc=0 '\0', argv=0x81e00) at speex.c:35
#4  0x000417c8 in shelltask (param=0x0) at shelltask.c:143
#5  0x000414a8 in shell (data=0) at shell.c:84

Has anyone else successfully used the ARM_ASM code?

Thanks

--Chris


More information about the Speex-dev mailing list