реклама на сайте
подробности

 
 
> Аномальное поведение переменной в Си (STM32F4)
flopix
сообщение Jan 25 2013, 21:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 21-06-12
Пользователь №: 72 429



Разбираюсь с программным декодером 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]; для теста и опять именно последний элемент уже нового массива налез на ячейку где сохранен указатель в моей структуре на таблицу в памяти. Прямо мистика какая то. sm.gif
Прикрепленное изображение


Сообщение отредактировал flopix - Jan 25 2013, 21:15
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.02135 секунд с 7
ELECTRONIX ©2004-2016