Easyelectronics.ru

Электроника для всех
Текущее время: 26 май 2017, 18:00

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



    • Изготовление печатных плат. Примерные цены: 10 штук 2-слоя 100*100mm 8.21$ или около ~470 рублей
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

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

Зарегистрирован: 31 янв 2017, 16:58
Сообщения: 29
Откуда: Александров
Ситуация следующая: Есть микроконтроллер 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
Сообщения: 2052
Откуда: Санкт-Петербург
Не знаю, как конкретно тут, но вообще бывает, что ограничено место, отведённое именно под стек.
Пробы ради объявите Conf_Menu_Array как static.

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


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

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3963
а в каком это языке мира можно массив выделять так?
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
Сообщения: 29
Откуда: Александров
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
Сообщения: 783
да памяти может быть хоть 64Gb, но вы создаете на стеке.
Смотрите какой размер выделен под него и где он находится.
Либо создавайте его при компиляции, либо используйте диспетчер памяти если хотите динамически.
А можно код посмотреть всегда сгенерированный в отладчике.
В общем 100500 способ проверить.
Ну и конечно книжки почитать можно.


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

Зарегистрирован: 31 янв 2017, 16:58
Сообщения: 29
Откуда: Александров
Решил проблему, оказывается ларчик просто открывается - стэк по умолчанию был 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
Сообщения: 783
Есть другие изящные методы.
Заодно делать сколько нужно, а не использовать свои телепатические способности.
Но это когда память будет заканчиваться, тогда новый топик появиться.


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

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


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

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

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


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

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

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


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


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

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

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


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

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


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


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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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