Проверка памяти в Arduino - PullRequest
       20

Проверка памяти в Arduino

4 голосов
/ 28 декабря 2011

Я работаю над простым проектом с моим Arduino. Недавно мне пришлось преобразовать одну из моих переменных в длинную вместо int, и для простоты я просто переместил все числа, с которыми она взаимодействует (поэтому мне не нужно беспокоиться о сравнениях между типами и математика). Это кажется расточительным, но это просто часы для меня, и мне все равно.

Это, однако, заставило меня задуматься о том, сколько памяти я использую. Я сомневаюсь, что это проблема, но я понял, что не знаю, как проверить.

Итак, есть ли способ проверить количество памяти, используемой Arduino?

В идеале я хотел бы распечатать текущую память / общее количество, доступное через последовательное соединение.

Ответы [ 4 ]

3 голосов
/ 23 августа 2012

Попробуйте использовать MemoryFree .Эта библиотека хорошо сработала для меня.

1 голос
/ 16 июля 2013

Подробную информацию об этом можно найти на Arduino Playground , здесь я нашел метод, который использовал:

MemoryFree.h:


// MemoryFree library based on code posted here:
// http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1213583720/15
//
// Extended by Matthew Murdoch to include walking of the free list.

#ifndef MEMORY_FREE_H
#define MEMORY_FREE_H

#ifdef __cplusplus
extern "C" {
#endif

  int freeMemory();

#ifdef  __cplusplus
}
#endif

#endif


MemoryFree.cpp:

#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include 
#endif

extern unsigned int __heap_start;
extern void *__brkval;

/*
 * The free list structure as maintained by the 
 * avr-libc memory allocation routines.
 */
struct __freelist {
  size_t sz;
  struct __freelist *nx;
};

/* The head of the free list structure */
extern struct __freelist *__flp;

#include "MemoryFree.h";

/* Calculates the size of the free list */
int freeListSize() {
  struct __freelist* current;
  int total = 0;

  for (current = __flp; current; current = current->nx) {
    total += 2; /* Add two bytes for the memory block's header  */
    total += (int) current->sz;
  }

  return total;
}

int freeMemory() {
  int free_memory;

  if ((int)__brkval == 0) {
    free_memory = ((int)&free_memory) - ((int)&__heap_start);
  } else {
    free_memory = ((int)&free_memory) - ((int)__brkval);
    free_memory += freeListSize();
  }
  return free_memory;
}


Пример эскиза:

#include <MemoryFree.h>

// On Arduino Duemilanove with ATmega328:
//
// Reported free memory with str commented out:
// 1824 bytes
//
// Reported free memory with str and Serial.println(str) uncommented:
// 1810
//
// Difference: 14 bytes (13 ascii chars + null terminator)

// 14-bytes string
//char str[] = "Hello, world!";


void setup() {
    Serial.begin(115200);
}


void loop() {
    //Serial.println(str);

    Serial.print("freeMemory()=");
    Serial.println(freeMemory());

    delay(1000);
}
1 голос
/ 03 января 2012

Вы можете использовать это.Это даст вам представление о том, где вы находитесь:

Serial.print(availableMemory());

// free RAM check for debugging. SRAM for ATmega328p = 2048Kb.
int availableMemory() {
    // Use 1024 with ATmega168
    int size = 2048;
    byte *buf;
    while ((buf = (byte *) malloc(--size)) == NULL);
        free(buf);
    return size;
}
0 голосов
/ 20 января 2016

Опираясь на ответ Эсбена, я написал эту оптимизированную версию:

int biggestMemoryBlock(uint16_t min,uint16_t max)
{
  if (min==max-1)
    return min;

  int size=max;
  int lastSize=size;
  byte *buf;
  while ((buf = (byte *) malloc(size)) == NULL)
  {
    lastSize=size;
    size-=(max-min)/2;
  };

  free(buf);
  return biggestMemoryBlock(size,lastSize);
};


int biggestMemoryBlock() 
{
    return biggestMemoryBlock(0,4096);
}

В Arduino Uno это занимает всего 1 миллисекунду или меньше, вместо 13-20 мс с исходной функцией. Константа должна составлять не менее общего объема памяти (в байтах) на плате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...