From 950f651af931e3299b8b39508d403df8c5a1f4a9 Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 30 May 2014 16:14:54 +0200 Subject: [PATCH] BMP are read on the stack to avoid a malloc. Lua memory displayed when pressing [Menu Long] --- radio/src/bmp.cpp | 6 +----- radio/src/lcd.cpp | 2 +- radio/src/lcd.h | 3 +-- radio/src/lua.cpp | 42 +++++++++++++++++++++++++++--------------- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/radio/src/bmp.cpp b/radio/src/bmp.cpp index 729273134..f0b7c7a30 100644 --- a/radio/src/bmp.cpp +++ b/radio/src/bmp.cpp @@ -36,7 +36,7 @@ #include "opentx.h" -const pm_char * bmpLoad(bmp_ptr_t &bmp, const char *filename, const xcoord_t width, const uint8_t height) +const pm_char * bmpLoad(uint8_t *bmp, const char *filename, const xcoord_t width, const uint8_t height) { FIL bmpFile; UINT read; @@ -147,10 +147,6 @@ const pm_char * bmpLoad(bmp_ptr_t &bmp, const char *filename, const xcoord_t wid } } - if (bmp == NULL) { - bmp = (uint8_t *)malloc(2+w*((h+7)/8)*4); - } - uint8_t *dest = bmp; *dest++ = w; diff --git a/radio/src/lcd.cpp b/radio/src/lcd.cpp index faf3b54fa..0072886f2 100644 --- a/radio/src/lcd.cpp +++ b/radio/src/lcd.cpp @@ -803,7 +803,7 @@ void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat, LcdFlags att) void lcd_vline(xcoord_t x, int8_t y, int8_t h) { - lcd_vlineStip(x, y, h, 0xff); + lcd_vlineStip(x, y, h, SOLID); } void lcd_invert_line(int8_t y) diff --git a/radio/src/lcd.h b/radio/src/lcd.h index 0f2ae9e34..a324a9ba2 100644 --- a/radio/src/lcd.h +++ b/radio/src/lcd.h @@ -257,8 +257,7 @@ void lcdSetContrast(); void lcdRefresh(); #if defined(PCBTARANIS) - typedef uint8_t * bmp_ptr_t; - const pm_char * bmpLoad(bmp_ptr_t &dest, const char *filename, const xcoord_t width, const uint8_t height); + const pm_char * bmpLoad(uint8_t *dest, const char *filename, const xcoord_t width, const uint8_t height); #endif #if defined(BOOT) diff --git a/radio/src/lua.cpp b/radio/src/lua.cpp index c289ce61b..ad7485702 100644 --- a/radio/src/lua.cpp +++ b/radio/src/lua.cpp @@ -277,12 +277,10 @@ static int luaLcdDrawPixmap(lua_State *L) int x = luaL_checkinteger(L, 1); int y = luaL_checkinteger(L, 2); const char * filename = luaL_checkstring(L, 3); - // TODO int att = luaL_checkinteger(L, 4); - bmp_ptr_t bitmap = 0; - const pm_char * error = bmpLoad(bitmap, filename, LCD_W, LCD_H); - if (bitmap && !error) { + uint8_t bitmap[2+LCD_W/2*LCD_H/2]; // width max is LCD_W/2 pixels for saving stack and avoid a malloc here + const pm_char * error = bmpLoad(bitmap, filename, LCD_W/2, LCD_H); + if (!error) { lcd_bmp(x, y, bitmap); - free(bitmap); } return 0; } @@ -1242,6 +1240,7 @@ void luaExec(const char *filename) void luaTask(uint8_t evt) { lcd_locked = false; + static uint8_t luaDisplayStatistics = false; if (luaState & LUASTATE_STANDALONE_SCRIPT_RUNNING) { // standalone script @@ -1271,18 +1270,20 @@ void luaTask(uint8_t evt) else { int scriptResult = lua_tointeger(L, -1); lua_pop(L, 1); /* pop returned value */ - if (scriptResult == 0) { - if (lua_gc(L, LUA_GCCOUNT, 0) > SCRIPTS_MAX_HEAP) { - TRACE("Script memory leak"); - standaloneScript.state = SCRIPT_LEAK; - luaState = LUASTATE_RELOAD_MODEL_SCRIPTS; - } - } - else { + if (scriptResult != 0) { TRACE("Script finished with status %d", scriptResult); standaloneScript.state = SCRIPT_NOFILE; luaState = LUASTATE_RELOAD_MODEL_SCRIPTS; } + else if (luaDisplayStatistics) { + int gc = 1000*lua_gc(L, LUA_GCCOUNT, 0) + lua_gc(L, LUA_GCCOUNTB, 0); + lcd_hline(0, 7*FH-1, lcdLastPos+FW, ERASE); + lcd_puts(0, 7*FH, "GV Use: "); + lcd_outdezAtt(lcdLastPos, 7*FH, gc, LEFT); + lcd_putc(lcdLastPos, 7*FH, 'b'); + lcd_hline(0, 7*FH-2, lcdLastPos+FW, FORCE); + lcd_vlineStip(lcdLastPos+FW, 7*FH-2, FH+2, SOLID, FORCE); + } } } else { @@ -1301,6 +1302,10 @@ void luaTask(uint8_t evt) standaloneScript.state = SCRIPT_NOFILE; luaState = LUASTATE_RELOAD_MODEL_SCRIPTS; } + else if (evt == EVT_KEY_LONG(KEY_MENU)) { + killEvents(evt); + luaDisplayStatistics = !luaDisplayStatistics; + } } } else { @@ -1376,7 +1381,14 @@ void luaTask(uint8_t evt) } } - // TRACE("Before GC COLLECT gc=%d", lua_gc(L, LUA_GCCOUNT, 0)); lua_gc(L, LUA_GCCOLLECT, 0); - // TRACE("After GC COLLECT gc=%d", lua_gc(L, LUA_GCCOUNT, 0)); + +#if defined(SIMU) || defined(DEBUG) + static int lastgc = 0; + int gc = 1000*lua_gc(L, LUA_GCCOUNT, 0) + lua_gc(L, LUA_GCCOUNTB, 0); + if (gc != lastgc) { + lastgc = gc; + TRACE("GC Use: %dbytes", gc); + } +#endif }