nuttx-apps/interpreters/python/patch/0012-hack-place-_PyRuntime-structure-into-PSRAM-bss-regio.patch
Tiago Medicci db8542d2b1 interpreters/python: fix patch to set _PyRuntime attribute
This commit also adds the check for the `__NuttX__` macro to the
patch file that allows setting an attribute to the `_PyRuntime`
structure. The `__NuttX__` macro is guaranteed to be present when
building any application for NuttX.
2025-02-14 20:53:07 +08:00

55 lines
1.9 KiB
Diff

From 79b6142580bad5235588faf38c0a22c7280a2d1b Mon Sep 17 00:00:00 2001
From: Ivan Grokhotkov <ivan@espressif.com>
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 <tiago.medicci@espressif.com>
---
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