26.01.2013, 00:58
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Аномальное поведение переменной в Си (STM32F4)
Разбираюсь с программным декодером mp3 Helix, на отладке Stm32F4Discovery.
При попытке декодирования потока данных МК постоянно вылетает по HardwareException. Теcтирую в среде Keil через встроенный в макетку отладчик. Начал разбираться и появились некоторые вопросы.
В библиотеке есть структура
PHP код:
|
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;
где
PHP код:
|
typedef struct _SFBandTable { short l[23]; short s[14]; } SFBandTable;
|
Переменная объявлена глобально следующим образом:
Далее присваивается
PHP код:
|
fh-›sfBand = &sfBandTable[0][0];
|
массив sfBandTable объявлен как константа
PHP код:
|
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.
Далее идет самое интересное. В одной из функций объявляется небольшой массив
и компилятор почему то решает разместить последний элемент массива cbMax по адресу указателя fh-›sfBand
И когда выполняется присваивание
Слетает указатель на таблицу sfBandTable
Подскажите что копать. До функции где объявлен массив cbMax выполняется куча кода, создается и уничтожается куча переменных, но и именно в этой функции всегда возникает проблема.
Последний раз редактировалось Flopix; 26.01.2013 в 01:17.
|
|
|
|
26.01.2013, 01:06
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Попробовал перед массивом int cbMax[3]; объявить еще один другого размера int test1[5]; для теста и опять именно последний элемент уже нового массива налез на ячейку где сохранен указатель в моей структуре на таблицу в памяти. Прямо мистика какая то.
Последний раз редактировалось Flopix; 26.01.2013 в 01:27.
|
|
|
|
26.01.2013, 08:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Значит, в массиве объявлено на 1 байт меньше, чем он реально занимает
|
|
|
|
26.01.2013, 09:36
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Портится не элемент массива, а указатель на него в переменной содержавшей структуру FrameHeader const SFBandTable *sfBand;. Именно в адрес где находится значение указателя происходит запись посторонней информации.
|
|
|
|
26.01.2013, 15:00
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Вот из первого примера: начало структуры fh имеет адрес 200122E8 , а начало массива cbMax 20012314. Если посчитать длину структуры и добавить к начальному адресу, то получится, что весь массив cbMax лежит внутри структуры. Почему-то компилятор перекрывает данные при размещении в памяти ...
|
|
|
|
26.01.2013, 17:04
|
|
Гражданин KAZUS.RU
Регистрация: 17.07.2006
Адрес: PV.DP.UA
Сообщений: 620
Сказал спасибо: 3
Сказали Спасибо 60 раз(а) в 48 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Случайно не этот проект ковыряете?
__________________
Если ты читаешь это - значит тебе нечем заняться...
|
|
|
|
26.01.2013, 19:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Объявление внутри функции происходлит в стеке.
Эт что, стек на данные запрыгнул?
Мар не смотрели что там к чему.
И структура то не очень для 32 бит. char - где попало среди int.
А директивы __packed не видно.
|
|
|
|
26.01.2013, 19:58
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Сообщение от vdlab
|
Случайно не этот проект ковыряете?
|
Не этот. Но этот тоже ковырял, он таже не работал. Хотя если заливал hex с того проекта все играло. Компилирую - зашиваю и критует. Видимо действительно ошибка в настройках размера и местоположения стэка.
|
|
|
|
26.01.2013, 20:00
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Сообщение от Yurkin2007
|
Вот из первого примера: начало структуры fh имеет адрес 200122E8 , а начало массива cbMax 20012314. Если посчитать длину структуры и добавить к начальному адресу, то получится, что весь массив cbMax лежит внутри структуры. Почему-то компилятор перекрывает данные при размещении в памяти ...
|
Вот и я про это.
|
|
|
|
26.01.2013, 20:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Аномальное поведение переменной в Си (STM32F4)
Сообщение от Flopix
|
PHP код:
|
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 }
},
......
|
|
Flopix, ещё раз внимательно пересчитайте размер массива в байтах и посчитайте количество объявленных байт.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:32.
|
|