Files
nuttx-apps/interpreters/python/patch/0012-hack-place-_PyRuntime-structure-into-PSRAM-bss-regio.patch
Tiago Medicci c83e17c083 interpreters/python: Fix symbol collision with list_length function
NuttX implements a function with the same name which may end up
being included whenever `CONFIG_MM_KERNEL_HEAP` is set. To avoid
it, insert a prefix to it on Python's implementation.

Please note that the other patches had their metadata updated too.
2025-07-22 14:18:23 +08:00

55 lines
1.9 KiB
Diff

From 70538c2ec3e59df6ce1e767e53908a9cad361f05 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/14] 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.50.0