Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2017, 19:25

Часовой пояс: UTC + 5 часов



    • JLCPCB for PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 22 фев 2017, 22:00 
Заглядывает иногда

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 22 фев 2017, 22:10 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2189
Откуда: Санкт-Петербург
Не знаю, как конкретно тут, но вообще бывает, что ограничено место, отведённое именно под стек.
Пробы ради объявите Conf_Menu_Array как static.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 22 фев 2017, 22:26 
Старожил

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 22 фев 2017, 22:31 
Заглядывает иногда

Зарегистрирован: 31 янв 2017, 16:58
Сообщения: 41
Откуда: Александров
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КБ, по идее все должно работать как часики. Однако увы. . и ах.
Какие могут быть подводные камни при создании подобным образом массивов ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 22 фев 2017, 22:50 
Старожил
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 23 фев 2017, 00:00 
Заглядывает иногда

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 23 фев 2017, 00:38 
Старожил
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 23 фев 2017, 19:21 
Старожил
Аватара пользователя

Зарегистрирован: 19 фев 2015, 17:37
Сообщения: 938
Откуда: Void
Зачем вы стек для этого используете? Не лучше ли хранить ваши картинки временно в куче?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 23 фев 2017, 21:45 
Старожил

Зарегистрирован: 18 июл 2016, 21:17
Сообщения: 516
Faberge писал(а):
Зачем вы стек для этого используете? Не лучше ли хранить ваши картинки временно в куче?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 23 фев 2017, 23:27 
Старожил
Аватара пользователя

Зарегистрирован: 19 фев 2015, 17:37
Сообщения: 938
Откуда: Void
bw429 писал(а):
Faberge писал(а):
Зачем вы стек для этого используете? Не лучше ли хранить ваши картинки временно в куче?

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 23 фев 2017, 23:42 
Старожил

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 20 мар 2017, 20:32 
Заглядывает иногда

Зарегистрирован: 31 янв 2017, 16:58
Сообщения: 41
Откуда: Александров
Faberge писал(а):
Зачем вы стек для этого используете? Не лучше ли хранить ваши картинки временно в куче?


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание массива в оперативной памяти микроконтроллера
СообщениеДобавлено: 21 мар 2017, 00:02 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1531
Откуда: Киев
aamonster писал(а):
В embed я бы скорей постарался обойтись статическими массивами, или сделал бы свой пул памяти (опять же на основе статического массива).

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Yahoo [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB