From a322ed369c323f36b9f07f73e10b58dcd43a9dd8 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Thu, 24 Sep 2026 07:47:15 +0800 Subject: [PATCH] fix(ram): pack Global.c statics to fit SRAM (was 8 bytes short) Shrink even-beat stop tick to 32-bit and fold univ/expert/free flags into single bytes. Co-authored-by: Cursor --- Global/Global.c | 84 +++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 44 deletions(-) diff --git a/Global/Global.c b/Global/Global.c index 2ecb850..54775a4 100644 --- a/Global/Global.c +++ b/Global/Global.c @@ -647,9 +647,9 @@ void Accomp_ApplyDefaultIChord(void) PressFlag = 0; } -/* 专业模式按停止键时记住当前调性,供普通模式无指板拨片起奏使用 */ -static uint8_t s_expert_stop_transpose = 0; -static uint8_t s_expert_stop_transpose_valid = 0; +/* 专业模式按停止键时记住当前调性,供普通模式无指板拨片起奏使用。 + * 0xFF=尚未在专业停过;移调合法值 0~11。 */ +static uint8_t s_expert_stop_transpose = 0xFFu; static void Expert_RememberStopTranspose(void) { @@ -657,16 +657,13 @@ static void Expert_RememberStopTranspose(void) uint8_t last = (uint8_t)mGuiData[GUI_TAB_LAST_INDEX].Current; if (tab == 1 || (tab == 3 && last == 1)) - { s_expert_stop_transpose = (uint8_t)mGuiData[GUI_TRANSPOSE].Current; - s_expert_stop_transpose_valid = 1; - } } /* 普通无指板拨片:套用上次专业停键调性(无记录则保持当前移调) */ static void FreeMode_ApplyExpertStopTranspose(void) { - if (!s_expert_stop_transpose_valid) + if (s_expert_stop_transpose == 0xFFu) return; if ((uint8_t)mGuiData[GUI_TRANSPOSE].Current == s_expert_stop_transpose) return; @@ -695,9 +692,10 @@ void Accomp_UpdatePlayingChord(void) /* 尾奏期间冻结走向灯:保持全绿,避免 LOOP_LIGHT 按小节刷红 */ static uint8_t s_outro_led_all_green = 0; -/* 万能拨片:前奏播完后再切入 piece 段落1 循环 */ -static uint8_t s_univ_piece_after_preamble = 0; -static uint8_t s_univ_saw_preamble_stage = 0; +/* 万能拨片:bit0=等前奏后进 piece,bit1=已见前奏舞台(省 RAM) */ +static uint8_t s_univ_preamble_flags = 0; +#define UNIV_PRE_WAIT_PIECE 0x01u +#define UNIV_PRE_SAW_STAGE 0x02u /* libAutoBand m_ABSystem:+0x59 舞台,+0x50 小节相位。 * 前奏挂起舞台 0x0E、尾奏挂起舞台 0x0B 都要等相位对上小节线才真正切入。 @@ -769,8 +767,7 @@ static void Univ_StartWithPreamble(uint8_t *notes, uint8_t n) Band_SyncStartRetry(); wk_delay_ms(50); Accomp_FireSectionNotes(); - s_univ_saw_preamble_stage = 0; - s_univ_piece_after_preamble = 1; + s_univ_preamble_flags = UNIV_PRE_WAIT_PIECE; } /* 前奏舞台结束后切入 piece 段落1 并保持 loop。 */ @@ -781,14 +778,13 @@ static void Univ_PollEnterPieceAfterPreamble(void) uint8_t note_cnt; uint8_t chord_id; - if (!s_univ_piece_after_preamble || !StartFlag) + if (!(s_univ_preamble_flags & UNIV_PRE_WAIT_PIECE) || !StartFlag) return; if (mGuiData[GUI_TAB_INDEX].Current != 0 && !(mGuiData[GUI_TAB_INDEX].Current == 3 && mGuiData[GUI_TAB_LAST_INDEX].Current == 0)) { - s_univ_piece_after_preamble = 0; - s_univ_saw_preamble_stage = 0; + s_univ_preamble_flags = 0; return; } @@ -796,16 +792,15 @@ static void Univ_PollEnterPieceAfterPreamble(void) /* 前奏挂起/前奏中:记下已进入前奏,继续等播完 */ if (st == AB_STAGE_PRE_WAIT || st == AB_STAGE_PRE) { - s_univ_saw_preamble_stage = 1; + s_univ_preamble_flags |= UNIV_PRE_SAW_STAGE; return; } /* 尚未见到前奏舞台:若已到 Run(5) 说明空前奏被跳过,可进 piece; * 其它启动中舞台继续等,避免冷启动抢先切入 piece 砍掉前奏。 */ - if (!s_univ_saw_preamble_stage && st != 5u) + if (!(s_univ_preamble_flags & UNIV_PRE_SAW_STAGE) && st != 5u) return; - s_univ_piece_after_preamble = 0; - s_univ_saw_preamble_stage = 0; + s_univ_preamble_flags = 0; AutoBandTop1_SetRunVar(0); AutoBandTop1_SetPiecePlayMode(1, 0, 480); AutoBandTop1_SetLoopMode(0, 1); @@ -834,8 +829,7 @@ void AutoBand_StartOutro(void) { uint8_t was_playing = StartFlag; - s_univ_piece_after_preamble = 0; - s_univ_saw_preamble_stage = 0; + s_univ_preamble_flags = 0; if (KEY_ID_1629 == 0 || KEY_ID_1629 == 22 || KEY_ID_1629 == 23) Accomp_ApplyDefaultIChord(); @@ -1001,23 +995,23 @@ void Tap_to_Speed() #define FREE_BEAT_TICKS 480u #define FREE_PIECE_TICKS 1920u -static uint8_t s_free_even_stop_arm = 0; -static uint64_t s_free_even_stop_tick = 0; -static int s_free_even_stop_beat = 2; /* 目标偶拍 2 或 4 */ -static uint8_t s_free_even_seen_target = 0; +static uint32_t s_free_even_stop_tick = 0; +static uint8_t s_free_even_stop_beat = 2; /* 目标偶拍 2 或 4 */ +static uint8_t s_free_even_flags = 0; /* bit0=armed bit1=seen target */ +#define FREE_EVEN_ARM 0x01u +#define FREE_EVEN_SEEN 0x02u static void FreeMode_CancelEvenBeatStop(void) { - s_free_even_stop_arm = 0; + s_free_even_flags = 0; s_free_even_stop_tick = 0; s_free_even_stop_beat = 2; - s_free_even_seen_target = 0; } /* 再次按住指板:取消待停并恢复 piece 循环 */ static void FreeMode_ResumePieceLoop(void) { - if (!s_free_even_stop_arm) + if (!(s_free_even_flags & FREE_EVEN_ARM)) return; FreeMode_CancelEvenBeatStop(); if (StartFlag && mGuiData[GUI_TAB_INDEX].Current == 2 && @@ -1046,17 +1040,20 @@ static void FreeMode_ArmEvenBeatStop(void) beat = 1; /* 拍1→2,拍2→2,拍3→4,拍4→4 */ target = ((beat + 1) / 2) * 2; - s_free_even_stop_beat = target; - s_free_even_seen_target = (beat >= target) ? 1u : 0u; - /* ((beat0/2)+1)*2*480 → 拍1/2→960,拍3/4→1920,跨小节同理 */ - s_free_even_stop_tick = - ((play / FREE_BEAT_TICKS) / 2ull + 1ull) * 2ull * (uint64_t)FREE_BEAT_TICKS; - s_free_even_stop_arm = 1; + s_free_even_stop_beat = (uint8_t)target; + s_free_even_flags = FREE_EVEN_ARM | + ((beat >= target) ? FREE_EVEN_SEEN : 0u); + /* ((beat0/2)+1)*2*480 → 拍1/2→960,拍3/4→1920,跨小节同理;piece API 仅 32bit */ + { + uint64_t stop = + ((play / FREE_BEAT_TICKS) / 2ull + 1ull) * 2ull * (uint64_t)FREE_BEAT_TICKS; + s_free_even_stop_tick = (stop > 0xFFFFFFFFull) ? 0xFFFFFFFFu : (uint32_t)stop; + } + s_free_even_flags |= FREE_EVEN_ARM; /* 禁循环并裁 piece,库播到 stop tick 自停;Poll 作兜底 */ AutoBandTop1_SetLoopMode(0, 0); - if (s_free_even_stop_tick <= 0xFFFFFFFFull) - AutoBandTop1_SetPiecePlayMode(1, 0, (uint32_t)s_free_even_stop_tick); + AutoBandTop1_SetPiecePlayMode(1, 0, s_free_even_stop_tick); LOG_I("pick", "free even-stop arm beat=%d target=%d play=%u stop=%u", beat, target, (unsigned)play, (unsigned)s_free_even_stop_tick); @@ -1068,7 +1065,7 @@ void FreeMode_PollEvenBeatStop(void) uint8_t tick_done; uint8_t beat_done; - if (!s_free_even_stop_arm) + if (!(s_free_even_flags & FREE_EVEN_ARM)) return; if (PressFlag || mGuiData[GUI_TAB_INDEX].Current != 2 || !StartFlag) { @@ -1077,10 +1074,11 @@ void FreeMode_PollEvenBeatStop(void) } beat = AutoBandTop1_GetCurrentBeat(); - if (beat == s_free_even_stop_beat) - s_free_even_seen_target = 1; + if (beat == (int)s_free_even_stop_beat) + s_free_even_flags |= FREE_EVEN_SEEN; /* 已到达目标偶拍后离开该拍 = 该拍播完;或 play tick 到点 */ - beat_done = (s_free_even_seen_target && beat != s_free_even_stop_beat && beat != 0) ? 1u : 0u; + beat_done = ((s_free_even_flags & FREE_EVEN_SEEN) && + beat != (int)s_free_even_stop_beat && beat != 0) ? 1u : 0u; tick_done = (AutoBandTop1_GetCurrentPlayTick() >= s_free_even_stop_tick) ? 1u : 0u; if (tick_done || beat_done) @@ -1129,8 +1127,7 @@ void Stop_AutoBand_Soft(void) Band_MarkCleanStopped(); Band_AllNotesOff(); s_outro_led_all_green = 0; - s_univ_piece_after_preamble = 0; - s_univ_saw_preamble_stage = 0; + s_univ_preamble_flags = 0; for (uint8_t i = 0; i < 4; i++) key_toggle[i] = 0; } @@ -1147,8 +1144,7 @@ void Stop_AutoBand() AutoBandTop1_Stop(); Band_AllNotesOff(); s_outro_led_all_green = 0; - s_univ_piece_after_preamble = 0; - s_univ_saw_preamble_stage = 0; + s_univ_preamble_flags = 0; //tick_ever_positive = false; for(uint8_t i = 0;i < 4;i++) key_toggle[i] = 0; }