mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-02-18 15:06:03 +01:00
Memory monitoring updates
Split update from read value; Inhibit interrupts when reading (normally done from loop code); Don't inhibit interrupts when updating (normally done from interupt code); Make freeMemory() local and ask for inline code generation.
This commit is contained in:
parent
0880507d89
commit
163dd270e8
@ -126,7 +126,7 @@ void loop()
|
|||||||
// Report any decrease in memory (will automatically trigger on first call)
|
// Report any decrease in memory (will automatically trigger on first call)
|
||||||
static int ramLowWatermark = 32767; // replaced on first loop
|
static int ramLowWatermark = 32767; // replaced on first loop
|
||||||
|
|
||||||
int freeNow = updateMinimumFreeMemory();
|
int freeNow = minimumFreeMemory();
|
||||||
if (freeNow < ramLowWatermark)
|
if (freeNow < ramLowWatermark)
|
||||||
{
|
{
|
||||||
ramLowWatermark = freeNow;
|
ramLowWatermark = freeNow;
|
||||||
|
@ -720,7 +720,7 @@ bool DCCEXParser::parseD(Print *stream, int params, int p[])
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
case HASH_KEYWORD_RAM: // <D RAM>
|
case HASH_KEYWORD_RAM: // <D RAM>
|
||||||
StringFormatter::send(stream, F("\nFree memory=%d\n"), freeMemory());
|
StringFormatter::send(stream, F("\nFree memory=%d\n"), minimumFreeMemory());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HASH_KEYWORD_ACK: // <D ACK ON/OFF> <D ACK [LIMIT|MIN|MAX] Value>
|
case HASH_KEYWORD_ACK: // <D ACK ON/OFF> <D ACK [LIMIT|MIN|MAX] Value>
|
||||||
|
@ -35,26 +35,31 @@ extern char *__malloc_heap_start;
|
|||||||
static volatile int minimum_free_memory = 32767;
|
static volatile int minimum_free_memory = 32767;
|
||||||
|
|
||||||
|
|
||||||
int freeMemory() {
|
static inline int freeMemory() {
|
||||||
char top;
|
char top;
|
||||||
#if defined(__arm__)
|
#if defined(__arm__)
|
||||||
return &top - reinterpret_cast<char*>(sbrk(0));
|
return &top - reinterpret_cast<char*>(sbrk(0));
|
||||||
#elif defined(__AVR__)
|
#elif defined(__AVR__)
|
||||||
return __brkval ? &top - __brkval : &top - __malloc_heap_start;
|
return __brkval ? &top - __brkval : &top - __malloc_heap_start;
|
||||||
#else
|
#else
|
||||||
#error bailed out alredy above
|
#error bailed out already above
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update low ram level. Allow for extra bytes to be specified
|
// Update low ram level. Allow for extra bytes to be specified
|
||||||
// by estimation or inspection, that may be used by other
|
// by estimation or inspection, that may be used by other
|
||||||
// called subroutines.
|
// called subroutines. Must be called with interrupts disabled.
|
||||||
int updateMinimumFreeMemory(unsigned char extraBytes) {
|
//
|
||||||
byte sreg_save = SREG;
|
void updateMinimumFreeMemory(unsigned char extraBytes) {
|
||||||
noInterrupts();
|
|
||||||
int spare = freeMemory()-extraBytes;
|
int spare = freeMemory()-extraBytes;
|
||||||
if (spare < minimum_free_memory) minimum_free_memory = spare;
|
if (spare < minimum_free_memory) minimum_free_memory = spare;
|
||||||
int returnValue = minimum_free_memory;
|
}
|
||||||
SREG = sreg_save;
|
|
||||||
return returnValue;
|
// Return low memory value.
|
||||||
|
int minimumFreeMemory() {
|
||||||
|
byte sreg_save = SREG;
|
||||||
|
noInterrupts(); // Disable interrupts
|
||||||
|
int retval = minimum_free_memory;
|
||||||
|
SREG = sreg_save; // Restore interrupt state
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,6 @@
|
|||||||
|
|
||||||
#ifndef freeMemory_h
|
#ifndef freeMemory_h
|
||||||
#define freeMemory_h
|
#define freeMemory_h
|
||||||
int freeMemory();
|
void updateMinimumFreeMemory(unsigned char extraBytes=0);
|
||||||
int updateMinimumFreeMemory(unsigned char extraBytes=0);
|
int minimumFreeMemory();
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user