Загрузка данных


--- a/include/zephyr/arch/arm/cortex_m/scripts/linker.ld
+++ b/include/zephyr/arch/arm/cortex_m/scripts/linker.ld
@@ -87,6 +87,9 @@ MEMORY
 #endif
     FLASH (rx) : ORIGIN = ROM_ADDR, LENGTH = ROM_SIZE
     RAM   (wx) : ORIGIN = RAM_ADDR, LENGTH = RAM_SIZE
+#if defined(CONFIG_SDRAM_LMA_ADJUST)
+    NXP_FLASH_LMA (rx) : ORIGIN = 0x60000000, LENGTH = 4M
+#endif
 #if defined(CONFIG_LINKER_DEVNULL_MEMORY)
     DEVNULL_ROM (rx) : ORIGIN = DEVNULL_ADDR, LENGTH = DEVNULL_SIZE
 #endif
@@ -95,6 +98,17 @@ MEMORY
     IDT_LIST (wx) : ORIGIN = 0xFFFF7FFF, LENGTH = 32K
     }
 
+#define GROUP_LINK_IN_AT(where) > where
+#if defined(CONFIG_SDRAM_LMA_ADJUST)
+#undef GROUP_ROM_LINK_IN
+#undef GROUP_DATA_LINK_IN
+#undef GROUP_LINK_IN
+
+#define GROUP_ROM_LINK_IN(vregion, lregion) > lregion AT> NXP_FLASH_LMA
+#define GROUP_DATA_LINK_IN(vregion, lregion) > vregion AT> NXP_FLASH_LMA
+#define GROUP_LINK_IN(where) > where AT> NXP_FLASH_LMA
+#endif
+
 ENTRY(CONFIG_KERNEL_ENTRY)
 
 SECTIONS
@@ -198,6 +212,9 @@ SECTIONS
 #include <zephyr/linker/thread-local-storage.ld>
 
     SECTION_PROLOGUE(_RODATA_SECTION_NAME,,)
+#if defined(CONFIG_SDRAM_LMA_ADJUST)
+       ALIGN_WITH_INPUT
+#endif
        {
        *(.rodata)
        *(".rodata.*")
@@ -236,6 +253,13 @@ SECTIONS
        __rodata_region_end = .;
        MPU_ALIGN(__rodata_region_end - ADDR(rom_start));
        } GROUP_LINK_IN(ROMABLE_REGION)
+#elif defined(CONFIG_SDRAM_LMA_ADJUST)
+    SECTION_PROLOGUE(padding_section,,)
+       {
+       LONG(0xFFFFFFFF);
+       __rodata_region_end = .;
+       MPU_ALIGN(__rodata_region_end - ADDR(rom_start));
+       } GROUP_LINK_IN(ROMABLE_REGION)
 #else
        __rodata_region_end = .;
        MPU_ALIGN(__rodata_region_end - ADDR(rom_start));
@@ -334,7 +358,7 @@ GROUP_START(ITCM)
 #include <snippets-itcm-section.ld>
 
                __itcm_end = .;
-       } GROUP_LINK_IN(ITCM AT> ROMABLE_REGION)
+       } GROUP_LINK_IN_AT(ITCM AT> ROMABLE_REGION)
 
        __itcm_size = __itcm_end - __itcm_start;
        __itcm_load_start = LOADADDR(_ITCM_SECTION_NAME);
@@ -373,7 +397,7 @@ GROUP_START(DTCM)
 #include <snippets-dtcm-section.ld>
 
                __dtcm_data_end = .;
-       } GROUP_LINK_IN(DTCM AT> ROMABLE_REGION)
+       } GROUP_LINK_IN_AT(DTCM AT> ROMABLE_REGION)
 
        __dtcm_end = .;
 
@@ -410,16 +434,27 @@ GROUP_END(DTCM)
     LINKER_DT_SECTIONS()
 
 /* Must be last in romable region */
+#if !defined(CONFIG_SDRAM_LMA_ADJUST)
 SECTION_PROLOGUE(.last_section,,)
 {
   /* .last_section contains a fixed word to ensure location counter and actual
    * rom region data usage match when CONFIG_LINKER_LAST_SECTION_ID=y. */
   KEEP(*(.last_section))
 } GROUP_LINK_IN(ROMABLE_REGION)
+#else
+  .last_section (0x80000000 + (LOADADDR(device_states) + SIZEOF(device_states) - 0x60000000)) : 
+  {
+    KEEP(*(.last_section))
+  } GROUP_LINK_IN(ROMABLE_REGION)
+#endif
 
 /* To provide the image size as a const expression,
  * calculate this value here. */
+ #if !defined(CONFIG_SDRAM_LMA_ADJUST)
 _flash_used = LOADADDR(.last_section) + SIZEOF(.last_section) - __rom_region_start;
+#else
+_flash_used = ADDR(.last_section) + SIZEOF(.last_section) - __rom_region_start;
+#endif

Этот вариант заработал, единственное узкое место, это привязка last_section к device_states. Если код поменяется, это перестанет работать