From 37e73894f1308cb39953a76cca34e1c06fa05519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Th=C3=A9baudeau?= Date: Thu, 19 Dec 2013 21:30:35 +0100 Subject: [PATCH] cc2538: Move SoC data to a dedicated section to save space MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some SoC data requires huge alignments. E.g., the µDMA channel control table has to be 1024-byte aligned. This table was simply aligned to 1024 bytes in the C code, which had the following consequences, wasting a lot of RAM: - As this table could be placed anywhere in .bss, there could be an alignment gap of up to 1023 bytes between the preceding data and this table. - The size of this table was also aligned to 1024 bytes, regardless of UDMA_CONF_MAX_CHANNEL, making this configuration option supposed to save RAM just useless. - .bss was also aligned to at least 1024 bytes, creating a huge alignment gap between .data and .bss. Instead of relying on the compiler to force this alignment, and on the linker to automatically place data, this change places carefully such SoC data in RAM using the linker script. A dedicated section is created to place such SoC data requiring huge alignments, and it is put at the beginning of the SRAM in order to ensure a maximal alignment without any gap. In this way, the alignment of .bss also remains normal, and the size of this table is not constrained by its alignment, but only by its contents (i.e. by UDMA_CONF_MAX_CHANNEL). In the case of the µDMA channel control table, the data is still zeroed by udma_init() (instead of also being zeroed as part of .bss). Signed-off-by: Benoît Thébaudeau --- cpu/cc2538/cc2538.lds | 5 +++++ cpu/cc2538/dev/udma.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cpu/cc2538/cc2538.lds b/cpu/cc2538/cc2538.lds index df4fa2784..fd09ee9b7 100644 --- a/cpu/cc2538/cc2538.lds +++ b/cpu/cc2538/cc2538.lds @@ -64,6 +64,11 @@ SECTIONS _etext = .; } > FLASH= 0 + .socdata (NOLOAD) : + { + *(.udma_channel_control_table) + } > SRAM + .data : { _data = .; diff --git a/cpu/cc2538/dev/udma.c b/cpu/cc2538/dev/udma.c index af30b1436..c285d1b11 100644 --- a/cpu/cc2538/dev/udma.c +++ b/cpu/cc2538/dev/udma.c @@ -51,7 +51,7 @@ struct channel_ctrl { }; static volatile struct channel_ctrl channel_config[UDMA_CONF_MAX_CHANNEL + 1] - __attribute__ ((aligned(1024))); + __attribute__ ((section(".udma_channel_control_table"))); /*---------------------------------------------------------------------------*/ void udma_init()