Цитата(SysRq @ Jun 25 2009, 23:53)

Из такого куска кода как-то не ясно начальное значение (*Buffer_Size). Может быть действительно еще пара байт свободных байт остается...
Перед началом выделения:
Код
*Buffer_Size = 0;
Код
...
unsigned char* PBuff;
unsigned int Size_Buff;
...
Res = USART.Read(PBuff, &Size_Buff);
USART.Write(PBuff, Size_Buff);
....
TStatus_Op TUSART_S::Read(unsigned char* Buffer, unsigned int* Buffer_Size)
{
unsigned char ParityBit; // Временная переменная для хранения значения 9-го бита принятого по USART байта данных.
unsigned int i;
unsigned char Event_Result;
Enable_RXD_Int(); // Разрешение прерывания по окончании передачи байта.
*Buffer_Size = 0;
i = 0;
do
{
if (*Buffer_Size == 0) {Event_Result = ByteIsReceived_Event.Wait(0);}
else {Event_Result = ByteIsReceived_Event.Wait(RD_TimeOut);};
if (!Event_Result)
{
// Тайм-аут при приёме байта.
Disable_RXD_Int(); // Запрещение прерывания по окончании приёма байта.
return SO_READ_TIME_OUT;
};
(*Buffer_Size)++;
Buffer = (unsigned char*) realloc((unsigned char*)Buffer, *Buffer_Size); // Выделение участка памяти.
// Проверка успешности выделения участка памяти под буфер приёмника.
if (!Buffer)
{
// Ошибка выделения участка памяти.
Disable_RXD_Int(); // Запрещение прерывания по окончании приёма байта.
return SO_MEMORY_NOT_ALLOCATED;
};
ParityBit = Get_Parity_Bit();
// Извлечение очередного байта из регистра данных USART и загрузка его в буфер приёмника.
*(Buffer + i) = Read_Byte();
i++;
Enable_RXD_Int(); // Разрешение прерывания по окончании передачи байта.
}
while (*Buffer_Size < 7);
Disable_RXD_Int(); // Запрещение прерывания по окончании приёма байта.
return SO_OPERATION_COMPLETE;
...
};
Памяти, я думаю, хватает...
Следующий код работает нормально.
Код
...
unsigned char* PBuff;
unsigned int Size_Buff;
...
Size_Buff = 26;
PBuff = (unsigned char*) malloc(Size_Buff);
Res = USART.Read(PBuff, (const unsigned int) Size_Buff);
USART.Write(PBuff, Size_Buff);
free(PBuff);
...
TStatus_Op TUSART_S::Read(unsigned char* Buffer, const unsigned int Buffer_Size)
{
unsigned char Event_Result;
for (unsigned int i = 0; i < Buffer_Size; i++)
{
Enable_RXD_Int(); // Разрешение прерывания по окончании передачи байта.
if (i == 0) {Event_Result = ByteIsReceived_Event.Wait(0);}
else {Event_Result = ByteIsReceived_Event.Wait(RD_TimeOut);};
if (!Event_Result) {return SO_READ_TIME_OUT;}; // Тайм-аут при приёме байта.
// Извлечение очередного байта из регистра данных USART и загрузка его в буфер приёмника.
*(Buffer + i) = Read_Byte();
};
return SO_OPERATION_COMPLETE;
};
...
Смысл-то в том, чтобы менять размер буфера при приёме...
Т. е., конечно, проще и надёжнее - выделить память под буфер на N байт сразу и прочитать эти N байт.
А ещё проще и надёжнее - использовать обычный массив.
А если N неизвестно или известно, что оно не более M?
Выделять память по буфер M байт не хочется... неэкономично как-то и некрасиво

Программа работает совместно с scmRTOS.
Так что процесс ждёт эвента ByteIsReceived_Event, свидетельствующего о получении байта по USART.
Эвент сигналится в прерывании по приёму...
Возможно, решение проблемы здесь:
http://bytes.com/groups/c/603687-problem-reallocНадо проверить