Files
typewriter/firmware/sdkconfig.defaults
Julien Calixte 15955a13f4 refactor(firmware): run git on a dedicated large-stack thread
libgit2's init→push chain is deeply stack-hungry (~67 KB measured for a
trivial config write; the push is deeper). Spike 7 sized the shared main
task stack at 96 KB for it, which forced the editor build to over-reserve
~80 KB.

Move git_publish onto its own std::thread (GIT_STACK = 96 KB via
Builder::stack_size) and join it from main. This lets
CONFIG_ESP_MAIN_TASK_STACK_SIZE drop back to 12288 — the Spike-6 value
proven to run the editor plus a TLS-on-main handshake — so the editor no
longer pays for git's stack.

Hardware-verified: the push ran off-main (mbedTLS + FATFS) with no panic,
no stack overflow, and no ENOMEM on the 96 KB spawn. This retires the
earlier "time() only works on the main task" misdiagnosis for good — it
was always the default 4 KB pthread stack overflowing, never thread-vs-main.
2026-07-06 23:46:55 +02:00

59 lines
3.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Rust often needs a bit of an extra main task stack size compared to C (the default is 3K)
# You might have to increase this further if you allocate large stack variables in the main task.
# Bumped for the TLS handshake (Spike 6): mbedtls runs on the calling task and
# wants several KB of stack on top of the app's own usage. 12 KB ran the editor
# AND a full TLS-on-main handshake on hardware — the last-known-good value for
# this shared stack.
#
# Spike 7 briefly bumped this to 96 KB because libgit2's push chain is far deeper
# (~67 KB measured for a trivial config write: nearly every function puts a 4 KB
# `char path[GIT_PATH_MAX]` on the stack and init→config→FATFS→wear-leveling
# nests ~10 deep). But this sdkconfig is SHARED with the editor build, so that
# forced the editor to over-reserve ~80 KB for nothing. Git now runs on its own
# large-stack thread instead (git_push.rs — GIT_STACK via
# std::thread::Builder::stack_size), so this drops back to the Spike-6 value.
# (The "time() only works on the main task" theory was a misdiagnosis: that
# iteration ran git on a std::thread with the DEFAULT 4 KB stack and just
# overflowed sooner — it was always stack depth, never thread-vs-main.)
CONFIG_ESP_MAIN_TASK_STACK_SIZE=12288
# Increase a bit these stack sizes as they are also a bit too small by default
CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=4096
CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=4096
# You might have to increase this further if you spawn your own Rust threads
# that allocate large stack variables; or better yet - use
# `std::thread::Builder::new().stack_size(XXX)` for spawning
CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=4096
# Raise the compile-time log ceiling so the sdmmc/sdspi drivers' per-command
# DEBUG logs (the raw R1 response bytes) are built in. Runtime level stays INFO
# by default; the SD spike bumps just the sdmmc/sdspi tags to DEBUG so we can see
# exactly what each init command returns. (Diagnostic for Spike 3 init failures.)
CONFIG_LOG_MAXIMUM_LEVEL_DEBUG=y
# FatFS long filenames (Spike 3 — SD). Default is 8.3-only, which rejects the
# persistence module's atomic-save temp name (`notes.md.tmp` has two dots).
# LFN on the heap keeps the working buffer off the (small) task stack.
CONFIG_FATFS_LFN_HEAP=y
# PSRAM (Spike 7 — the git working set needs it; the docs memory plan budgets
# ~1.5 MB PSRAM for pack/delta work, and the rope buffer lives there too). This
# board is an ESP32-S3-WROOM-1-N16R8 → 8 MB *octal* PSRAM, so OCT mode is
# required (quad would fail to init). USE_MALLOC adds PSRAM to the heap
# allocator, so large allocations (Box, Rope, libgit2 buffers) land there
# instead of the ~339 KB internal DRAM Spike 6 measured. Octal PSRAM occupies
# GPIO 3337; the EPD/SD pins (413) deliberately avoid that range, so no wiring
# conflict. Speed left at the 40 MHz default (safe first-enable; 80 MHz needs
# matching flash-freq config and is a later tuning step).
CONFIG_SPIRAM=y
CONFIG_SPIRAM_MODE_OCT=y
CONFIG_SPIRAM_USE_MALLOC=y
# TLS trust store (Spike 6 — Wi-Fi + TLS, the gate for Spike 7 git push).
# The certificate bundle backs esp_crt_bundle_attach so an HTTPS GET to
# api.github.com validates against real roots. FULL rather than the common
# subset so a less common CA in the chain can't surprise us on the bench.
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y