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

 
 
 
Reply to this topicStart new topic
> Массив данных большого размера
Muxamor
сообщение Feb 12 2016, 05:53
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 4-05-05
Из: Novosibirsk
Пользователь №: 4 722



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

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

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

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


--------------------
Бубен - однако штука шаманская!!!

Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Feb 12 2016, 07:16
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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

Отладчик есть? Гляньте, что не работает. Вероятно при работе с большим массивом у вас проявляется какой-то косяк в вашей логике...
Go to the top of the page
 
+Quote Post
Muxamor
сообщение Feb 12 2016, 07:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 4-05-05
Из: Novosibirsk
Пользователь №: 4 722



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

u8 array[16384];

main{
array[0]=1;

.
.
.
.
while(1){
опрос флагов.

}


}


--------------------
Бубен - однако штука шаманская!!!

Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Feb 12 2016, 07:44
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Muxamor @ Feb 12 2016, 10:29) *
Отладчиком ничего не увидел. В main бегает по циклу опроса флагов.


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

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

ЗЫЫ Еще гляньте в map-файл, все ли у вас там хорошо? Может быть из-за ошибок в скрипте линкера этот массив накладывается на кучу или стек?
Go to the top of the page
 
+Quote Post
Muxamor
сообщение Feb 12 2016, 07:53
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 4-05-05
Из: Novosibirsk
Пользователь №: 4 722



Ну если я правильно понимаю если глобально то не на стеке ?


--------------------
Бубен - однако штука шаманская!!!

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 12 2016, 09:33
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 12 2016, 09:33
Сообщение #7


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Muxamor @ Feb 12 2016, 08:53) *
...Как правильно объявлять большой массив данных?


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


(круглый)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 12 2016, 09:39
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Сергей Борщ @ Feb 12 2016, 11:33) *
Вероятно не хватет места на стеке. Не обязательно этому массиву самому на стек налезать, достаточно, чтобы из-за резервирования места под массив остальные переменные сдвинулись и налезли на стек.

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



QUOTE (kolobok0 @ Feb 12 2016, 11:33) *
начните с того, что уберите лишний код. и создадите болванку которую заархивировав выложить тут. Иначе это всё гадание на кофейной гуще.
Имхо - методом отсекания Вы вычислите гораздо быстрее, чем гадать на форумах.
(круглый)

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 12 2016, 10:03
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Это ещё повезло, что сразу все заткнулось.
У меня был случай недавно, буквально на пару байт наползало и портило одну-две переменные. Вот чудес насмотрелся!
После этого решил всегда контролировать границу стека.
(как те вороны, что решили улететь sm.gif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
silverio
сообщение Feb 12 2016, 11:12
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 14-06-09
Из: Киев
Пользователь №: 50 273



Здесь автор столкнулся с похожей проблемой:
http://catethysis.ru/memory_corrupting_error_finding/
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 06:46
Рейтинг@Mail.ru


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