Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Аномальное поведение переменной в Си (STM32F4)

Непрочитано 26.01.2013, 00:58  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Аномальное поведение переменной в Си (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 код:
FrameHeader fh; 
Далее присваивается
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.
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 72
Размер:	106.4 Кб
ID:	42724

Далее идет самое интересное. В одной из функций объявляется небольшой массив
PHP код:
int cbMax[3]; 
и компилятор почему то решает разместить последний элемент массива cbMax по адресу указателя fh-›sfBand
Нажмите на изображение для увеличения
Название: 2.jpg
Просмотров: 62
Размер:	89.9 Кб
ID:	42725

И когда выполняется присваивание
PHP код:
cbMax[2] = 0; 
Слетает указатель на таблицу sfBandTable
Нажмите на изображение для увеличения
Название: 3.jpg
Просмотров: 58
Размер:	91.1 Кб
ID:	42726

Подскажите что копать. До функции где объявлен массив cbMax выполняется куча кода, создается и уничтожается куча переменных, но и именно в этой функции всегда возникает проблема.
Реклама:

Последний раз редактировалось Flopix; 26.01.2013 в 01:17.
Flopix вне форума  
Непрочитано 26.01.2013, 01:06  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Попробовал перед массивом int cbMax[3]; объявить еще один другого размера int test1[5]; для теста и опять именно последний элемент уже нового массива налез на ячейку где сохранен указатель в моей структуре на таблицу в памяти. Прямо мистика какая то.
Миниатюры:
Нажмите на изображение для увеличения
Название: 4.jpg
Просмотров: 54
Размер:	88.0 Кб
ID:	42727  

Последний раз редактировалось Flopix; 26.01.2013 в 01:27.
Flopix вне форума  
Непрочитано 26.01.2013, 08:05  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Значит, в массиве объявлено на 1 байт меньше, чем он реально занимает
niXto вне форума  
Непрочитано 26.01.2013, 09:36  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Портится не элемент массива, а указатель на него в переменной содержавшей структуру FrameHeader const SFBandTable *sfBand;. Именно в адрес где находится значение указателя происходит запись посторонней информации.
Flopix вне форума  
Непрочитано 26.01.2013, 15:00  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Вот из первого примера: начало структуры fh имеет адрес 200122E8 , а начало массива cbMax 20012314. Если посчитать длину структуры и добавить к начальному адресу, то получится, что весь массив cbMax лежит внутри структуры. Почему-то компилятор перекрывает данные при размещении в памяти ...
Yurkin2007 вне форума  
Непрочитано 26.01.2013, 17:04  
vdlab
Гражданин KAZUS.RUN
 
Аватар для vdlab
 
Регистрация: 17.07.2006
Адрес: PV.DP.UA
Сообщений: 620
Сказал спасибо: 3
Сказали Спасибо 60 раз(а) в 48 сообщении(ях)
vdlab на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Случайно не этот проект ковыряете?
__________________
Если ты читаешь это - значит тебе нечем заняться...
vdlab вне форума  
Непрочитано 26.01.2013, 19:10  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Объявление внутри функции происходлит в стеке.
Эт что, стек на данные запрыгнул?
Мар не смотрели что там к чему.

И структура то не очень для 32 бит. char - где попало среди int.
А директивы __packed не видно.
Boba_spb вне форума  
Непрочитано 26.01.2013, 19:58  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Сообщение от vdlab Посмотреть сообщение
Случайно не этот проект ковыряете?
Не этот. Но этот тоже ковырял, он таже не работал. Хотя если заливал hex с того проекта все играло. Компилирую - зашиваю и критует. Видимо действительно ошибка в настройках размера и местоположения стэка.
Flopix вне форума  
Непрочитано 26.01.2013, 20:00  
Flopix
Гражданин KAZUS.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Сообщение от Yurkin2007 Посмотреть сообщение
Вот из первого примера: начало структуры fh имеет адрес 200122E8 , а начало массива cbMax 20012314. Если посчитать длину структуры и добавить к начальному адресу, то получится, что весь массив cbMax лежит внутри структуры. Почему-то компилятор перекрывает данные при размещении в памяти ...
Вот и я про это.
Flopix вне форума  
Непрочитано 26.01.2013, 20:16  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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, ещё раз внимательно пересчитайте размер массива в байтах и посчитайте количество объявленных байт.
omercury вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск ucLinux на STM32F4 k000858 Микроконтроллеры, АЦП, память и т.д 10 09.12.2013 14:51
Не стартует stm32f4 STM32F4 Песочница (вопросы новичков) 2 04.12.2012 22:46
Странное поведение щетки nikbob22 Электроника средств транспорта 52 18.11.2012 17:00
stm32f4, asm с чего начать? sosedi ARM 44 14.11.2012 16:52
ШИМ в STM32F4 sosedi Микроконтроллеры, АЦП, память и т.д 5 15.08.2012 12:20


Часовой пояс GMT +4, время: 11:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.