AVR выделяет память в конструкторе классов

Я использую чип Atmel AVR ATmega328p и пытаюсь создать несколько кольцевых буферов различной длины, используя класс FifoBuffer, в файле fifobuffer.h, который я создал …

class FifoBuffer {

private:

uint8_t buf_head;  // Head position, where next character is to be added
uint8_t buf_tail;  // Tail position, when next character is to be removed
uint8_t buf_size;  // Size of buffer in number of characters
uint8_t *buffer;   // Declare buffer pointer

public:

FifoBuffer (uint8_t); // Constructor declaration

uint8_t get () { return buffer[2]; }

void put (uint8_t character) { }

void empty () { }

uint8_t count () { return 10; }

uint8_t head () { return buf_head; }

uint8_t tail () { return buf_tail; }

uint8_t size () { return buf_size; }
};

// Constructor
//
FifoBuffer::FifoBuffer (uint8_t buffer_length) {
buf_head   = 0;
buf_tail   = 0;
buf_size   = buffer_length;
buffer     = new uint8_t [buffer_length];
buffer[1] = 20; // Test
buffer[2] = 16; // Test
buffer[3] = 32; // Test
}

В моем файле main.cpp у меня есть …

...

void *operator new(size_t s)     { return malloc(s); }
void *operator new[](size_t s)   { return malloc(s); }
void  operator delete(void *m)   { free(m); }
void  operator delete[](void *m) { free(m); }

#include "fifobuffer.h"
...

FifoBuffer tty_rx_buf(64);
FifoBuffer tty_tx_buf(64);

uint8_t ttt = tty_rx_buf.get();
show_8_bits (ttt, 'n');
ttt = tty_rx_buf.size();
show_8_bits (ttt, 'n');

...

Теперь все соответствует, и .get() возвращает 16 и .size() возвращает 64, что я и ожидал.
Но я замечаю, что размер программы (использование памяти программы: 1194 байта, использование памяти данных: 11 байтов) не меняется, выбираю ли я размер 64 или 10 для вызовов конструктора кольцевого буфера. Когда я делаю только 1 вызов конструктора кольцевого буфера, использование памяти меняется на 1178 байтов и 11 байтов соответственно.

Я беспокоюсь, что buffer = new uint8_t [buffer_length] В действительности строка не выделяет байты buffer_length.

Оправдано ли мое беспокойство? Есть лучший способ сделать это? Да, я новичок в этом.

0

Решение

Причина, по которой вы не получаете отчет о памяти «правильно», заключается в том, что компилятор не отслеживает память, выделенную в malloc() звонки: например, у вас может быть такой код:

if (PINSB && 0x01) {
myPtr = malloc(0x10);
}

То, что иллюстрирует приведенный выше пример, malloc() вызов сделан или не сделан в результате реальных условий, таких как уровень напряжения на входном контакте. Компилятор не знает когда и как malloc() а также free() будет вызван, и в результате не может отслеживать эту память. Единственная память, которую он отслеживает, это переменные, выделенные в стеке, то есть память, выделенная без malloc() вызов. Для иллюстрации контраста:

char dataA[10];   // Counted by compiler as memory
char* dataB = malloc(10); // Not counted by compiler except for the size of the pointer dataB itself.
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]