|
|
  |
STM32F4, Объявление массива байт, Как сделать правильнее? |
|
|
|
Jul 29 2013, 07:16
|

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

|
Мне нужен например массив ис 65 536 байт, когда я объявляю массив из более чем 256 байт, при его инициализации байты которые идут после 256-го равны нулю. Переполнен я так понял стэк. В линкер скрипте пробовал увеличить размер стека (кстати там размер не 256 был), не помогло. Пробовал объявить как: static uint8_t iobuf[65536];вне функции main(), тоже не помогло. подскажите как правильнее поступить? кстати, прикрепил линкер скрипт который использую если что.
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Jul 29 2013, 08:56
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jul 29 2013, 09:02
|

Знающий
   
Группа: Свой
Сообщений: 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)  По каким признакам вы так поняли? Я предпочитаю стек размещать в конце ОЗУ чтобы стек можг расти до тех пор, пока не займет все свободное ОЗУ. а не могли бы подсказать где найти нормальный стандартный линкер скрипт? Или если можно поделится?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Jul 29 2013, 10:10
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|