Разбираюсь с программным декодером mp3 Helix, на отладке Stm32F4Discovery.
При попытке декодирования потока данных МК постоянно вылетает по HardwareException. Теcтирую в среде Keil через встроенный в макетку отладчик. Начал разбираться и появились некоторые вопросы.
В библиотеке есть структура
Код
typedef struct _FrameHeader {
MPEGVersion ver; /* version ID */
int layer; /* layer index (1, 2, or 3) */
int crc; /* CRC flag: 0 = disabled, 1 = enabled */
int brIdx; /* bitrate index (0 - 15) */
int srIdx; /* sample rate index (0 - 2) */
int paddingBit; /* padding flag: 0 = no padding, 1 = single pad byte */
int privateBit; /* unused */
StereoMode sMode; /* mono/stereo mode */
int modeExt; /* used to decipher joint stereo mode */
int copyFlag; /* copyright flag: 0 = no, 1 = yes */
int origFlag; /* original flag: 0 = copy, 1 = original */
int emphasis; /* deemphasis mode */
int CRCWord; /* CRC word (16 bits, 0 if crc not enabled) */
const SFBandTable *sfBand;
} FrameHeader;
В ней меня сейчас интересует объявление указателя const SFBandTable *sfBand;
где
Код
typedef struct _SFBandTable {
short l[23];
short s[14];
} SFBandTable;
Переменная объявлена глобально следующим образом:
Код
FrameHeader fh;
Далее присваивается
Код
fh->sfBand = &sfBandTable[0][0];
массив sfBandTable объявлен как константа
Код
const SFBandTable sfBandTable[3][3] = {
{
/* MPEG-1 (44, 48, 32 kHz) */
{
{ 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90,110,134,162,196,238,288,342,418,576 },
{ 0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84,106,136,192 }
},
......
после выполнения этой строки в отладчике видно что указатель установлен правильно, так как массив корректно заполнился значениями из таблицы SFBandTable.
Далее идет самое интересное. В одной из функций объявляется небольшой массив
[PHP]int cbMax[3];[/PHP]
и компилятор почему то решает разместить последний элемент массива cbMax по адресу указателя fh->sfBand
И когда выполняется присваивание
Код
cbMax[2] = 0;
Слетает указатель на таблицу sfBandTable
Подскажите что копать. До функции где объявлен массив cbMax выполняется куча кода, создается и уничтожается куча переменных, но и именно в этой функции всегда возникает проблема.
Попробовал перед массивом int cbMax[3]; объявить еще один другого размера
int test1[5]; для теста и опять именно последний элемент уже нового массива налез на ячейку где сохранен указатель в моей структуре на таблицу в памяти. Прямо мистика какая то.
Сообщение отредактировал flopix - Jan 25 2013, 21:15