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

 
 
> Аномальное поведение переменной в Си (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
 
Start new topic
Ответов
Golikov A.
сообщение Jan 26 2013, 09:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Привет!

недавно мучился с дебугером каила микровижен 4. Так вот обнаружил крайне неправильное отображение данных. Некорректно отображаются локальные массивы, созданные внутри функции. И переменные после вызова функций.

выглядит это так.
передаем в функцию указатель на массив. Внутри функции указатель меня адрес (что очень странно), по новому адресу заполняются данные верные, по старому ничего нет, выходя из функции, данных нет не там не там. По старому адресу нули или мусор, или часть данных. Но если данные присваивать и сравнивать все работает правильно.

То есть это именно глюк отображения значения переменных кеилом при дебуге. По стилю разработки редко пользуюсь внутрисхемными отладчиками, но тут мне так нахваливали удобство что поддался, час втыкал где могла быть ошибка с указателями и что я не так написал. А потом понял ошибка отображения...

Решается так, если очень надо знать значения.
1. надо создать локальную переменную не массив и присвоить ей значения одного элемента, тогда его значение будет отображено корректно
2. можно создать глобальный массив, и его заполнять или использовать, тогда опять же отображение будет корректно.
3. создать указатель на массив, присвоить ему значение указывающие на начало массива, тогда поэлементно можно будет просмотреть весь массив

все прочие способы договорится с дебугером - минное поле, то сработают то нет. Может у вас происходит та же хрень? то есть просто глюк отображения?


По поводу -> и . По идее стрелка должна работать только с указателями на структуру. Но с другой стороны имя структуры является указателем на нее, как имя массива чаров является чаровым указателем. Скорее всего кеил делает неявную подмену имени на указатель, и потому разрешает вызывать его по стрелке. Но строго говоря это не верно и может приводить к ошибкам.
Например кеил не имея явно описанного прототипа функции заменяет все типы переменных на инты, и вызывает крайне странные глюки работы функции. Потому в этом деле лучше перебдеть чем потом ловить ошибки.

А насчет того что там не может быть ошибок - наивно, очень много файлов в начале имеет десклаймер, где написано что предоставляются с целью ознакомления, клиентам для ускорения разработки, не могут использовать коммерчески, все проблемы по вине ошибок исходников не рассматриваются. Так что решайте сами...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 09:42
Рейтинг@Mail.ru


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