Загрузка данных
--- 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?