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

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

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

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

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

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


 
Опции темы
Непрочитано 26.01.2013, 00:58  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 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,  81216202430364452627490,110,134,162,196,238,288,342,418,576 },
            { 
0,  4,  81216223040526684,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.RU
 
Регистрация: 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.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Значит, в массиве объявлено на 1 байт меньше, чем он реально занимает
niXto вне форума  
Непрочитано 26.01.2013, 09:36  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 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,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

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

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

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

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

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

Сообщение от Yurkin2007 Посмотреть сообщение
Вот из первого примера: начало структуры fh имеет адрес 200122E8 , а начало массива cbMax 20012314. Если посчитать длину структуры и добавить к начальному адресу, то получится, что весь массив cbMax лежит внутри структуры. Почему-то компилятор перекрывает данные при размещении в памяти ...
Вот и я про это.
Flopix вне форума  
Непрочитано 26.01.2013, 20:16  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Аномальное поведение переменной в Си (STM32F4)

Сообщение от Flopix Посмотреть сообщение

PHP код:
const SFBandTable sfBandTable[3][3] = {
 {
 
/* MPEG-1 (44, 48, 32 kHz) */
 
{
 { 
0481216202430364452627490,110,134,162,196,238,288,342,418,576 },
 { 
0481216223040526684,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, время: 08:32.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot