diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 6955a55d3..d0d996770 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -80,10 +80,11 @@ void send_wtx(uint16_t wtx) { static void umm_test(void) { + umm_info(NULL, true); uint8_t* dest = (uint8_t*)umm_malloc(2000); umm_free(dest); dest = (uint8_t*)umm_malloc(12000); - umm_info(dest, false); + umm_info(dest, true); umm_free(dest); } diff --git a/armsrc/dbprint.h b/armsrc/dbprint.h index 2172040dc..19b848c60 100644 --- a/armsrc/dbprint.h +++ b/armsrc/dbprint.h @@ -14,6 +14,8 @@ #include "common.h" #include "ansi.h" +#define NOLF "\xff" + #define Dbprintf_usb(...) {\ bool tmpfpc = g_reply_via_fpc;\ bool tmpusb = g_reply_via_usb;\ @@ -52,25 +54,46 @@ void print_result(const char *name, uint8_t *buf, size_t len); // Functions for umm_malloc // Alternatively, use https://github.com/rhempel/c-helper-macros/blob/develop/dbglog/dbglog.h -#define DBGLOG_FORCE(...) {\ - Dbprintf (__VA_ARGS__); \ + +#define DBGLOGS_FORCE(force, format) {\ + if (force) Dbprintf (format NOLF); \ } -#define DBGLOG_ERROR(...) {\ - if (DBGLEVEL >= DBG_ERROR) Dbprintf (__VA_ARGS__); \ +#define DBGLOG_FORCE(force, format, ...) {\ + if (force) Dbprintf (format NOLF, __VA_ARGS__); \ } -#define DBGLOG_CRITICAL(...) {\ - if (DBGLEVEL >= DBG_ERROR) Dbprintf (__VA_ARGS__); \ +#define DBGLOGS_ERROR(format) {\ + if (DBGLEVEL >= DBG_ERROR) Dbprintf (format NOLF); \ } -#define DBGLOG_DEBUG(...) {\ - if (DBGLEVEL >= DBG_DEBUG) Dbprintf (__VA_ARGS__); \ +#define DBGLOG_ERROR(format, ...) {\ + if (DBGLEVEL >= DBG_ERROR) Dbprintf (format NOLF, __VA_ARGS__); \ } -#define DBGLOG_TRACE(...) {\ - if (DBGLEVEL >= DBG_EXTENDED) Dbprintf (__VA_ARGS__); \ +#define DBGLOGS_CRITICAL(format) {\ + if (DBGLEVEL >= DBG_ERROR) Dbprintf (format NOLF); \ } -#define DBGLOG_32_BIT_PTR(...) __VA_ARGS__ +#define DBGLOG_CRITICAL(format, ...) {\ + if (DBGLEVEL >= DBG_ERROR) Dbprintf (format NOLF, __VA_ARGS__); \ + } + +#define DBGLOGS_DEBUG(format) {\ + if (DBGLEVEL >= DBG_DEBUG) Dbprintf (format NOLF); \ + } + +#define DBGLOG_DEBUG(format, ...) {\ + if (DBGLEVEL >= DBG_DEBUG) Dbprintf (format NOLF, __VA_ARGS__); \ + } + +#define DBGLOGS_TRACE(format) {\ + if (DBGLEVEL >= DBG_EXTENDED) Dbprintf (format NOLF); \ + } + +#define DBGLOG_TRACE(format, ...) {\ + if (DBGLEVEL >= DBG_EXTENDED) Dbprintf (format NOLF, __VA_ARGS__); \ + } + +#define DBGLOG_32_BIT_PTR(ptr) (ptr) #endif diff --git a/armsrc/umm_info.c b/armsrc/umm_info.c index 93fe375e5..d852665b6 100644 --- a/armsrc/umm_info.c +++ b/armsrc/umm_info.c @@ -3,7 +3,7 @@ #include #include -#include +//#include #ifdef UMM_INFO /* ---------------------------------------------------------------------------- @@ -40,8 +40,8 @@ void *umm_info( void *ptr, bool force ) { */ memset( &ummHeapInfo, 0, sizeof( ummHeapInfo ) ); - DBGLOG_FORCE( force, "\n" ); - DBGLOG_FORCE( force, "+----------+-------+--------+--------+-------+--------+--------+\n" ); + DBGLOGS_FORCE( force, "\n" ); + DBGLOGS_FORCE( force, "+----------+-------+--------+--------+-------+--------+--------+\n" ); DBGLOG_FORCE( force, "|0x%08x|B %5i|NB %5i|PB %5i|Z %5i|NF %5i|PF %5i|\n", DBGLOG_32_BIT_PTR(&UMM_BLOCK(blockNo)), blockNo, @@ -125,7 +125,7 @@ void *umm_info( void *ptr, bool force ) { UMM_NFREE(blockNo), UMM_PFREE(blockNo) ); - DBGLOG_FORCE( force, "+----------+-------+--------+--------+-------+--------+--------+\n" ); + DBGLOGS_FORCE( force, "+----------+-------+--------+--------+-------+--------+--------+\n" ); DBGLOG_FORCE( force, "Total Entries %5i Used Entries %5i Free Entries %5i\n", ummHeapInfo.totalEntries, @@ -137,12 +137,12 @@ void *umm_info( void *ptr, bool force ) { ummHeapInfo.usedBlocks, ummHeapInfo.freeBlocks ); - DBGLOG_FORCE( force, "+--------------------------------------------------------------+\n" ); + DBGLOGS_FORCE( force, "+--------------------------------------------------------------+\n" ); DBGLOG_FORCE( force, "Usage Metric: %5i\n", umm_usage_metric()); DBGLOG_FORCE( force, "Fragmentation Metric: %5i\n", umm_fragmentation_metric()); - DBGLOG_FORCE( force, "+--------------------------------------------------------------+\n" ); + DBGLOGS_FORCE( force, "+--------------------------------------------------------------+\n" ); /* Release the critical section... */ UMM_CRITICAL_EXIT(); @@ -168,12 +168,20 @@ int umm_usage_metric( void ) { return (int)((ummHeapInfo.usedBlocks * 100)/(ummHeapInfo.freeBlocks)); } +static uint32_t sqrt(uint32_t x) { + double n=x; + while((n*n-x>0.0001)||(n*n-x<-0.0001)){ + n=(n+x/n)/2; + } + return (uint32_t)n; +} + int umm_fragmentation_metric( void ) { DBGLOG_DEBUG( "freeBlocks %i freeBlocksSquared %i\n", ummHeapInfo.freeBlocks, ummHeapInfo.freeBlocksSquared); if (0 == ummHeapInfo.freeBlocks) { return 0; } else { - return (100 - (((uint32_t)(sqrtf(ummHeapInfo.freeBlocksSquared)) * 100)/(ummHeapInfo.freeBlocks))); + return (100 - ((sqrt(ummHeapInfo.freeBlocksSquared) * 100)/(ummHeapInfo.freeBlocks))); } } diff --git a/armsrc/umm_malloc.c b/armsrc/umm_malloc.c index 8aa302c1c..454d1316e 100644 --- a/armsrc/umm_malloc.c +++ b/armsrc/umm_malloc.c @@ -185,7 +185,7 @@ static void umm_assimilate_up( uint16_t c ) { * the free list */ - DBGLOG_DEBUG( "Assimilate up to next block, which is FREE\n" ); + DBGLOGS_DEBUG( "Assimilate up to next block, which is FREE\n" ); /* Disconnect the next block from the FREE list */ @@ -315,7 +315,7 @@ static void umm_free_core( void *ptr ) { if( UMM_NBLOCK(UMM_PBLOCK(c)) & UMM_FREELIST_MASK ) { - DBGLOG_DEBUG( "Assimilate down to previous block, which is FREE\n" ); + DBGLOGS_DEBUG( "Assimilate down to previous block, which is FREE\n" ); c = umm_assimilate_down(c, UMM_FREELIST_MASK); } else { @@ -325,7 +325,7 @@ static void umm_free_core( void *ptr ) { */ UMM_FRAGMENTATION_METRIC_ADD(c); - DBGLOG_DEBUG( "Just add to head of free list\n" ); + DBGLOGS_DEBUG( "Just add to head of free list\n" ); UMM_PFREE(UMM_NFREE(0)) = c; UMM_NFREE(c) = UMM_NFREE(0); @@ -347,7 +347,7 @@ void umm_free( void *ptr ) { /* If we're being asked to free a NULL pointer, well that's just silly! */ if( (void *)0 == ptr ) { - DBGLOG_DEBUG( "free a null pointer -> do nothing\n" ); + DBGLOGS_DEBUG( "free a null pointer -> do nothing\n" ); return; } @@ -492,7 +492,7 @@ void *umm_malloc( size_t size ) { */ if( 0 == size ) { - DBGLOG_DEBUG( "malloc a block of 0 bytes -> do nothing\n" ); + DBGLOGS_DEBUG( "malloc a block of 0 bytes -> do nothing\n" ); return( ptr ); } @@ -534,7 +534,7 @@ void *umm_realloc( void *ptr, size_t size ) { */ if( ((void *)NULL == ptr) ) { - DBGLOG_DEBUG( "realloc the NULL pointer - call malloc()\n" ); + DBGLOGS_DEBUG( "realloc the NULL pointer - call malloc()\n" ); return( umm_malloc(size) ); } @@ -546,7 +546,7 @@ void *umm_realloc( void *ptr, size_t size ) { */ if( 0 == size ) { - DBGLOG_DEBUG( "realloc to 0 size, just free the block\n" ); + DBGLOGS_DEBUG( "realloc to 0 size, just free the block\n" ); umm_free( ptr );