From 79b6142580bad5235588faf38c0a22c7280a2d1b Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Wed, 23 Oct 2024 16:52:52 +0200 Subject: [PATCH 12/13] hack: place _PyRuntime structure into PSRAM bss region, initialize later _PyRuntime occupies around 100kB of RAM in .data region, making it hard to fit the interpreter into the available static RAM. This patch moves it into PSRAM using section attribute. Normally we shouldn't need this as we can specify placements in ldfragments, however in this specific case I couldn't get it to work. Since the structure is now in .bss, add a function which will assign it the initial value. The proper fix might be to support .data segment on PSRAM in IDF, as well as to fix whatever ldgen issue prevents this variable from being moved to PSRAM. Co-authored-by: Tiago Medicci Serrano --- Python/pylifecycle.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 1701a1cd217..93aa808bc03 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -102,12 +102,23 @@ __attribute__(( _PyRuntimeState _PyRuntime #if defined(__linux__) && (defined(__GNUC__) || defined(__clang__)) __attribute__ ((section (".PyRuntime"))) +#elif defined(ESP_PLATFORM) || defined(__NuttX__) +__attribute__ ((section (".PyRuntime"))) #endif = _PyRuntimeState_INIT(_PyRuntime, _Py_Debug_Cookie); _Py_COMP_DIAG_POP static int runtime_initialized = 0; +void _PyRuntime_Early_Init(void) { +#if defined(ESP_PLATFORM) || defined(__NuttX__) + // Normally, _PyRuntime is in .data and is initialized by the C runtime. + // This function allows us to place it into external RAM .bss section + // and initialize it manually, saving some internal RAM. + _PyRuntime = (struct pyruntimestate) _PyRuntimeState_INIT(_PyRuntime, _Py_Debug_Cookie); +#endif +} + PyStatus _PyRuntime_Initialize(void) { -- 2.48.1