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

 
 
 
Reply to this topicStart new topic
> STM32F4, Объявление массива байт, Как сделать правильнее?
BlackOps
сообщение Jul 29 2013, 07:16
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



Мне нужен например массив ис 65 536 байт, когда я объявляю массив из более чем 256 байт, при его инициализации байты которые идут после 256-го равны нулю.
Переполнен я так понял стэк. В линкер скрипте пробовал увеличить размер стека (кстати там размер не 256 был), не помогло.

Пробовал объявить как:
static uint8_t iobuf[65536];

вне функции main(), тоже не помогло.

подскажите как правильнее поступить?

кстати, прикрепил линкер скрипт который использую если что.
Прикрепленные файлы
Прикрепленный файл  STM32F4xxxG_rom.zip ( 2.11 килобайт ) Кол-во скачиваний: 25
 


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 29 2013, 08:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



А сколько ОЗУ в вашем контроллере?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 29 2013, 08:56
Сообщение #3


Гуру
******

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



QUOTE (BlackOps @ Jul 29 2013, 09:16) *
Мне нужен например массив ис 65 536 байт, когда я объявляю массив из более чем 256 байт, при его инициализации байты которые идут после 256-го равны нулю.
Покажите инициализацию.
QUOTE (BlackOps @ Jul 29 2013, 09:16) *
Переполнен я так понял стэк. В линкер скрипте пробовал увеличить размер стека (кстати там размер не 256 был), не помогло.
По каким признакам вы так поняли? Я предпочитаю стек размещать в конце ОЗУ чтобы стек можг расти до тех пор, пока не займет все свободное ОЗУ.
QUOTE (BlackOps @ Jul 29 2013, 09:16) *
кстати, прикрепил линкер скрипт который использую если что.

Конструкция "} > ram AT > ram" бессмысленна. Типа "масло масляное", "эпопическая эпопея", "сенсорный датчик" и т.п. Достаточно просто "} > ram", но причина явно не здесь, а в инициализации.


--------------------
На любой вопрос даю любой ответ
"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
BlackOps
сообщение Jul 29 2013, 09:02
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



устройство: stm32f407vgt6

Цитата(Сергей Борщ @ Jul 29 2013, 13:56) *
Покажите инициализацию.


Код
for(j=0;j<=255;j++)
{
    iobuf[j]=0xcc;
}


только вместо 255 если например другое число побольше то все элементы заполняются только до индекса 255, остальные элементы массива 0.


Цитата(Сергей Борщ @ Jul 29 2013, 13:56) *
По каким признакам вы так поняли? Я предпочитаю стек размещать в конце ОЗУ чтобы стек можг расти до тех пор, пока не займет все свободное ОЗУ.

а не могли бы подсказать где найти нормальный стандартный линкер скрипт? Или если можно поделится?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jul 29 2013, 09:12
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(BlackOps @ Jul 29 2013, 12:02) *
Код
for(j=0;j<=255;j++)
{
    iobuf[j]=0xcc;
}

А тип j у вас случаем не восьмибитный? sm.gif
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jul 29 2013, 09:13
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



Цитата(=F8= @ Jul 29 2013, 14:12) *
А тип j у вас случаем не восьмибитный? sm.gif

uint32_t j = 0;



--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
KSN
сообщение Jul 29 2013, 10:00
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Из приведенного кода следует, что элементам с 0 по 255 присваивается значение 0xCC, а элементам выше 255 (256, 257....) будет присвоено 0x00, т.к. у автора с большой долей вероятности массив объявлен без спецификатора __no_init, он не размещен в области памяти, которую НЕ надо инициализировать.
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jul 29 2013, 10:04
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



А как вы определяете, что не весь массив заполнен? Если через отладтчик, то может это косяк отладчика?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 29 2013, 10:10
Сообщение #9


Гуру
******

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



QUOTE (BlackOps @ Jul 29 2013, 11:02) *
только вместо 255 если например другое число побольше то все элементы заполняются только до индекса 255, остальные элементы массива 0.
Но чудес ведь не бывает? Выкидывайте из проекта все лишенее вплоть до одного этого цикла инициализации и выложите .lss и .map
QUOTE (BlackOps @ Jul 29 2013, 11:02) *
а не могли бы подсказать где найти нормальный стандартный линкер скрипт? Или если можно поделится?
Да его каждый пишет исходя из своих вкусов и задачи. Мой в целом похож на ваш, разве что стек размещается в конце ОЗУ:
CODE
/* higher address of the user mode stack */
PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) );

PROVIDE( _heap = _ebss );
PROVIDE ( _eheap = ALIGN(_estack - _Minimum_Stack_Size - 8 ,8) );



QUOTE (Flexz @ Jul 29 2013, 12:04) *
Если через отладтчик, то может это косяк отладчика?
Кстати, да. Попробуйте прочитать отладчиком дамп области памяти по адресам этого массива.


--------------------
На любой вопрос даю любой ответ
"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
=F8=
сообщение Jul 29 2013, 11:11
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Попробуйте инициализировать через memset, оно конечно разницы не должно быть никакой но если будет...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jul 30 2013, 16:04
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



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


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post

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

 


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


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