Перейти к содержанию
    

Динамическое создание массивов и ошибки при работе с ними

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

кстати, решение проблемы нашел сам

Сам?

Значит, этого так таки и не читали:

Кстати о двойной буфферизации. А кто мешает второй буфер сделать статическим, если он уж очень нужен?

Похоже, что динамический массив в данной задачи на фиг не нужен,

Забудьте как страшный сон попытки использовать динамическое распределение памяти на таких контроллерах, это возможно только с памятью ~8Kб+ хотя я например и на 32Кб стараюсь все в статике распределить.

Если знаете что там всегда 5 байт, то выделите себе 5 байт статически.

мдя...

Таки гоните. Причём нагло.

 

Вопрос на счет "материализовался": почему когда создается куча то память отбирается у области ОЗУ где Hardware Stack а не, скажем, у Data Stack ? Почему так?

Так навскидку - в используемом Вами инструментарии где-то задан размер стека данных. Стек данных просто пошёл на правах статически выделенного массива, а стеку управления было отдано всё, что осталось. После выделения памяти для кучи осталось меньше. Т.е. стек управления просто получает то, что осталось от всех остальных.

 

Только вот думаю - был ли смысл отвечать, если аффтар "не читатель, а писатель"? И опять заявит, что

Жаль что тут никто реальным советом не помог.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только вот думаю - был ли смысл отвечать, если аффтар "не читатель, а писатель"?
Особенно понравилось у автора про аппаратную поддержку malloc() :01:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Аппаратный malloc - это гениальная идея не менее гениального автора. Успехов вам, дорогой товарищ!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На мой взгляд если говорить о динамической памяти, то она должна, как минимум поддерживать malloc/free.

Именно об этом мы и говорим. И я конкретно.

Только если мы говорим об AVR, то кроме этого практически ничего нет. То есть функциональность диспетчера нулевая. Если у меня будет "дырка", то он даже не вставит.

Именно по этому некоторые присутствующие писали свой диспетчер и приводили его фрагменты на форуме. Например, zltigo. Тоже себе ставлю такую задачу, но это длительная работа. Желательно оценить надёжность работы перед активным применением, а времени не хватает. :(

 

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

С точки зрения программы, если не один раз - то дальше без разницы - 2,3... Если речь о функциональности. А если о эффективности, - тогда дело другое.

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

 

Особенно очевидным, является применение динамики там, где размер объектов, помещаемых на кучу, имеет переменное значение.

 

Например станок с ЧПУ. Имеет 5 инструментов. Из внешнего источника подгружается прога с операциями. Операция может иметь много полей (одним сверлом - 10 отв). Я могу динамически размещать операцию и удалять по исполнению. А размещать для того, чтобы эффективней расчитать работу инструмента.

 

Как и любую задачу в программировании, эту можно решить десятком способов. С применением динамики и без оного. Как кому удобно. Но если есть данный инструмент, то почему им нельзя пользоваться? Даже если без этого можно обойтись?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Именно об этом мы и говорим. И я конкретно.

Только если мы говорим об AVR, то кроме этого практически ничего нет. То есть функциональность диспетчера нулевая. Если у меня будет "дырка", то он даже не вставит.

 

Вы для интереса почитайте про такой аллокатор TLSF (http://rtportal.upv.es/rtmalloc/). Там проблемы "дырок" во многом решены и работает он шустро и эффективно. Для AVR можете попробовать портировать. Он целиком на С.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Особенно очевидным, является применение динамики там, где размер объектов, помещаемых на кучу, имеет переменное значение.

Например станок с ЧПУ. Имеет 5 инструментов. Из внешнего источника подгружается прога с операциями. Операция может иметь много полей (одним сверлом - 10 отв). Я могу динамически размещать операцию и удалять по исполнению. А размещать для того, чтобы эффективней расчитать работу инструмента.

У Вас таки не динамическое распределение получается а нечто

очень похожее на оверлеи, а это совсем другая задачка и там все(ну почти все) можно заранее предусмотреть(в статике)

 

З.Ы. Собственно мое ИМХО заключается в том что это 2 совсем разные задачки

- распределение(и возврат) памяти(по требованию)

- распределение расположения данных в ранее распределенной памяти

 

и у каждого способа есть свои + и -

но для процов с маленькой памятью первого способа просто нет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но для процов с маленькой памятью первого способа просто нет...

 

Так про это самое все и говорят, что не фиг придумывать себе проблемы, там где их нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ReAl

гона тут не было. На тот момент времени проблема была решена размещением в ОЗУ "кучи". И имейте разницу понимать такие определения как "подсказка" и "решения". Подсказку дали, за что огромное спасибо, решение наковырял сам. Статический буферный массив был мной применем с самого начала но захотелось поэкспериментировать и для уменьшения используемой ОЗУ (так предполагалось) применить динамический - и цель создание темы - разобраться почему динамика не работала. Не высасывайте из пальца того, чего не было. Это нагло ;)

 

Сергей Борщ крутите пальцем в другом месте. Если Вы не заметили - то тут раздел называется В помощь начинающему а не Раздел для профессионалов/гуру.

 

Аппаратный malloc - это гениальная идея не менее гениального автора. Успехов вам, дорогой товарищ!

Спасибо!!! И предлагаю на этом закончить!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Что мне писать в каком разделе - позвольте я буду решать сам. Или вы хотите, чтобы в разделе для начинающих ответы писали только начинающие?

P.S. и постарайтесь не использовать дворовый жаргон. Тут это не принято.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На тот момент времени проблема была решена размещением в ОЗУ "кучи".
О! Так вот в чём была "ПРОБЛЕМА"!

Попытались жарить рыбу без рыбы, не вышло, народ повыяснял насчёт наличия рыбы (Вы сами не смогли проинтерпретировать выдачу используемого Вами компилятора)

А куча (heap) вообще-то существует? И размер ее?

Написано-же, что не существует, как класс:

Heap size: 0 byte(s)

и Вы таки догадались посмотреть, где у Вас рыбу берут.

 

И имейте разницу понимать такие определения как "подсказка" и "решения". Подсказку дали, за что огромное спасибо, решение наковырял сам.
"огромное спасибо" появилсь только сейчас, до этого было, как раз в ответ на выяснение наличия места под кучу:

Жаль что тут никто реальным советом не помог.

...

В своем компиляторе (CAVR) я ей (свалке) выделил 20 байт - и вуаля, всё заработало!!!

Кстати, что Вы понимаете под "реальным советом" и "решением"?

"подведи мышку к такому-то пункту меню, войди на такую-то страничку, в таком-то поле ввода набери число 20, нажми кнопку ОК"?

Так, во первых, это и невозможно было сказать, так как до этого Вы не удосужились указать какой у Вас инмтрумент.

А во вторых - это даже не "для начинающих", это в детсад.

Начинающему должно было хватить вопроса "а куча-то выделена?" - и хватило, не спорю, так не опускайте же сами себя до более низкого уровня!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас таки не динамическое распределение получается а нечто

очень похожее на оверлеи, а это совсем другая задачка и там все(ну почти все) можно заранее предусмотреть(в статике)

Нет ну вы не совсем меня поняли. Я применил слово "программа", в смысле программа для станка с ЧПУ. То есть там, к примеру, координаты отверстия занесены. Это я так условно задачу привёл.

Никто не будет в станок ЧПУ передавать прогу на AVR для запуска оверлея. :)

Это уж через чур.

З.Ы. Собственно мое ИМХО заключается в том что это 2 совсем разные задачки

- распределение(и возврат) памяти(по требованию)

- распределение расположения данных в ранее распределенной памяти

 

и у каждого способа есть свои + и -

но для процов с маленькой памятью первого способа просто нет...

Где граница "малой памяти"? В одном моём проекте на м640 используется куча 5.8 кб. И применить там другое решение даже себе не представляю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где граница "малой памяти"? В одном моём проекте на м640 используется куча 5.8 кб. И применить там другое решение даже себе не представляю.
Дык понятное дело - по задаче надо смотреть и головой думать. Вот выделение/освобождение буфера фиксированного размера из пула буферов, как тут сказано, было частью ОС iDCX-51, которая вообще в 192 байтах ОЗУ в i8044 жила.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык понятное дело - по задаче надо смотреть и головой думать.

+1 Можно все навороты свести к функциям memavail(), maxavail() и defrag(void **ptr, size_t size) и пущай в тексте будет явно указано, какие указатели подлежат "перетрахиванию", а какие и трогать не надо. И с ограничением времени исполнения сего действа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык понятное дело - по задаче надо смотреть и головой думать. Вот выделение/освобождение буфера фиксированного размера из пула буферов, как тут сказано, было частью ОС iDCX-51, которая вообще в 192 байтах ОЗУ в i8044 жила.

Вот о том и речь. Есть инструмент - можно им пользоваться. Но надо умело им пользоваться. И не фиг на зеркало пенять, когда рожа крива. (Это безотносительно к выступавшим)

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...