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


--- 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.*")
@@ -225,7 +242,7 @@ SECTIONS
 
 #include <zephyr/linker/cplusplus-rom.ld>
 
-#if defined(CONFIG_BUILD_ALIGN_LMA) || !defined(CONFIG_XIP)
+#if defined(CONFIG_BUILD_ALIGN_LMA) ||  !defined(CONFIG_XIP)
     /*
      * Include a padding section here to make sure that the LMA address
      * of the sections in the RAMABLE_REGION are aligned with those
@@ -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,,)
+       {
+       __rodata_region_end = .;
+       LONG(0xFFFFFFFF);
+       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));
@@ -301,7 +325,6 @@ SECTIONS
 #include <linker_sram_data_relocate.ld>
 #endif
        __data_end = .;
-
        } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
     __data_size = __data_end - __data_start;
     __data_load_start = LOADADDR(_DATA_SECTION_NAME);
@@ -334,7 +357,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 +396,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)


Разделы:
Idx Name          Разм      VMA       LMA       Фа  смещ.  Выр.
  0 rom_start     00002278  80000000  60000000  00000118  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 text          000048f0  80002278  60002278  00002390  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .ARM.exidx    00000008  80006b68  60006b68  00006c80  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 initlevel     00000058  80006b70  60006b70  00006c88  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 device_area   000000c0  80006bc8  60006bc8  00006ce0  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 sw_isr_table  00000470  80006c88  60006c88  00006da0  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 gpio_driver_api_area 00000024  800070f8  600070f8  00007210  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 clock_control_driver_api_area 0000001c  8000711c  6000711c  00007234  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 uart_driver_api_area 00000014  80007138  60007138  00007250  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 tbss          00000004  8000714c  6000714c  00007264  2**2
                  ALLOC, THREAD_LOCAL
 10 rodata        0000111c  80007150  60007150  00007268  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 11 padding_section 00007d94  8000826c  6000826c  00008384  2**0
                  CONTENTS, ALLOC, LOAD, DATA
 12 .ramfunc      00000000  81000000  81000000  00010148  2**0
                  CONTENTS
 13 datas         00000020  81000000  60010000  00010118  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 14 device_states 0000000c  81000020  60010020  00010138  2**0
                  CONTENTS, ALLOC, LOAD, DATA
 15 .comment      00000020  00000000  00000000  00010148  2**0
                  CONTENTS, READONLY
 16 .debug_aranges 00001028  00000000  00000000  00010168  2**3
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 17 .debug_info   00030c3d  00000000  00000000  00011190  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 18 .debug_abbrev 00008bea  00000000  00000000  00041dcd  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 19 .debug_line   00019c66  00000000  00000000  0004a9b7  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 20 .debug_frame  00002638  00000000  00000000  00064620  2**2
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 21 .debug_str    0000b0e1  00000000  00000000  00066c58  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 22 .debug_loc    00012158  00000000  00000000  00071d39  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 23 .debug_ranges 00002fb8  00000000  00000000  00083e98  2**3
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 24 .ARM.attributes 00000032  00000000  00000000  00086e50  2**0
                  CONTENTS, READONLY
 25 .last_section 00000004  80010000  6001002c  00010144  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 26 bss           00000247  81000030  60010034  00010148  2**3
                  ALLOC
 27 noinit        00000e00  81000280  81000280  00010180  2**6
                  ALLOC
проблема осталась только в last_section - а именно 80010000 должен быть как 8001002c. Может можно VMA выровнять как LMA?