Перейти к содержанию
    

Массив данных большого размера

МК используется STM32F103 компилятор IAR.

 

Задача. Накапливать за секунду массив данных размером 16 Кбайт (u8 array[16384] )затем отправлять его к другому устройству. Массив объявляется глобально.

 

Столкнулся с такой проблемой, что при объявлении массива размером в 16 Кбайт перестают работать прерывания, при инициализации массива меньшего размера порядка 300 Байт ( u8 array[300] ) все работает как и задумано.

При компиляции IAR никаких ошибок не выдает.

 

Как правильно объявлять большой массив данных?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как обычно - u8 array[16384]

 

Отладчик есть? Гляньте, что не работает. Вероятно при работе с большим массивом у вас проявляется какой-то косяк в вашей логике...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отладчиком ничего не увидел. В main бегает по циклу опроса флагов.

Вышибает если просто в массив перезаписать один элемент в начале main и дальше этот массив нигде не трогать

тоесть:

 

u8 array[16384];

 

main{

array[0]=1;

 

.

.

.

.

while(1){

опрос флагов.

 

}

 

 

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отладчиком ничего не увидел. В main бегает по циклу опроса флагов.

 

Ну а теперь смотрите регистры прерываний, которые у вас должны срабатывать, NVIC и т.п.

 

ЗЫ массив, надеюсь, не на стеке?

 

ЗЫЫ Еще гляньте в map-файл, все ли у вас там хорошо? Может быть из-за ошибок в скрипте линкера этот массив накладывается на кучу или стек?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно не хватет места на стеке. Не обязательно этому массиву самому на стек налезать, достаточно, чтобы из-за резервирования места под массив остальные переменные сдвинулись и налезли на стек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Как правильно объявлять большой массив данных?

 

начните с того, что уберите лишний код. и создадите болванку которую заархивировав выложить тут. Иначе это всё гадание на кофейной гуще.

Имхо - методом отсекания Вы вычислите гораздо быстрее, чем гадать на форумах.

 

 

(круглый)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно не хватет места на стеке. Не обязательно этому массиву самому на стек налезать, достаточно, чтобы из-за резервирования места под массив остальные переменные сдвинулись и налезли на стек.

Может и вообще памяти не хватает в принципе. Линкеру-то можно указать любое количество памяти.

 

 

 

начните с того, что уберите лишний код. и создадите болванку которую заархивировав выложить тут. Иначе это всё гадание на кофейной гуще.

Имхо - методом отсекания Вы вычислите гораздо быстрее, чем гадать на форумах.

(круглый)

Начинать с рассмотрения MAP фала а не с суматошных созданий блованок и распросов на форумах

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ещё повезло, что сразу все заткнулось.

У меня был случай недавно, буквально на пару байт наползало и портило одну-две переменные. Вот чудес насмотрелся!

После этого решил всегда контролировать границу стека.

(как те вороны, что решили улететь :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь автор столкнулся с похожей проблемой:

http://catethysis.ru/memory_corrupting_error_finding/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...