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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> расположить массив в памяти (Си)
Метценгерштейн
сообщение Aug 20 2014, 11:10
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



есть большой массив- миллион значений uint32_t
при его объявлении выскакивает ошибка. Вероятно, массивы на стеке выделяются?
Где про это почитать? Как правильно объявлять такие большие массивы?

миллион- может и много, но даже 10000 не хочет объявляться.
Go to the top of the page
 
+Quote Post
msalov
сообщение Aug 20 2014, 12:14
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Такие объёмы памяти на стеке не выделяются. Если это константы - добавьте ключевое слово const, если нет - выделяйте при помощи malloc/calloc.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 20 2014, 13:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Метценгерштейн @ Aug 20 2014, 15:10) *
есть большой массив- миллион значений uint32_t
при его объявлении выскакивает ошибка. Вероятно, массивы на стеке выделяются?
Где про это почитать? Как правильно объявлять такие большие массивы?

миллион- может и много, но даже 10000 не хочет объявляться.

Сами данные будут линейно в памяти располагаться?
Если да, то линкером выделяете эту область, чтобы ее компилятор не использовал, а в программе делаете указатель на нее
Если будет нужен конкретный элемент, то обращение типа
Код
uint32_t *dp;

dp = (uint32_t*)0xYYYYYYYY;

*(dp+x) = 0xZZZZZZZZ;


если нужно - добавить volatile
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 20 2014, 13:20
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(toweroff @ Aug 20 2014, 17:11) *
Сами данные будут линейно в памяти располагаться?
Если да, то линкером выделяете эту область, чтобы ее компилятор не использовал, а в программе делаете указатель на нее

ЗАчем все это ? Либо кучу сделать достаточного размера и привет malloc, либо сегмент .bss и просто объявить этот массив статически.


Цитата(Метценгерштейн @ Aug 20 2014, 15:10) *
есть большой массив- миллион значений uint32_t
при его объявлении выскакивает ошибка. Вероятно, массивы на стеке выделяются?
Где про это почитать? Как правильно объявлять такие большие массивы?

миллион- может и много, но даже 10000 не хочет объявляться.

Кто и какаую ошибку дает ? Какой компилятор-линкер использованы ? Сколько реально памяти в системе и как она разбита на секции ?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 20 2014, 14:42
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



немного не уточнил. Проект под STM32F4 IAR.
компилится нормально. Но, вывод по USB через VCP отваливается, как только массив больше 100. Просто ком порт не появляется в списке и все. Хотя, компиляция проходит. Причем без разницы- массив локальный или глобальный.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 20 2014, 14:57
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



То есть никаких ошибок линкера, на плате реально более 4 мегабайт памяти стоит ???? В ИАРе вроде используется .icf файлы (project-ooptions-linker-linker configuration file) - что в нем ? А если в General options на вкладке Stack-Heap поставите Heap такого большого размера и выделите память через malloc - что увидите ?

Насчет выделения.
void Foo()
{
char ar[10000]; // это на стеке
}
///////////////

char ar[10000]; // это глобально (или локально для файла с кваоификатором static) в сегмент .bss пойдет (в разных линкерах может называться иначе)
//code
///////////////
char *pAr = (char*) malloc (10000); // это в HEAP ляжет, по окончании использования делаем free (pAr);
Ну локальный массив на стеке в 40000 байт однозначно все отвалит и ляжем в hard fault, компилятор такое не проверяет. А вот глобальный массив он должен проверить на допустимость размера и линкер должен дать ошибку - мало памяти. Правда отвалится все если на стеке только если эта функция уже вызывалась... Мутно Вы как-то проблему описываете. Мне для начала интересно как к Ф4 столько памяти прицепить реальной..
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 20 2014, 16:52
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



про 4 гига я уже потом подумал wink.gif Но оно и в 1000 значений не работает. И да, скомпилилось как ни в чем ни бывало. Вот странно.
Буду пробовать советы.

Еще раз описание- задействован вывод printf в USB.
массив на 1000 int32_t компилится нормально, и на 10 000 тоже нормально. Но путем поиска выяснил, что работает только при значении массива не более 100.
Как не работает- в диспетчере устройств- порты СОМ- он просто там не появляется. Напомню, у меня VCP драйвер ои ST стоит.

ВРоде все описал.

DASM, за примеры спасибо, запомню где что.
toweroff, Ваш пример- как раз то, как библиотека STM32 регистры назначения обрабатывает- нашел сходство )
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Aug 21 2014, 12:01
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934



Массив с изменяемыми данными, или с константами? Насколько сильно отбирает ОЗУ остальная программа? Если добавить-убрать глобальных переменных, расположенных в ОЗУ, размер массива, с которого появляется ошибка, будет изменяться?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 21 2014, 18:51
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



массив заполняется результатом измерений- т.е. не константа.
Остальная программа- это работа с USB. Точно не знаю сколько. Тоже что-то ест.
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Aug 22 2014, 06:04
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934



А в прошивке используется выделение памяти на куче (операторы new, new[]), или всё статически на этапе компиляции задаётся?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 28 2014, 17:20
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



опять наступаю на подобные грабли.
принимаю данные в массив от визнета.
как только размер массива задаю >50, сразу что-то не так в исполнении программы. Хотя, компилится без проблем.
uint8_t recv_IP[500];
объявлен как глобальный.
Получается, что он в ОЗУ объявляется? Массив меньше 1 Кб. ОЗУ же 192 с чем-то Кб.
Почему так? Должно же нормально объявляться? ОЗУ ему достаточно ведь для размещения массива?
Go to the top of the page
 
+Quote Post
Dejmos
сообщение Aug 28 2014, 23:23
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 4-11-11
Из: Смоленск
Пользователь №: 68 137



А какой размер CSTACK в настройках стоит?


--------------------
* работаю так, что лошади оборачиваются *
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 29 2014, 09:44
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вроде вот- по умолчанию
http://c2n.me/iOOyiX

только не на стеке же должен был выделиться?
Go to the top of the page
 
+Quote Post
Dejmos
сообщение Aug 29 2014, 16:26
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 4-11-11
Из: Смоленск
Пользователь №: 68 137



Ну есть предположение что размера CSTACK не хватает, а т.к. его переполнение при работе не проверяется, то оно может портить память (было такое пару раз в IAR AVR).
Ну память явно чем-то портится, но вот чем? Можно для теста увеличить CSTACK раз в несколько и посмотреть что будет (хотя 0x2000 должно хватать, но мало ли). Если не оно, то значит портится в каком-то другом месте.


--------------------
* работаю так, что лошади оборачиваются *
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 29 2014, 17:21
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



0х2000- это 8 кб памяти.
Вопрос в другом- как ловить-то?
да и массив ведь не на стеке объявляется же
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 17:54
Рейтинг@Mail.ru


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