реклама на сайте
подробности

 
 
> Динамическое создание массивов и ошибки при работе с ними, Косяк, но не понимаю почему
Halfback
сообщение Jun 7 2009, 12:12
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



Смысл в том, что данные приходящие по UART сбрасываю в буфер RS232_RX_BUFFER. Потом при его заполнении выставляю флаг. Главная программа если видит флаг, то создает динамический массив того же размера что и RS232_RX_BUFFER и начинает его декодировать. Зачем сделана двойная буферизация? - Отвечаю: так надо rolleyes.gif

В коде происходит так:
Код
uint8 *buf1;
.....

if(RS232_RX_BUFFER_OVERFLOW) {
            buf1 = (uint8*) malloc(RS232_RX_BUFFER_SIZE * sizeof(uint8)); // Сообразили 2-й буфер
            //if (buf==0) break; // Тут надо придумать обработчик если памяти на буфер не дали
            buf1 = (uint8*) memcpy((uint8*)buf1,(uint8*)RS232_RX_BUFFER,RS232_RX_BUFFER_SIZE);  
                        
            RS232_RX_BUFFER_OVERFLOW=0; // Обнулим флаг переполнения приемного буфера RS232
            RS232_RX_BUFFER_INDEX=0;
            if(UART_Decode_Package((uint8*)buf1,RS232_RX_BUFFER_SIZE)==0) RS232_TX_BUILD_MESSAGE_PACKAGE(30); // Пакет битый
            free(buf1);
            }


если же динамический массив не использовать то проверка на валидность пакета проходит без проблем. Вот так работает:
Код
if(RS232_RX_BUFFER_OVERFLOW) {                        
            if(UART_Decode_Package((uint8*)RS232_RX_BUFFER,RS232_RX_BUFFER_SIZE)==0) RS232_TX_BUILD_MESSAGE_PACKAGE(30);
            RS232_RX_BUFFER_OVERFLOW=0; // Обнулим флаг переполнения приемного буфера RS232
            RS232_RX_BUFFER_INDEX=0;
            }


Вот обработчик пакета:
Код
uint8 UART_Decode_Package(uint8 *rs232_rx_buf,uint8 Len) {
    uint16 crc16;    

    crc16 = (uint16) CRC16((uint8*) rs232_rx_buf,Len-2);  

    if (crc16!=((((uint16) rs232_rx_buf[Len-2])<<8) | rs232_rx_buf[Len-1])) { // Если пришёл битый пакет
        return 0; // Контрольная сумма не прошла
        }
    .......
    return 1;
    }


Вот считалка контрольной суммы. Функция - табличная.
Код

uint16 CRC16(uint8 *data, uint16 len) {
    uint16 crc = 0xFFFF;
    while (len--)
        crc = (crc << 8) ^ Crc16Table[(crc >> 8) ^ *data++];
    return crc;
    }


В общем если кто может сказать почему у меня возникли проблемы при обработки динамич. массивов - заранее огромное спасибо!!!

P.S. Контроллер: AT90USB162, у него RAM 512 байт.

Сообщение отредактировал Halfback - Jun 7 2009, 12:12
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 43)
sergeeff
сообщение Jun 7 2009, 12:46
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Складывается ощущение, что вы должны уложиться со всеми этими копированиями-декодированием за время от момента возникновения сигнала overflow до прихода следующего символа по rs232 (не так уж много). Это так, или com порт у вас с fifo? В любом случае попробуйте на время обработки буфера запретить прерывания и посмотреть, есть ли разница.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 7 2009, 13:35
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Halfback @ Jun 7 2009, 15:12) *
....у него RAM 512 байт.
......
//if (buf==0) break; // Тут надо придумать обработчик если памяти на буфер не дали

Когда придумаете smile.gif, тогда и пишите программы с менеджерами памяти для контроллеров с 512B
Заодно всякую ненужную галиматью типа buf1 = memcpy() уберите. Ну а дальше пойдут времена, правильная работа с флагами, критичесими секциями....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 7 2009, 14:25
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Кстати о двойной буфферизации. А кто мешает второй буфер сделать статическим, если он уж очень нужен?
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jun 7 2009, 15:30
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



sergeeff
Цитата
Складывается ощущение, что вы должны уложиться со всеми этими копированиями-декодированием за время от момента возникновения сигнала overflow до прихода следующего символа по rs232 (не так уж много).

Пакеты с ПК я выдаю вручную. Так что копирование-перекодирование успевает 100 пудов.

Тут явно проблема либо с нехваткой ОЗУ (которую я попытаюсь явно выявить) либо глупая ошибка при передачи массива по указателю в функцию.

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

Ничего не мешает. Причем опытные железячные программисты так и советуют сделать (в случае избежания случая если ОЗУ не хватит, а если делать статически - то компилятор хотя бы выдаст ошибку переполнения ОЗУ) - но тем не менее не понятно почему так происходит. Еще одна причина - у меня не только буфер по УАРТу но и по другим интерфейсам - поэтому в теле main была идея использовать один динамический массив чем несколько статических под каждый буфер.

zltigo
Цитата
Заодно всякую ненужную галиматью типа buf1 = memcpy() уберите.

Да, ну так расскажите где тут "галиматья"? Или знаете как по-другому и по-быстрее скопировать один массив в другой (при одинаковых размерах)?

Цитата
правильная работа с флагами

работаю последовательно. так что пальцы гните перед другими!

Сообщение отредактировал Halfback - Jun 7 2009, 15:40
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 7 2009, 15:47
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Halfback @ Jun 7 2009, 18:30) *
Да, ну так расскажите где тут "галиматья"?

Галиматья специально отцитирована "buf1 =" она и есть родная.
Цитата(Halfback @ Jun 7 2009, 18:30) *
работаю последовательно...

Да хоть зигзагами, только думать и обрабатывать ошибки возвращаемые malloc() по любому надо.
Цитата
..так что пальцы гните перед другими!

smile.gif smile.gif smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jun 7 2009, 16:15
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



zltigo
Цитата
обрабатывать ошибки возвращаемые malloc() по любому надо

согласен. но на тот момент обработчика не придумал.
malloc(), кстати, возращает одну ошибку - это 0.
щас напишу обработчик malloc() и посмотрю что он возвращает.

Дополнил код вот так:
Код
if(RS232_RX_BUFFER_OVERFLOW) {
            buf1 = (uint8*) malloc(RS232_RX_BUFFER_SIZE * sizeof(uint8)); // Сообразили 2-й буфер
            if(buf1==0) { // Тут надо придумать обработчик если памяти на буфер не дали
                RS232_TX_BUILD_MESSAGE_PACKAGE(99);
                }
            else {
                buf1 = (uint8*) memcpy((uint8*)buf1,(uint8*)RS232_RX_BUFFER,RS232_RX_BUFFER_SIZE);
                if(UART_Decode_Package((uint8*)buf1,RS232_RX_BUFFER_SIZE)==0) RS232_TX_BUILD_MESSAGE_PACKAGE(30);
                free(buf1);
                }                          
            RS232_RX_BUFFER_OVERFLOW=0; // Обнулим флаг переполнения приемного буфера RS232
            RS232_RX_BUFFER_INDEX=0;


По УАРТу когда отослал пакет в контроллер вернулся код 99. Т.е. malloc() память не выдел. wacko.gif При компиляции вот что выдается:
Bit variables area: 2h to 2h
Bit variables size: 1 byte(s)

Data Stack area: 100h to 17Fh
Data Stack size: 128 byte(s)
Estimated Data Stack usage: 42 byte(s)

RAM Global variables area: 180h to 1D4h
RAM Global variables size: 85 byte(s)

Hardware Stack area: 1D5h to 2FFh
Hardware Stack size: 299 byte(s)

Heap size: 0 byte(s)

EEPROM usage: 0 byte(s), 0,0% of EEPROM
Program size: 2927 words (5854 bytes), 35,7% of FLASH


Слабо вериться что в ОЗУ не нашлось куска в 10 байт. blink.gif

Сообщение отредактировал Halfback - Jun 7 2009, 16:16
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 7 2009, 16:21
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



А куча (heap) вообще-то существует? И размер ее?
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jun 7 2009, 16:29
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



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

не знаю что это такое но после компиляциии и линковки пишет что
Код
Heap size: 0 byte(s)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 7 2009, 16:42
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Halfback @ Jun 7 2009, 19:15) *
malloc(), кстати, возращает одну ошибку - это 0.

Вообще-то он возвращает NULL, что в 'C' (void *)0.
Цитата
щас напишу обработчик malloc() и посмотрю что он возвращает.

Это и так ясно было с самого начала.
Цитата
buf1 = (uint8*) memcpy((uint8*)buf1,(uint8*)RS232_RX_BUFFER,RS232_RX_BUFFER_SIZE);

Ну и зачм по прежнему болтается это присвоение buf1 sad.gif и ненужные письмена для явного преобразования buf1 и чего-то (зачем-то коcящего под макрос) к указателю на байт, хотя он buf1 сам по жизни такой, а аргументы memcpy() вообще универсальные void *

Цитата(sergeeff @ Jun 7 2009, 19:21) *
А куча (heap) вообще-то существует? И размер ее?

Написано-же, что не существует, как класс:
Цитата
Heap size: 0 byte(s)


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 7 2009, 16:52
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Раз не знаешь, что такое heap, не пользуйся функциями выделения/освобождения памяти или разберись с этим вопросом. Похоже, что динамический массив в данной задачи на фиг не нужен, как, впрочем, и двойная буферизация, особенно учитывая дефицит RAM.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 7 2009, 18:53
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sergeeff @ Jun 7 2009, 19:52) *
Раз не знаешь....

Ну все когда-то чего-то не знали... Динамическее выделение памяти во многих случаях весьма эффективно в том числе и для экономии памяти, однако делить остатки микроскопических 512 байт стандартым неуклюжим менеждером требующим и ресурсов и, что еще более неприятно, требующим явного резервировния хипа, сколее всего очень неудачная идея. При необдуманом использовании предстоит познакомится и со словом дефрагментация sad.gif. Для микроскопических контроллеров в большинстве проще и много эффективнее размещать (при необходимости) динамические объекты в стеке. Ну недостаток, конечно, отсутствие штатных средств конроля, но зато минимум накладных и равноправный доступ к столь ограниченным ресурсам, как память.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 7 2009, 19:39
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Что-то у меня про эффективность динамической памяти не сильно язык поворачивается так сказать. Я бы сказал, что это компромиссное решение, когда программных модулей много, а свободных ресурсов памяти - не очень. И как обычно бывает за такой компромисс приходится расплачиваться накладными расходами на резервирование/освобождение памяти и ее фрагментацию.
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jun 7 2009, 19:46
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



Жаль что тут никто реальным советом не помог. "Раз не знаешь - то мол не трогай" - это ко мне не относиться и к подобным высказываниям в свой адрес отношусь негативно т.к. не учился на домохозяку. А раз так то пришлось разобраться самому с этим heap.
Heap - как я понял почитав пару статей в инете - это и есть область памяти где работает malloc и смежные ей функции при динамическом распределении ОЗУ. Но чтобы было всё хорошо её надо определить в компоновщике. В своем компиляторе (CAVR) я ей (свалке) выделил 20 байт - и вуаля, всё заработало!!! malloc теперь NULL не возвращает. Другое мне не понятно - почему компилятор на счет примененного мной malloc() ничего не вякнул. unsure.gif

Код
Hardware Stack area: 1D5h to 2EBh
Hardware Stack size: 279 byte(s)

Heap area: 2ECh to 2FFh
Heap size: 20 byte(s)


Отсюда следует - что 20 байт компоновщик отнял от области памяти стека. ВОт это уже интересно!

Сообщение отредактировал Halfback - Jun 7 2009, 19:50
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 7 2009, 20:00
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Halfback @ Jun 7 2009, 22:46) *
Жаль что тут никто реальным советом не помог.

Вы так считаете sad.gif. Тогда Вы зря чрезмерно дистанциируетесь от домохозяйки smile.gif
Цитата
Heap - как я понял почитав пару статей в инете ....

smile.gif
Цитата
Другое мне не понятно - почему компилятор на счет примененного мной malloc() ничего не вякнул. unsure.gif

Потому, что Вы описали сегмент heap, хотя и нулевого размера. Уберите сегмент и будет вякать.
Цитата
Но чтобы было всё хорошо её надо определить в компоновщике.

Cюрприз, если, конечно не читали предыдущий пост. Впрочем, Вы можете и сами реализовать свой менеджер памяти сгладив особо мешающие Вам лично недостатки.
Цитата
Отсюда следует - что 20 байт компоновщик отнял от области памяти стека. ВОт это уже интересно!

А Вы полагали, что он материализует их из окружающего пространства smile.gif. 20 байтовый heap это точно профанация идеи, может создаваться ну разве только для нужд библиотечных функций типа time().


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 7 2009, 20:20
Сообщение #16


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Halfback @ Jun 7 2009, 16:12) *
то создает динамический массив того же размера что и RS232_RX_BUFFER и начинает его декодировать.P.S. Контроллер: AT90USB162, у него RAM 512 байт.
Забудьте как страшный сон попытки использовать динамическое распределение памяти на таких контроллерах,
это возможно только с памятью ~8Kб+ хотя я например и на 32Кб стараюсь все в статике распределить.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 7 2009, 20:50
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Jun 7 2009, 23:20) *
Забудьте как страшный сон попытки использовать динамическое распределение памяти на таких контроллерах,

Не стоит только этот один козий библиотечный malloc и встроенный heap ассоциировать со всем многообразием "динамического распределения" памяти.

Пусть есть некий пул состоящий из 5-ти буферов, объявленный статически:
TBUFFER pool[5];

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

надо только написать свои:
TBUFFER *pool_alloc();
pool_free( TBUFFER *);
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 8 2009, 06:03
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Совершенно никакой разницы нет в том, как именно вы собираетесь выделить память под heap. А автору топика, вместо того, чтобы "накатывать" на форумчан, что "мало" помогают, неплохо было бы разобраться в том, как современные с/с++ компиляторы распределяют сегменты RAM для различных типов данных. А heap на 20 байт - это полная и бессмысленная фигня. Вы прикиньте, сколько места сожрали программы для ее обслуживания.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 8 2009, 08:43
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(sergeeff @ Jun 8 2009, 09:03) *
А heap на 20 байт - это полная и бессмысленная фигня. Вы прикиньте, сколько места сожрали программы для ее обслуживания.

Кроме того, при использовании heap, у вас и озу было потрачено. При чём соотношение затрат к размеру кучи в % уже говорит в пользу отказа от такого подхода.
Даже в учебных целях, размер кучи (собственно выбор камня) неудачен.

В тоже время, это совершенно не значит, что для работы с динамической памятью нет места в однокристалках. Многие используют динамическую память. Есть кристаллы с 4/8/64к оперативки. Там это применимо. В одном случае я применял динамику в м88 (1к). Там, конечно, нет полной работы с кучей, а только выделение памяти и освобождение её всем куском, но всё-же.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 8 2009, 09:02
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(SasaVitebsk @ Jun 8 2009, 11:43) *
В одном случае я применял динамику в м88 (1к). Там, конечно, нет полной работы с кучей, а только выделение памяти и освобождение её всем куском, но всё-же.

Ну, тогда по большому счету и запись переменных в union тоже можно назвать динамическим ну если не распределением, то использованием памяти.
Флаги занятости добавить - и гордое слово "распределение". smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 8 2009, 15:32
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Dog Pawlowa @ Jun 8 2009, 12:02) *
Ну, тогда по большому счету ...

laughing.gif
Нет там было честное выделение памяти. Работа с датчиками 1-ware. При соединении - выделялась память для датчика и туда заносился номер его. А вот удаление не по штучно, "а разом" smile.gif
Ну так задача стояла. Никто по большому счёту не мешал и полному управлению с поштучным удалением и дефрагментацией. Не такие уж накладные расходы.

Например, по такому принципу, можно построить работу с таблетками или RFID картами.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 8 2009, 18:05
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



На мой взгляд если говорить о динамической памяти, то она должна, как минимум поддерживать malloc/free.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 8 2009, 18:38
Сообщение #23


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(sergeeff @ Jun 8 2009, 22:05) *
На мой взгляд если говорить о динамической памяти, то она должна, как минимум поддерживать malloc/free.

Я бы перефразировал это в что-нить типа:
... должна иметь эффективный алгоритм отведения/освобождения памяти для элементов РАЗНОГО размера.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 8 2009, 18:54
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Эффективность алгоритма - дело десятое. Важнее - функциональность. Тут коллеги приводят примеры, когда выделение/освобождение может вообще раз-другой и производится.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 8 2009, 19:15
Сообщение #25


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(sergeeff @ Jun 8 2009, 22:54) *
Эффективность алгоритма - дело десятое.

Под эффективностью я имел в виду не только скорость алгоритма но и то что под 5 байт не будет выделяться 100байт.
Такой "обобщенный" параметр сводящийся к общей эффективности решения.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jun 9 2009, 05:54
Сообщение #26


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Под эффективностью я имел в виду не только скорость алгоритма но и то что под 5 байт не будет выделяться 100байт.


Вообще-то эффективность менеджера памяти - понятие разностороннее. Например, у меня в последнее время хитрозадый менеджер сделан с точки зрения минимизации времени нахождения внутри критической секции. В двух словах - там кэш уже аллоцированных кусочков. Но, правда, это ведет к некоторому перерасходу по памяти. Зато критическая секция теперь представляет из себя просто запрещение прерываний на время удаления/добавления элемента в односвязный список, причем, в исключительно в начало. Типа такого:
Код
DISABLE_INTERRUPTS();
result=*top;
*top=result->next;
ENABLE_INTERRUPTS();

и
Код
DISABLE_INTERRUPTS();
chunk->next=*top;
*top=chunk;
ENABLE_INTERRUPTS();


А остальная обвязка выполняется в незаблокированном состоянии.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 9 2009, 13:30
Сообщение #27


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Jun 8 2009, 21:38) *
... должна иметь эффективный алгоритм отведения/освобождения памяти для элементов РАЗНОГО размера.

Я бы не стал перефразировать и конкретизировать.
Динамическое распределение, как было сказано, - это возможность захватить и освободить ресурс - alloc/free.
Размеры это уже дело десятое.

Цитата(singlskv @ Jun 8 2009, 22:15) *
Под эффективностью я имел в виду не только скорость алгоритма но и то что под 5 байт не будет выделяться 100байт.
Такой "обобщенный" параметр сводящийся к общей эффективности решения.

Если знаете что там всегда 5 байт, то выделите себе 5 байт статически.
А если не знаете сколько, то чем не устраивает брать по 100?
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jun 11 2009, 16:47
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



мда, как говориться - начали за здравие и заканчиваем - за упокой.
Не надо на меня наговаривать что мол "гоню по чём зря" - как всегда народ тут отвечает общими фразами не предлагая никаких конкретных мыслей. Причем сопровождая "пальцевращением" cool.gif

Поскольку malloc() аппаратно контроллером не поддерживается то создам статический буфер т.к. его размер и когда/кем будет использован знаю.
Вопрос на счет "материализовался": почему когда создается куча то память отбирается у области ОЗУ где Hardware Stack а не, скажем, у Data Stack ? Почему так?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 11 2009, 17:29
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Halfback @ Jun 11 2009, 19:47) *
мда, как говориться - начали за здравие и заканчиваем - за упокой.
Не надо на меня наговаривать что мол "гоню по чём зря" - как всегда народ тут отвечает общими фразами не предлагая никаких конкретных мыслей. Причем сопровождая "пальцевращением" cool.gif

Извиниться не хотите, перед теми, кто тратил на Вас свое время?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jun 11 2009, 17:37
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



zltigo мне не за что извиняться т.к. никого тут не оскорблял. и, кстати, решение проблемы нашел сам тогда как некоторые тут откровенно стебались и разводили демагогии.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 11 2009, 19:14
Сообщение #31


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Halfback @ Jun 11 2009, 19:47) *
Поскольку malloc() аппаратно контроллером не поддерживается то создам статический буфер т.к. его размер и когда/кем будет использован знаю.

Цитата(Halfback @ Jun 11 2009, 20:37) *
кстати, решение проблемы нашел сам

Сам?
Значит, этого так таки и не читали:
Цитата(sergeeff @ Jun 7 2009, 17:25) *
Кстати о двойной буфферизации. А кто мешает второй буфер сделать статическим, если он уж очень нужен?

Цитата(sergeeff @ Jun 7 2009, 19:52) *
Похоже, что динамический массив в данной задачи на фиг не нужен,

Цитата(singlskv @ Jun 7 2009, 23:20) *
Забудьте как страшный сон попытки использовать динамическое распределение памяти на таких контроллерах, это возможно только с памятью ~8Kб+ хотя я например и на 32Кб стараюсь все в статике распределить.

Цитата(defunct @ Jun 9 2009, 16:30) *
Если знаете что там всегда 5 байт, то выделите себе 5 байт статически.

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

Цитата(Halfback @ Jun 11 2009, 19:47) *
Вопрос на счет "материализовался": почему когда создается куча то память отбирается у области ОЗУ где Hardware Stack а не, скажем, у Data Stack ? Почему так?

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

Только вот думаю - был ли смысл отвечать, если аффтар "не читатель, а писатель"? И опять заявит, что
Цитата(Halfback @ Jun 7 2009, 22:46) *
Жаль что тут никто реальным советом не помог.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 11 2009, 20:08
Сообщение #32


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ReAl @ Jun 11 2009, 22:14) *
Только вот думаю - был ли смысл отвечать, если аффтар "не читатель, а писатель"?
Особенно понравилось у автора про аппаратную поддержку malloc() 01.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 11 2009, 20:50
Сообщение #33


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Аппаратный malloc - это гениальная идея не менее гениального автора. Успехов вам, дорогой товарищ!
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 11 2009, 20:50
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

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

Цитата( @ Jun 8 2009, 21:54) *
Эффективность алгоритма - дело десятое. Важнее - функциональность. Тут коллеги приводят примеры, когда выделение/освобождение может вообще раз-другой и производится.

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

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

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

Как и любую задачу в программировании, эту можно решить десятком способов. С применением динамики и без оного. Как кому удобно. Но если есть данный инструмент, то почему им нельзя пользоваться? Даже если без этого можно обойтись?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 11 2009, 20:59
Сообщение #35


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(SasaVitebsk @ Jun 11 2009, 23:50) *
Именно об этом мы и говорим. И я конкретно.
Только если мы говорим об AVR, то кроме этого практически ничего нет. То есть функциональность диспетчера нулевая. Если у меня будет "дырка", то он даже не вставит.


Вы для интереса почитайте про такой аллокатор TLSF (http://rtportal.upv.es/rtmalloc/). Там проблемы "дырок" во многом решены и работает он шустро и эффективно. Для AVR можете попробовать портировать. Он целиком на С.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 11 2009, 21:52
Сообщение #36


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(SasaVitebsk @ Jun 12 2009, 00:50) *
Особенно очевидным, является применение динамики там, где размер объектов, помещаемых на кучу, имеет переменное значение.
Например станок с ЧПУ. Имеет 5 инструментов. Из внешнего источника подгружается прога с операциями. Операция может иметь много полей (одним сверлом - 10 отв). Я могу динамически размещать операцию и удалять по исполнению. А размещать для того, чтобы эффективней расчитать работу инструмента.
У Вас таки не динамическое распределение получается а нечто
очень похожее на оверлеи, а это совсем другая задачка и там все(ну почти все) можно заранее предусмотреть(в статике)

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

и у каждого способа есть свои + и -
но для процов с маленькой памятью первого способа просто нет...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 11 2009, 22:15
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(singlskv @ Jun 12 2009, 01:52) *
но для процов с маленькой памятью первого способа просто нет...


Так про это самое все и говорят, что не фиг придумывать себе проблемы, там где их нет.
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jun 12 2009, 06:06
Сообщение #38


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



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

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

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

Спасибо!!! И предлагаю на этом закончить!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 12 2009, 06:44
Сообщение #39


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Halfback @ Jun 12 2009, 09:06) *
Сергей Борщ крутите пальцем в другом месте. Если Вы не заметили - то тут раздел называется В помощь начинающему а не Раздел для профессионалов/гуру.
Даже начинающие должны подкреплять фактами свои утверждения. Итак, пожалуйста, приведите пример хоть одного процессора с аппаратной подержкой malloc(). Ну или хотя бы опишите функциональность этой самой аппаратной поддержки. Заметьте - вы это не спрашивали, вы утверждали. Поэтому ссылка на начинающих не катит. Утверждаете - отстаивайте свое утверждение, даже если вы и начинающий. В противном случае вы будете считаться балаболом.
Что мне писать в каком разделе - позвольте я буду решать сам. Или вы хотите, чтобы в разделе для начинающих ответы писали только начинающие?
P.S. и постарайтесь не использовать дворовый жаргон. Тут это не принято.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 12 2009, 07:51
Сообщение #40


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Halfback @ Jun 12 2009, 09:06) *
На тот момент времени проблема была решена размещением в ОЗУ "кучи".
О! Так вот в чём была "ПРОБЛЕМА"!
Попытались жарить рыбу без рыбы, не вышло, народ повыяснял насчёт наличия рыбы (Вы сами не смогли проинтерпретировать выдачу используемого Вами компилятора)
Цитата(sergeeff @ Jun 7 2009, 19:21) *
А куча (heap) вообще-то существует? И размер ее?

Цитата(zltigo @ Jun 7 2009, 19:42) *
Написано-же, что не существует, как класс:
Код
Heap size: 0 byte(s)
и Вы таки догадались посмотреть, где у Вас рыбу берут.

Цитата(Halfback @ Jun 12 2009, 09:06) *
И имейте разницу понимать такие определения как "подсказка" и "решения". Подсказку дали, за что огромное спасибо, решение наковырял сам.
"огромное спасибо" появилсь только сейчас, до этого было, как раз в ответ на выяснение наличия места под кучу:
Цитата(Halfback @ Jun 7 2009, 22:46) *
Жаль что тут никто реальным советом не помог.
...
В своем компиляторе (CAVR) я ей (свалке) выделил 20 байт - и вуаля, всё заработало!!!
Кстати, что Вы понимаете под "реальным советом" и "решением"?
"подведи мышку к такому-то пункту меню, войди на такую-то страничку, в таком-то поле ввода набери число 20, нажми кнопку ОК"?
Так, во первых, это и невозможно было сказать, так как до этого Вы не удосужились указать какой у Вас инмтрумент.
А во вторых - это даже не "для начинающих", это в детсад.
Начинающему должно было хватить вопроса "а куча-то выделена?" - и хватило, не спорю, так не опускайте же сами себя до более низкого уровня!


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 12 2009, 11:17
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(singlskv @ Jun 12 2009, 00:52) *
У Вас таки не динамическое распределение получается а нечто
очень похожее на оверлеи, а это совсем другая задачка и там все(ну почти все) можно заранее предусмотреть(в статике)

Нет ну вы не совсем меня поняли. Я применил слово "программа", в смысле программа для станка с ЧПУ. То есть там, к примеру, координаты отверстия занесены. Это я так условно задачу привёл.
Никто не будет в станок ЧПУ передавать прогу на AVR для запуска оверлея. smile.gif
Это уж через чур.
Цитата
З.Ы. Собственно мое ИМХО заключается в том что это 2 совсем разные задачки
- распределение(и возврат) памяти(по требованию)
- распределение расположения данных в ранее распределенной памяти

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

Где граница "малой памяти"? В одном моём проекте на м640 используется куча 5.8 кб. И применить там другое решение даже себе не представляю.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 12 2009, 14:08
Сообщение #42


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jun 12 2009, 16:15
Сообщение #43


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ReAl @ Jun 12 2009, 17:08) *
Дык понятное дело - по задаче надо смотреть и головой думать.

+1 Можно все навороты свести к функциям memavail(), maxavail() и defrag(void **ptr, size_t size) и пущай в тексте будет явно указано, какие указатели подлежат "перетрахиванию", а какие и трогать не надо. И с ограничением времени исполнения сего действа.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 12 2009, 21:30
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(ReAl @ Jun 12 2009, 17:08) *
Дык понятное дело - по задаче надо смотреть и головой думать. Вот выделение/освобождение буфера фиксированного размера из пула буферов, как тут сказано, было частью ОС iDCX-51, которая вообще в 192 байтах ОЗУ в i8044 жила.

Вот о том и речь. Есть инструмент - можно им пользоваться. Но надо умело им пользоваться. И не фиг на зеркало пенять, когда рожа крива. (Это безотносительно к выступавшим)
smile.gif
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 11:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.02475 секунд с 7
ELECTRONIX ©2004-2016