There is a smart way to fix this problem I learned from the CMSIS package, and is used in our chip for several years. The key idea is create the array directly inside link script, like this: .copy.table : { _scopytable = ABSOLUTE(.); LONG(LOADADDR(.cpram1.data)) LONG(ADDR(.cpram1.data)) LONG(ADDR(.cpram1.data) + SIZEOF(.cpram1.data)) _ecopytable = ABSOLUTE(.); } > flash
.zero.table : { _szerotable = ABSOLUTE(.); LONG(_cpram0_sbss) LONG(_cpram0_ebss) LONG(ADDR(.cpram1.bss)) LONG(ADDR(.cpram1.bss) + SIZEOF(.cpram1.bss)) _ezerotable = ABSOLUTE(.); } > flash And then iterate through these tables in the startup: https://github.com/FishsemiCode/nuttx/blob/song-u1/arch/arm/src/song/song_start.c#L56-L84 https://github.com/FishsemiCode/nuttx/blob/song-u1/arch/arm/src/song/song_start.c#L225-L237 The similar approach can be applied to the heap too. This method can support: 1. Any humber of memory region 2. Only need provide the info in one place(link script) 3. Adjust the boundary automatically by linker On Fri, Mar 26, 2021 at 12:25 PM Fotis Panagiotopoulos <f.j.pa...@gmail.com> wrote: > In my case I define in the linkerscript all regions that "I will ever > need", so they are always there. > The startup code can always find the predetermined symbols. > > If I don't use a region, I set it to DONT_LINK. Since it's size will be 0, > the start up code will ignore it. > > I know, it's not the most elegant solution, but it's simple and working. I > cannot image a system with 50 different heap regions, so it doesn't need to > scale. > > Alternatively, the number (or names) of regions can be a Make.defs list. > Every board has a Make.defs that defines the platform specifics, so it's a > good candidate IMO. > (I think I have done this in the past in a similar way, but I don't have > access to this code anymore). > > > On Fri, Mar 26, 2021, 20:56 Xiang Xiao <xiaoxiang781...@gmail.com> wrote: > > > Fotis, you define many symbols(e.g. __gp_ram?_bss_start__) in your linker > > script. My question is how the common init code knows the number of these > > symbols? > > > > On Fri, Mar 26, 2021 at 9:46 AM Fotis Panagiotopoulos < > f.j.pa...@gmail.com > > > > > wrote: > > > > > Oh, sorry. > > > Attached again as .txt. Is it OK now? > > > > > > > A tool that takes the Kconfig + chip+ memorymap and make a linker > > include > > > > file and the config code for the heap may be the way to go. > > > > > > I am pretty sure that a "tool" will not be able to cover all use cases. > > > Over the years I had to make custom scripts to account for: > > > * Bootloaders > > > * Binary blops > > > * Firmware headers > > > * ROM files > > > * DMA buffers > > > * External memories > > > etc etc.. > > > > > > Do you believe that a tool can be made that can handle everything? > > > > > > > > > Στις Παρ, 26 Μαρ 2021 στις 6:37 μ.μ., ο/η David Sidrane < > > > david.sidr...@nscdg.com> έγραψε: > > > > > >> I am just thinking out load... > > >> > > >> I agree this has to come from one place. But I do think it is just the > > >> linker file. > > >> > > >> Currently we have > > >> The arch memroymap h files have the base addresses, sizes - This is > > >> the > > >> Reference manuals counterpart, it covers all the sub members of the > > chips) > > >> The chip.h files that has sizes - This is the Data Sheet > counterpart, > > it > > >> covers one or more of the sub members of the chips) > > >> The Kconfig - More flexible from a users stand point. > > >> The heap c files - buried semantics - not good > > >> linker file - the boards usage specific. > > >> > > >> I like using the linker file, but Kconfig is build time - no file > > >> modification > > >> > > >> Just moving things to the linker file does not fix the ordering or > > adding > > >> issues. (it is link time not compile time) > > >> > > >> A tool that takes the Kconfig + chip+ memorymap and make a linker > > include > > >> file and the config code for the heap may be the way to go. > > >> > > >> David > > >> > > >> > > >> -----Original Message----- > > >> From: Fotis Panagiotopoulos [mailto:f.j.pa...@gmail.com] > > >> Sent: Friday, March 26, 2021 9:17 AM > > >> To: dev@nuttx.apache.org > > >> Subject: Re: How to ensure HEAP will not overlap static DMA buffer? > > >> > > >> I face similar problems (with a different use case) on an STM32F4. > > >> The thing is that although the linker script belongs to the board > logic > > >> and > > >> thus it is freely customizable, the heap regions are hard-coded in the > > >> arch > > >> files. > > >> > > >> So, I started working on PR #2277 ( > > >> https://github.com/apache/incubator-nuttx/pull/2277), but > > unfortunately I > > >> had to pause the development on this. > > >> The idea is similar to what you describe here. Everything can be > > >> defined > > >> in > > >> the linkerscript (addresses, order, sizeses etc). > > >> > > >> I was thinking a lot of any alternatives on this. I came to the > > conclusion > > >> that Kconfig is the wrong tool for this job. > > >> You lose all compile-time (and CI) checks and can easily be > > misconfigured. > > >> I am also afraid that we will end up with a few dozen "hacks" like > > >> above > > >> or > > >> like STM32_CCMEXCLUDE (I never liked this option....). > > >> And no matter what you do, you will never be able to satisfy any crazy > > >> memory mappings that any project may need. > > >> > > >> A similar issue to this is Issue #2001 ( > > >> https://github.com/apache/incubator-nuttx/issues/2001). > > >> This was my first crash while trying out NuttX :) > > >> In short, there is the assumption that the main stack will always > > >> reside > > >> between BSS and Heap, again being very restrictive. > > >> > > >> > > >> Στις Παρ, 26 Μαρ 2021 στις 5:46 μ.μ., ο/η Nathan Hartman < > > >> hartman.nat...@gmail.com> έγραψε: > > >> > > >> > On Fri, Mar 26, 2021 at 11:41 AM Gregory Nutt <spudan...@gmail.com> > > >> wrote: > > >> > > > >> > > Missing bit of logic: > > >> > > > > >> > > >> Speaking of the linker, is there a way to use a combination of > > the > > >> > > >> linker script and __attribute__ incantations in the code to > > detect > > >> > > >> automatically the size that g_sram4_reserve should be and > > entirely > > >> > > >> eliminate the need for the user to specify the start and end of > > >> each > > >> > > >> region in Kconfig? > > >> > > > > > >> > > > Are you thinking of something like this in the linker script: > > >> > > > > > >> > > > .sram4_reserve : > > >> > > > { > > >> > > > _sram4_reserve_begin = ABSOLUTE(.); > > >> > > > *(.sram4) > > >> > > > _sram4_reserve_end = ABSOLUTE(.); > > >> > > > } > > >> > > > > > >> > > > And in the C code: > > >> > > > > > >> > > We need to lie to C and tell it what to think those symbols are: > > >> > > > > >> > > EXTERN const uint32_t _sram4_reserve_begin > > >> > > EXTERN const uint32_t _sram4_reserve_begin > > >> > > > >> > > > >> > > > >> > Ah, yes, otherwise those symbols would be undefined. Later the > linker > > >> will > > >> > resolve them to the correct addresses. > > >> > > > >> > > > >> > > #define SRAM4_RESERVE_BEGIN &_sram4_reserve_begin > > >> > > > #define SRAM4_RESERVE_END &_sram4_reserve_end > > >> > > > > > >> > > > The implied size depends on the size of all .sram4 sections. I > > >> assume > > >> > > > this would be positioned at the beginning of SRAM4 and the size > > >> > > > of > > >> the > > >> > > > region that could be added to the heap would be > SRAM4_RESERVE_END > > >> > > > through SRAM_END. > > >> > > > > > >> > > You can see this same kind of thing in, for example, > > >> > > arch/arm/src/common/arm_internal.h > > >> > > > >> > > > >> > > > >> > Great! Thanks > > >> > > > >> > Nathan > > >> > > > >> > > > > > >