Easyelectronics.ru
http://forum.easyelectronics.ru/

Создание массива в оперативной памяти микроконтроллера
http://forum.easyelectronics.ru/viewtopic.php?f=56&t=30733
Страница 1 из 1

Автор:  with [ 22 фев 2017, 22:00 ]
Заголовок сообщения:  Создание массива в оперативной памяти микроконтроллера

Ситуация следующая: Есть микроконтроллер STM32F103VE и к нему подключен дисплей 128 на 64 точек. Картинки для дисплея представляют из себя одномерные массивы, заранее определенные в пзу. На экран картинки из пзу выводятся без проблем.
При попытке создать в теле какого-то метода временный массив, проинициализировать его и вывести на экран - проц виснет.
пример:
Show


В методе ConfigItemFunc создается массив Conf_Menu_Array[], который по задумке должен стать видео-буффером. Первые четыре элемента массива резервируются под размерность массива сопряженную с размерностью используемого дисплея ( 16 байт на строку * 64 строки ). Далее после создания массива, в методе Clear_Array происходит обнуление элементов нового массива.
Все бы хорошо .. однако обнулить больше чем 866 ячеек Conf_Menu_Array[] не получается, виснет проц. Похоже на то что происходит "переполнение стэка или памяти" - хотя причин на это я не вижу, потому как в используемом проце 64КБ ОЗУ, и это куда больше чем нужно под временно созданный массив.
Первый вопрос - корректно ли я создаю массив в теле метода ConfigItemFunc ?
Второй вопрос - кто и как решает проблемы видеобуффера в рамках внутренней ОЗУ проца ?

Автор:  aamonster [ 22 фев 2017, 22:10 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

Не знаю, как конкретно тут, но вообще бывает, что ограничено место, отведённое именно под стек.
Пробы ради объявите Conf_Menu_Array как static.

(другие возможности обдумывать лень, т.к. рефлексы требуют вначале поправить код для лучшей читаемости)

Автор:  Ink [ 22 фев 2017, 22:26 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

а в каком это языке мира можно массив выделять так?
with писал(а):
Код:
   LocalTemp = (((Display_x_Area/8)*NewArrayRows) + offset_graph_data); // calculate array length
   unsigned char Conf_Menu_Array[LocalTemp];

компилятор не выдал даже варнинга?

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

Автор:  with [ 22 фев 2017, 22:31 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

Ink писал(а):
а в каком это языке мира можно массив выделять так?
with писал(а):
Код:
   LocalTemp = (((Display_x_Area/8)*NewArrayRows) + offset_graph_data); // calculate array length
   unsigned char Conf_Menu_Array[LocalTemp];

компилятор не выдал даже варнинга?

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


Компилятор молчит, пишу в коксе. C++
Сейчас перепишу функцию в более простой вид, чтоб лучше "читалось".

Show


Убрал из кода все лишнее, оставил основу.
ОЗУ в моем контроллере 64КБ, я создаю массив Conf_Menu_Array всего на 1КБ, по идее все должно работать как часики. Однако увы. . и ах.
Какие могут быть подводные камни при создании подобным образом массивов ?

Автор:  x893 [ 22 фев 2017, 22:50 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

да памяти может быть хоть 64Gb, но вы создаете на стеке.
Смотрите какой размер выделен под него и где он находится.
Либо создавайте его при компиляции, либо используйте диспетчер памяти если хотите динамически.
А можно код посмотреть всегда сгенерированный в отладчике.
В общем 100500 способ проверить.
Ну и конечно книжки почитать можно.

Автор:  with [ 23 фев 2017, 00:00 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

Решил проблему, оказывается ларчик просто открывается - стэк по умолчанию был 0x100; .. и получалось что у меня переполнялся стэк и заходил на територию кучи ... ну и все висло.
Увеличил стэк - и прога запела словно соловей!
На всяк случай как решил ( может кому будет в помощь )
Размер стэка задается в файле startup_stm32f10x_hd.c , строчкой :
Код:
#define STACK_SIZE       0x00000100      /*!< The Stack size suggest using even number     */

По умолчанию стоит 100 hex.
Поднимаем на сколько нужно.

Автор:  x893 [ 23 фев 2017, 00:38 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

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

Автор:  Faberge [ 23 фев 2017, 19:21 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

Зачем вы стек для этого используете? Не лучше ли хранить ваши картинки временно в куче?

Автор:  bw429 [ 23 фев 2017, 21:45 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

Faberge писал(а):
Зачем вы стек для этого используете? Не лучше ли хранить ваши картинки временно в куче?

Картинки хранятся в пзу, а автор темы создает в стеке видео буфер, как я понял.
Как мне кажется, для этого гораздо удобнее вообще создать глобальный массив?

Автор:  Faberge [ 23 фев 2017, 23:27 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

bw429 писал(а):
Faberge писал(а):
Зачем вы стек для этого используете? Не лучше ли хранить ваши картинки временно в куче?

Картинки хранятся в пзу, а автор темы создает в стеке видео буфер, как я понял.
Как мне кажется, для этого гораздо удобнее вообще создать глобальный массив?


Ну я и предлагал, хранить в ОЗУ только временно, считал из ПЗУ, потом залил, когда удобнее. Я просто не понимаю, что тут может дать использование стека?

Автор:  aamonster [ 23 фев 2017, 23:42 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

Понятно, что в стеке не принято хранить что-то жирное. Но куча - опасная штука, она склонна к фрагментации. В embed я бы скорей постарался обойтись статическими массивами, или сделал бы свой пул памяти (опять же на основе статического массива).

Хотя для какой-то задачи и правда может оказаться проще увеличить стек... Но для видеобуфера - вряд ли.

Автор:  with [ 20 мар 2017, 20:32 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

Faberge писал(а):
Зачем вы стек для этого используете? Не лучше ли хранить ваши картинки временно в куче?


В стеке видео-буфер, размер буфера взял 4 экрана, соответственно в буфере происходит наложение разных картинок (сплайнов) . Сами картинки в виде массивов пока держу в ПЗУ, экран небольшой и монохромный .. так что это позволительно в данном случае.
Пока что вся прога представляет из себя древовидный связанный список - операционка в зародыше, возможно позже попробую переползти на нормальную операционку, посмотрим.

Автор:  Steel.ne [ 21 мар 2017, 00:02 ]
Заголовок сообщения:  Re: Создание массива в оперативной памяти микроконтроллера

aamonster писал(а):
В embed я бы скорей постарался обойтись статическими массивами, или сделал бы свой пул памяти (опять же на основе статического массива).

И получаем в каждой либе свой менеджер памяти. Взял в проект stEmWin, FreeRTOS, lwIP - минимум три, блин, менеджера. Каждому статически нарежь и выдай.

Страница 1 из 1 Часовой пояс: UTC + 5 часов
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/