Bonjour
Ci dessous 2 méthodes pour connaitre la quantité de sram dispo et pas le même résultat. Excusez moi pour la présentation, mais je teste différentes méthodes et c'est brouillon pour le moment.
Le sketch avec FreeRam qui tourne en même temps que MemoryFree (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1213583720/15)
Soit il y a un bug dans le code, soit (je demande confirmation), le code est chargée de façon dynamique pendant son exécution et ce qui est pas nécessaire est déchargé puis rechargé au prochain loop(). Et donc FreeRam consomme plus que FreeMemory (une dizaine d'octets environ sur cet exemple).
Y a t il une méthode fiable savoir combien il en reste, parce qu'avec quelques Ko de sram c'est pas le moment de gaspiller ?
#include "MemoryFree.h"
/** Return the number of bytes currently free in RAM. /
static int FreeRam(void) {
extern int __bss_end;
extern int __brkval;
int free_memory;
if (reinterpret_cast(__brkval) == 0) {
// if no heap use from end of bss section
free_memory = reinterpret_cast(&free_memory)
- reinterpret_cast(&__bss_end);
} else {
// use from top of stack to heap
free_memory = reinterpret_cast(&free_memory)- reinterpret_cast(__brkval);
}
return free_memory;
}void setup() // run once, when the sketch starts
{
Serial.begin(9600);}
void loop() // run over and over again
{
Serial.print("freeMemory() reports ");
Serial.println( freeMemory() );
Serial.print("freeRam() reports ");
Serial.println( FreeRam() );}
MemoryFree.cpp
//
#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endifextern 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;
}
et 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" {
#endifint freeMemory();
#ifdef __cplusplus
}
#endif#endif