Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: перезапуск программы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
Сергей Борщ
Цитата(prottoss @ Jan 19 2007, 11:36) *
НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти
prottoss
Цитата(Сергей Борщ @ Jan 19 2007, 16:57) *
Цитата(prottoss @ Jan 19 2007, 11:36) *

НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти
Вы сами то эти функции применяете в проектах? smile.gif
IgorKossak
Цитата(prottoss @ Jan 19 2007, 12:29) *
Цитата(Сергей Борщ @ Jan 19 2007, 16:57) *
Цитата(prottoss @ Jan 19 2007, 11:36) *

НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти
Вы сами то эти функции применяете в проектах? smile.gif

Я, например, применяю.
Работает.
Сергей Борщ
Цитата(prottoss @ Jan 19 2007, 12:29) *
Вы сами то эти функции применяете в проектах? smile.gif
На ARM - да, но там я пользую ++ и они "обернуты" в new и delete. В аврах - нет, не было необходимости. Когда для РС писал (еще под ДОСом) - тоже применял.
prottoss
Цитата(IgorKossak @ Jan 19 2007, 17:55) *
Цитата(prottoss @ Jan 19 2007, 12:29) *

Цитата(Сергей Борщ @ Jan 19 2007, 16:57) *
Цитата(prottoss @ Jan 19 2007, 11:36) *

НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти
Вы сами то эти функции применяете в проектах? smile.gif

Я, например, применяю.
Работает.
Интересно, что делает контроллер, когда узнает, указатель равен NULL??? наверное начинает истерично мигать лампочками smile.gif
zltigo
Цитата(prottoss @ Jan 18 2007, 19:39) *
а Вы о чем глаголите???

Я об ОБЩЕПРИНЯТОЙ терминологии идущей от Авторов языка.
IgorKossak
Цитата(prottoss @ Jan 19 2007, 13:12) *
Интересно, что делает контроллер, когда узнает, указатель равен NULL??? наверное начинает истерично мигать лампочками smile.gif

Равенство нулю указателя легко проверить и уж потом принять решение.
Как один из вариантов - вызвать функцию истеричного мигания лампочками.
prottoss
Цитата(zltigo @ Jan 19 2007, 19:42) *
Цитата(prottoss @ Jan 18 2007, 19:39) *

а Вы о чем глаголите???

Я об ОБЩЕПРИНЯТОЙ терминологии идущей от Авторов языка.
Хорошо, хорошо, признаю - я заблуждался
zltigo
Цитата(prottoss @ Jan 19 2007, 12:29) *
Вы сами то эти функции применяете в проектах? smile.gif

Нет ни одного проекта без менеджера памяти и соотвественно без функций использования оной.
Кроме всего прочего позволяет для отладочных целей просмотреть списки блоков, их владельцев и содержимое без сокровенных знаний почерпнутых из мапфайла конкретной сборки. Соответственно задачи тоже под контекст используют динамическое выделение памяти и расшаривание способствует солидной экономии ресурса.
SasaVitebsk
Prottoss последний мой проект целиком построен на динамической памяти. Именно AVR правда m640 (8к озу)

Фишка в том что программа в МК - это продолжение железа. И Вы и я это понимаем. NULL не может быть получен. Это говорит о том, что у Вас в проге что-то не верно. Если даже менеджер и не полный, значит вы сами должны контролировать.

Я работаю с данными типа файл. Этот файл приходит с PC. Внутри данных идут упорядоченные структуры. Они нескольких типов и разной длины. Длина файла не известна. Как можно с этим работать? Только куча и указатели. Причём Вы не поверите. Я сам не поверил. Удобно до безобразия. Наглядно и красиво. Вырву кусочек.

Код
  KomXx    = (struct AddrKomXx*) AdrActiveKom[i];            // Прочитать адрес текущей активной    команды
  if(KomXx->TimeStart>TekTime) continue;                // Если    не подошло время для исполнения    команды, то    пропустить данную команду
  switch (KomXx->Name) {
.........
  /* Команда "OUTG"    - "Вывод статической графики" */
  case 'G':
             KomG =    (struct    AddrKomG*) AdrActiveKom[i];    // Прочитать адрес текущей активной    команды
             KomG->TimeMashtabTek++;                    // Следующий такт
             if(KomG->TimeMashtabTek >=    KomG->TimeMashtab)// если    подошёл, то
               KomG->TimeMashtabTek=0;                    // иначе начать    заново
             OutPict(KomG->BegX,KomG->BegY,KomG->SizeX,KomG->SizeY,&KomG->Pict[0]);    // Вывести картинку
             if(KomG->TimeMashtabTek ==    0){                // если    подошёл, то
               KomG->TimeLife--;                        // Уменьшить время жизни
               KomG->BegX += KomG->VecX;                // Сместить    объект
               KomG->BegY += KomG->VecY;                // Сместить    объект
             }
             break;
  /* Команда "ANIMATE" - "Вывод    анимированной графики" */
  case 'M':
             KomM =    (struct    AddrKomM*) AdrActiveKom[i];    // Прочитать адрес текущей активной    команды
.....
SasaVitebsk
Цитата(Сергей Борщ @ Jan 19 2007, 13:06) *
Где там? В куче? Зарадибога. Заметьте, вы получили указатель не "на свободное место в куче", а на свободный участок указанного вами размера. В этот участок никто больше не залезет. Но и вы не имеете права лезть за границы этого участка.
Цитата(SasaVitebsk @ Jan 19 2007, 01:21) *

Не зная об этом я беру и выполняю операцию OW_free(). В результате происходит крах проги. Поэтому я и высказал сомнение о реальности.
Никакого краха. В кучу возвращается выделенный вам участок, на который указывал OW_Rom_Device. Остальные участки если и были выделены кому-то без вашего ведома продолжают существовать.


smile.gif Усложним задачу.

Давайте в цифрах. Для простоты начальный уровень 0. Потом я занял 100. Компилятор выделил 10.

Я освободил до нуля. И опять забрал кусок, на этот раз 200. И запортил его. Крах?


Я не говорю что так будет. Я говорю что это у меня не уложилось в голове, и поэтому я предположил что компилятор самостоятельно не имеет права использовать кучу. Что в принципе пишите и Вы.

Теперь ещё один момент. Конечно чисто теоретически поставленная мной задача(новая) вполне разрешима с хорошим менеджером кучи. Но мы то говорим о AVR.

Если брать например DELFI (C для PC я не пользую), то там я имею право например выделить память под A,B,C,D а потом освободить место из под B. Потом если я выделю память под переменную E, то я не знаю где её расположит менеджер кучи. Он может её расположить за D, а может (если размеры подойдут на место дырки cool.gif. Я не в праве гадать. Если эти переменные использовать правильно, то разницы ведь нет. А объём оставшейся свободной памяти я получаю исправно.

Но в IAR AVR под С такого нет! Я был удивлён. Процедурой free, я могу только освободить одну или несколько переменных от конца кучи. Я не могу освободить B! Могу только B,C,D. Да и занять я могу просто место, а не создать переменную. Вроде это есть в C++. Не знаю. Не работал ещё.

Но это реально указывает на то, что менеджер очень упрощённый. Что в принципе обосновано. Если для МК делать что-то мощнее, то это будет слабо востребовано.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.