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

 
 
> Динамическое создание массивов и ошибки при работе с ними, Косяк, но не понимаю почему
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
 
Start new topic
Ответов
sergeeff
сообщение Jun 8 2009, 18:54
Сообщение #2


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

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



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


Гуру
******

Группа: Свой
Сообщений: 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
singlskv
сообщение Jun 11 2009, 21:52
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 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
SasaVitebsk
сообщение Jun 12 2009, 11:17
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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
SasaVitebsk
сообщение Jun 12 2009, 21:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- Halfback   Динамическое создание массивов и ошибки при работе с ними   Jun 7 2009, 12:12
- - sergeeff   Складывается ощущение, что вы должны уложиться со ...   Jun 7 2009, 12:46
- - zltigo   Цитата(Halfback @ Jun 7 2009, 15:12) .......   Jun 7 2009, 13:35
- - sergeeff   Кстати о двойной буфферизации. А кто мешает второй...   Jun 7 2009, 14:25
- - Halfback   sergeeff ЦитатаСкладывается ощущение, что вы должн...   Jun 7 2009, 15:30
|- - zltigo   Цитата(Halfback @ Jun 7 2009, 18:30) Да, ...   Jun 7 2009, 15:47
- - Halfback   zltigo Цитатаобрабатывать ошибки возвращаемые mall...   Jun 7 2009, 16:15
|- - zltigo   Цитата(Halfback @ Jun 7 2009, 19:15) mall...   Jun 7 2009, 16:42
- - sergeeff   А куча (heap) вообще-то существует? И размер ее?   Jun 7 2009, 16:21
- - Halfback   sergeeff ЦитатаА куча (heap) вообще-то существует?...   Jun 7 2009, 16:29
- - sergeeff   Раз не знаешь, что такое heap, не пользуйся функци...   Jun 7 2009, 16:52
|- - zltigo   Цитата(sergeeff @ Jun 7 2009, 19:52) Раз ...   Jun 7 2009, 18:53
- - sergeeff   Что-то у меня про эффективность динамической памят...   Jun 7 2009, 19:39
- - Halfback   Жаль что тут никто реальным советом не помог. ...   Jun 7 2009, 19:46
|- - zltigo   Цитата(Halfback @ Jun 7 2009, 22:46) Жаль...   Jun 7 2009, 20:00
- - singlskv   Цитата(Halfback @ Jun 7 2009, 16:12) то с...   Jun 7 2009, 20:20
|- - defunct   Цитата(singlskv @ Jun 7 2009, 23:20) Забу...   Jun 7 2009, 20:50
- - sergeeff   Совершенно никакой разницы нет в том, как именно в...   Jun 8 2009, 06:03
|- - SasaVitebsk   Цитата(sergeeff @ Jun 8 2009, 09:03) А he...   Jun 8 2009, 08:43
|- - Dog Pawlowa   Цитата(SasaVitebsk @ Jun 8 2009, 11:43) В...   Jun 8 2009, 09:02
|- - SasaVitebsk   Цитата(Dog Pawlowa @ Jun 8 2009, 12:02) Н...   Jun 8 2009, 15:32
- - sergeeff   На мой взгляд если говорить о динамической памяти,...   Jun 8 2009, 18:05
|- - singlskv   Цитата(sergeeff @ Jun 8 2009, 22:05) На м...   Jun 8 2009, 18:38
|- - defunct   Цитата(singlskv @ Jun 8 2009, 21:38) ... ...   Jun 9 2009, 13:30
|- - singlskv   Цитата(sergeeff @ Jun 8 2009, 22:54) Эффе...   Jun 8 2009, 19:15
|- - sergeeff   Цитата(SasaVitebsk @ Jun 11 2009, 23:50) ...   Jun 11 2009, 20:59
|- - sergeeff   Цитата(singlskv @ Jun 12 2009, 01:52) но ...   Jun 11 2009, 22:15
|- - _Pasha   Цитата(ReAl @ Jun 12 2009, 17:08) Дык пон...   Jun 12 2009, 16:15
- - Rst7   ЦитатаПод эффективностью я имел в виду не только с...   Jun 9 2009, 05:54
- - Halfback   мда, как говориться - начали за здравие и заканчив...   Jun 11 2009, 16:47
|- - zltigo   Цитата(Halfback @ Jun 11 2009, 19:47) мда...   Jun 11 2009, 17:29
|- - ReAl   Цитата(Halfback @ Jun 11 2009, 19:47) Пос...   Jun 11 2009, 19:14
|- - Сергей Борщ   Цитата(ReAl @ Jun 11 2009, 22:14) Только ...   Jun 11 2009, 20:08
- - Halfback   zltigo мне не за что извиняться т.к. никого тут не...   Jun 11 2009, 17:37
- - sergeeff   Аппаратный malloc - это гениальная идея не менее г...   Jun 11 2009, 20:50
- - Halfback   ReAl гона тут не было. На тот момент времени пробл...   Jun 12 2009, 06:06
- - Сергей Борщ   Цитата(Halfback @ Jun 12 2009, 09:06) Сер...   Jun 12 2009, 06:44
- - ReAl   Цитата(Halfback @ Jun 12 2009, 09:06) На ...   Jun 12 2009, 07:51


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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 15:46
Рейтинг@Mail.ru


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