|
Динамическое создание массивов и ошибки при работе с ними, Косяк, но не понимаю почему |
|
|
|
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 7 2009, 16:15
|
Местный
  
Группа: Участник
Сообщений: 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() память не выдел.  При компиляции вот что выдается: 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 байт.
Сообщение отредактировал Halfback - Jun 7 2009, 16:16
|
|
|
|
|
Jun 7 2009, 16:42
|

Гуру
     
Группа: Свой
Сообщений: 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  и ненужные письмена для явного преобразования buf1 и чего-то (зачем-то коcящего под макрос) к указателю на байт, хотя он buf1 сам по жизни такой, а аргументы memcpy() вообще универсальные void * Цитата(sergeeff @ Jun 7 2009, 19:21)  А куча (heap) вообще-то существует? И размер ее? Написано-же, что не существует, как класс: Цитата Heap size: 0 byte(s)
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
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 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 sergeeff Эффективность алгоритма - дело десятое. Важнее - ф... Jun 8 2009, 18:54 singlskv Цитата(sergeeff @ Jun 8 2009, 22:54) Эффе... Jun 8 2009, 19:15 SasaVitebsk ЦитатаНа мой взгляд если говорить о динамической п... Jun 11 2009, 20:50  sergeeff Цитата(SasaVitebsk @ Jun 11 2009, 23:50) ... Jun 11 2009, 20:59  singlskv Цитата(SasaVitebsk @ Jun 12 2009, 00:50) ... Jun 11 2009, 21:52   sergeeff Цитата(singlskv @ Jun 12 2009, 01:52) но ... Jun 11 2009, 22:15   SasaVitebsk Цитата(singlskv @ Jun 12 2009, 00:52) У В... Jun 12 2009, 11:17    ReAl Цитата(SasaVitebsk @ Jun 12 2009, 14:17) ... Jun 12 2009, 14:08     _Pasha Цитата(ReAl @ Jun 12 2009, 17:08) Дык пон... Jun 12 2009, 16:15     SasaVitebsk Цитата(ReAl @ Jun 12 2009, 17:08) Дык пон... Jun 12 2009, 21:30 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
|
|
|