|
Динамическое создание массивов и ошибки при работе с ними, Косяк, но не понимаю почему |
|
|
|
Jun 7 2009, 12:12
|
Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512

|
Смысл в том, что данные приходящие по UART сбрасываю в буфер RS232_RX_BUFFER. Потом при его заполнении выставляю флаг. Главная программа если видит флаг, то создает динамический массив того же размера что и RS232_RX_BUFFER и начинает его декодировать. Зачем сделана двойная буферизация? - Отвечаю: так надо В коде происходит так: Код 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
|
|
|
|
|
 |
Ответов
|
Jun 11 2009, 20:50
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата На мой взгляд если говорить о динамической памяти, то она должна, как минимум поддерживать malloc/free. Именно об этом мы и говорим. И я конкретно. Только если мы говорим об AVR, то кроме этого практически ничего нет. То есть функциональность диспетчера нулевая. Если у меня будет "дырка", то он даже не вставит. Именно по этому некоторые присутствующие писали свой диспетчер и приводили его фрагменты на форуме. Например, zltigo. Тоже себе ставлю такую задачу, но это длительная работа. Желательно оценить надёжность работы перед активным применением, а времени не хватает.  Цитата( @ Jun 8 2009, 21:54)  Эффективность алгоритма - дело десятое. Важнее - функциональность. Тут коллеги приводят примеры, когда выделение/освобождение может вообще раз-другой и производится. С точки зрения программы, если не один раз - то дальше без разницы - 2,3... Если речь о функциональности. А если о эффективности, - тогда дело другое. Если рассматривать общий случай, то производительность системы будет падать, так как на работу с динамикой придётся затратить ресурсы. А вот с точки зрения эффективности потребления памяти - выигрыш может оказаться решающим. Особенно очевидным, является применение динамики там, где размер объектов, помещаемых на кучу, имеет переменное значение. Например станок с ЧПУ. Имеет 5 инструментов. Из внешнего источника подгружается прога с операциями. Операция может иметь много полей (одним сверлом - 10 отв). Я могу динамически размещать операцию и удалять по исполнению. А размещать для того, чтобы эффективней расчитать работу инструмента. Как и любую задачу в программировании, эту можно решить десятком способов. С применением динамики и без оного. Как кому удобно. Но если есть данный инструмент, то почему им нельзя пользоваться? Даже если без этого можно обойтись?
|
|
|
|
|
Jun 11 2009, 21:52
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SasaVitebsk @ Jun 12 2009, 00:50)  Особенно очевидным, является применение динамики там, где размер объектов, помещаемых на кучу, имеет переменное значение. Например станок с ЧПУ. Имеет 5 инструментов. Из внешнего источника подгружается прога с операциями. Операция может иметь много полей (одним сверлом - 10 отв). Я могу динамически размещать операцию и удалять по исполнению. А размещать для того, чтобы эффективней расчитать работу инструмента. У Вас таки не динамическое распределение получается а нечто очень похожее на оверлеи, а это совсем другая задачка и там все(ну почти все) можно заранее предусмотреть(в статике) З.Ы. Собственно мое ИМХО заключается в том что это 2 совсем разные задачки - распределение(и возврат) памяти(по требованию) - распределение расположения данных в ранее распределенной памяти и у каждого способа есть свои + и - но для процов с маленькой памятью первого способа просто нет...
|
|
|
|
|
Jun 12 2009, 11:17
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(singlskv @ Jun 12 2009, 00:52)  У Вас таки не динамическое распределение получается а нечто очень похожее на оверлеи, а это совсем другая задачка и там все(ну почти все) можно заранее предусмотреть(в статике) Нет ну вы не совсем меня поняли. Я применил слово "программа", в смысле программа для станка с ЧПУ. То есть там, к примеру, координаты отверстия занесены. Это я так условно задачу привёл. Никто не будет в станок ЧПУ передавать прогу на AVR для запуска оверлея.  Это уж через чур. Цитата З.Ы. Собственно мое ИМХО заключается в том что это 2 совсем разные задачки - распределение(и возврат) памяти(по требованию) - распределение расположения данных в ранее распределенной памяти
и у каждого способа есть свои + и - но для процов с маленькой памятью первого способа просто нет... Где граница "малой памяти"? В одном моём проекте на м640 используется куча 5.8 кб. И применить там другое решение даже себе не представляю.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|