На avr-ках лучше не использовать динамическую память.
Тоесть, втопку всякие
newи
deleteЕсли хотите, то можете их применить, перед этим объявив какнибудь вот так:
- Код: Выделить всё • Развернуть
#include <stdlib.h>
void * operator new(size_t size);
void operator delete(void * ptr);
Но ябы не советовал бы, их использовать, реализация их на контроллере ущербна. Очень сильно фрагментируется память.
И они довольнотаки тяжеловесны.
Вопрос задан неверно. Размер переменной изменить нельзя. Можно делать массивы разной размерностью. С использованием указателей на эти массивы.
Чтобы решить вашу задачу с буферизацией UART нужно использовать кольцевой список.
Вот примерный код:
Заголовочный файл.
- Код: Выделить всё • Развернуть
#pragma once
#include "../devSettings.h"
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
#define MAX_CIRCULAR_BUFFER 0x20 //максимальный кольцевой буфер для протокола
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Реализация кольцевого буфера *
* //------------------------------------------------------------------------------------*
*///
class
AFIFO
{
public:
AFIFO();
bool push_back(const BYTE data);//Запихнем данные в конец очереди
BYTE pop_front();//Вытащим данные из начала очереди
void clear();//очистить очередь
int count()const; //количество элементов в буфере
private:
BYTE m_buffer[MAX_CIRCULAR_BUFFER];
int m_indexBegin;//указатель на начало очереди
int m_indexEnd;//указатель на конец очереди
int m_count;//количество элементов
};
Реализация
- Код: Выделить всё • Развернуть
#include "devFIFO.h"
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Constructor *
* //------------------------------------------------------------------------------------*
*///
AFIFO :: AFIFO()
:
m_indexBegin(0),
m_indexEnd(0),
m_count(0)
{
}
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // очистить очередь *
* //------------------------------------------------------------------------------------*
*///
void AFIFO :: clear()
{
m_indexBegin = 0;
m_indexEnd = 0;
m_count = 0;
}
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Запихнем данные в конец очереди *
* //------------------------------------------------------------------------------------*
*///
bool AFIFO :: push_back(const BYTE data)
{
if (m_count < MAX_CIRCULAR_BUFFER)
{
m_buffer[m_indexEnd] = data;
m_indexEnd++;
m_count++;
if (m_indexEnd == MAX_CIRCULAR_BUFFER)
{
m_indexEnd = 0;
}
return true;
}
return false;
}
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Вытащим данные из начала очереди *
* //------------------------------------------------------------------------------------*
*///
BYTE AFIFO :: pop_front()
{
if (m_count > 0)
{
BYTE data = m_buffer[m_indexBegin];
m_buffer[m_indexBegin] = 0;
m_indexBegin++;
m_count--;
if (m_indexBegin == MAX_CIRCULAR_BUFFER)
{
//вышли за пределы буфера
m_indexBegin = 0;
}
return data;
}
//ошибка, нет данных для чтения
return 0;
}
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Количество элементов в буфере *
* //------------------------------------------------------------------------------------*
*///
int AFIFO :: count() const
{
return m_count;
}
//---------------------------------------------------------------------------------------
Использовать можно вот так
- Код: Выделить всё • Развернуть
main()
{
AFIFO bufRead;
/* заносим данные в обработчке прерывания на приход новых данных
*/
bufRead.push_back(34);
bufRead.push_back(12);
bufRead.push_back(0xFF);
////
/* в галвном цикле/потоке вытаскиваем неспешно пришедшие данные
*/
int data = bufRead.pop_front();
}
Также, можно объявить две переменные AFIFO, одну для чтения, вторую для записи в UART.