|
расположить массив в памяти (Си) |
|
|
|
Aug 20 2014, 13:11
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 20 2014, 13:20
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Цитата(toweroff @ Aug 20 2014, 17:11)  Сами данные будут линейно в памяти располагаться? Если да, то линкером выделяете эту область, чтобы ее компилятор не использовал, а в программе делаете указатель на нее ЗАчем все это ? Либо кучу сделать достаточного размера и привет malloc, либо сегмент .bss и просто объявить этот массив статически. Цитата(Метценгерштейн @ Aug 20 2014, 15:10)  есть большой массив- миллион значений uint32_t при его объявлении выскакивает ошибка. Вероятно, массивы на стеке выделяются? Где про это почитать? Как правильно объявлять такие большие массивы?
миллион- может и много, но даже 10000 не хочет объявляться. Кто и какаую ошибку дает ? Какой компилятор-линкер использованы ? Сколько реально памяти в системе и как она разбита на секции ?
|
|
|
|
|
Aug 20 2014, 16:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
про 4 гига я уже потом подумал  Но оно и в 1000 значений не работает. И да, скомпилилось как ни в чем ни бывало. Вот странно. Буду пробовать советы. Еще раз описание- задействован вывод printf в USB. массив на 1000 int32_t компилится нормально, и на 10 000 тоже нормально. Но путем поиска выяснил, что работает только при значении массива не более 100. Как не работает- в диспетчере устройств- порты СОМ- он просто там не появляется. Напомню, у меня VCP драйвер ои ST стоит. ВРоде все описал. DASM, за примеры спасибо, запомню где что. toweroff, Ваш пример- как раз то, как библиотека STM32 регистры назначения обрабатывает- нашел сходство )
|
|
|
|
|
Aug 21 2014, 12:01
|
Участник

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

|
Массив с изменяемыми данными, или с константами? Насколько сильно отбирает ОЗУ остальная программа? Если добавить-убрать глобальных переменных, расположенных в ОЗУ, размер массива, с которого появляется ошибка, будет изменяться?
|
|
|
|
|
Aug 22 2014, 06:04
|
Участник

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

|
А в прошивке используется выделение памяти на куче (операторы new, new[]), или всё статически на этапе компиляции задаётся?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|