From 12dfa8a87f7ba3a5412654c96630395f6be76837 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Thu, 30 Jul 2026 19:05:16 +0200 Subject: [PATCH] Optimize RAM usage by making lookup tables const --- App/app/action.c | 2 +- App/app/app.c | 2 +- App/app/spectrum.c | 4 ++-- App/driver/st7565.c | 2 +- App/ui/main.c | 2 +- App/ui/ui.c | 2 +- archive/f4hwn.fusion.development.bin | Bin 104068 -> 104064 bytes 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/App/app/action.c b/App/app/action.c index d4468e32..1811260f 100644 --- a/App/app/action.c +++ b/App/app/action.c @@ -61,7 +61,7 @@ inline static void ACTION_1750() { ACTION_AlarmOr1750(true); }; inline static void ACTION_ScanRestart() { ACTION_Scan(true); }; -void (*action_opt_table[])(void) = { +void (*const action_opt_table[])(void) = { [ACTION_OPT_NONE] = &FUNCTION_NOP, [ACTION_OPT_POWER] = &ACTION_Power, [ACTION_OPT_MONITOR] = &ACTION_Monitor, diff --git a/App/app/app.c b/App/app/app.c index e81e09ba..175e52e3 100644 --- a/App/app/app.c +++ b/App/app/app.c @@ -107,7 +107,7 @@ static KEY_Code_t gScreenSaverWakeKey = KEY_INVALID; static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); -void (*ProcessKeysFunctions[])(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) = { +void (*const ProcessKeysFunctions[])(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) = { [DISPLAY_MAIN] = &MAIN_ProcessKeys, [DISPLAY_MENU] = &MENU_ProcessKeys, [DISPLAY_SCANNER] = &SCANNER_ProcessKeys, diff --git a/App/app/spectrum.c b/App/app/spectrum.c index 29b51a52..d4830b07 100644 --- a/App/app/spectrum.c +++ b/App/app/spectrum.c @@ -73,7 +73,7 @@ static uint16_t blacklistFreqs[15]; static uint8_t blacklistFreqsIdx; #endif -const char *bwOptions[] = {"25", "12.5", "6.25"}; +const char *const bwOptions[] = {"25", "12.5", "6.25"}; const uint8_t modulationTypeTuneSteps[] = {100, 50, 10}; const uint8_t modTypeReg47Values[] = {1, 7, 5}; @@ -176,7 +176,7 @@ char freqInputString[11]; uint8_t menuState = 0; uint16_t listenT = 0; -RegisterSpec registerSpecs[] = { +const RegisterSpec registerSpecs[] = { {}, {"LNAs", BK4819_REG_13, 8, 0b11, 1}, {"LNA", BK4819_REG_13, 5, 0b111, 1}, diff --git a/App/driver/st7565.c b/App/driver/st7565.c index c488bb68..23d93e48 100644 --- a/App/driver/st7565.c +++ b/App/driver/st7565.c @@ -260,7 +260,7 @@ void ST7565_FillScreen(uint8_t value) // D=0, display OFF #define ST7565_CMD_DISPLAY_ON_OFF 0xAE -uint8_t cmds[] = { +const uint8_t cmds[] = { ST7565_CMD_BIAS_SELECT | 0, // Select bias setting: 1/9 ST7565_CMD_COM_DIRECTION | (0 << 3), // Set output direction of COM: normal ST7565_CMD_SEG_DIRECTION | 1, // Set scan direction of SEG: reverse diff --git a/App/ui/main.c b/App/ui/main.c index 293d8322..f36cf878 100644 --- a/App/ui/main.c +++ b/App/ui/main.c @@ -140,7 +140,7 @@ static void UI_MAIN_DrawBeamLine(void) } #endif -const char *VfoStateStr[] = { +const char *const VfoStateStr[] = { [VFO_STATE_NORMAL]="", [VFO_STATE_BUSY]="BUSY", [VFO_STATE_BAT_LOW]="BAT LOW", diff --git a/App/ui/ui.c b/App/ui/ui.c index 116fa962..489c7613 100644 --- a/App/ui/ui.c +++ b/App/ui/ui.c @@ -48,7 +48,7 @@ bool gAskToSave; bool gAskToDelete; -void (*UI_DisplayFunctions[])(void) = { +void (*const UI_DisplayFunctions[])(void) = { [DISPLAY_MAIN] = &UI_DisplayMain, [DISPLAY_MENU] = &UI_DisplayMenu, [DISPLAY_SCANNER] = &UI_DisplayScanner, diff --git a/archive/f4hwn.fusion.development.bin b/archive/f4hwn.fusion.development.bin index 242c0493eedbfd55735aae677b400ba713381791..1a80d5cfc20541921c3d6b1a7b2e4bc74e347419 100755 GIT binary patch delta 13864 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 M1%T6Qg`6k<8|xa+y#N3J