2013-03-12 2 views
0

저는 Atmel AVR ATmega328p 칩을 사용하고 있으며 다양한 길이의 FifoBuffer 클래스를 사용하여 여러 개의 링 버퍼를 생성하려고합니다. 생성 된 파일 fifobuffer.h에서 .. . AVR 클래스 생성자에 메모리를 할당합니다.

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 크기를 선택하는지에 관계없이 변경되지 않습니다. 단 하나의 링 버퍼 생성자 호출을 만들 때 메모리 사용은 각각 1178 바이트와 11 바이트로 변경됩니다.

buffer = new uint8_t [buffer_length] 라인이 실제로 buffer_length 바이트를 할당하지 않는다고 걱정됩니다.

내 관심사가 보증되어 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 예, 저는 이것에 대해 새로운 것입니다.

+0

이 호출은 무엇입니까? 마이크로 컨트롤러 용 코드를 작성할 때 기본적으로 malloc을 얻지 못한다. malloc 구현을 제공하는 라이브러리를 사용하고 있습니까? –

+0

'는'자주 AVR 프로그램의 malloc'없이 사용하지 않고 작성된 불구하고''으로 malloc()가()' – angelatlarge

+0

예 내가 사용하는 라이브러리는 #이 사용법 #include // ## 포함되어 있습니다 # test #include # 포함 # 포함 jwhitney

답변

3

당신이 메모리 보고서 "제대로"점점되지 않는 이유는 컴파일러가 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. 
+0

와우 @ 감사합니다. 감사합니다. 이제는 의미가 있습니다. 그렇다면 링 버퍼에서 무엇을 사용했는지 추적하고 컴파일러가 알고있는 메모리 크기에 추가해야합니다. 한 번만 생성자를 호출하기 때문에 처음에는 링 버퍼의 크기가 변경된 적이 없으므로 링 버퍼 저장소를 설정하는 더 좋은 방법이 있습니까? – jwhitney

+0

사용하고자하는 버퍼 크기가 변경되지 않습니다. 컴파일 시간 전/컴파일 시점에 한 번 설정하고이를 따라 잡으십시오. 맞습니까? – angelatlarge

+0

예, @angelatlarge. 4 개의 고정 된 크기를 가진 4 개의 버퍼를 갖지만 크기가 각각 다르며 시작시 한 번 설정하고 변경하지 않습니다. – jwhitney

관련 문제