This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

#10099-D Error; Program will not fit into available memory

I'm running through the TI-RTOS examples using SYS/BIOS, and I completed Lab 5, which programmed the HWI.  The program compiles, loads and operates perfectly.  As part of the follow-on, I programmed Lab 5 using the Timer instead of the HWI.  When I went to compile, I received the #10099-D Error stating that .ebss wouldn't fit into my available memory.  I've run into this issue earlier in the labs, and I modified my F28335.cmd file (I'm using a different hardware platform than the labs, which has a F28335 on it).  I've stuck a condensed version of the F28335.cmd file below, the "..." on some lines are so I don't have to show everything that is in the file.

Memory
{
PAGE 0:
...
...
Page 1:
...
RAML4 : origin = 0x00C000, length 0x001000
RAML5 : origin = 0x00D000, length 0x001000
RAML6 : origin = 0x00E000, length 0x001000
RAML7 : origin = 0x00F000, length 0x001000
...
}
SECTIONS
{
...
.ebss : >> RAML4 | RAML5 | RAML6 | RAML7 PAGE=1
...
}

I tried to do the follow-on lab between Lab 5 and Lab 6, which removes the HWI and uses TIMER instead.  When I do the follow-on lab between Lab 5 and Lab 6 for the Timer, the program magically can't fit into the memory anymore and I get the #10099-D error stating that the program won't fit into available memory.  On the suggestion of a separate post (https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/204880), I again modified my F28335.cmd file in the following way, which allows the program to compile.  Any suggestions as to WHY?  Shouldn't the ".ebss : >> RAML4 | RAML5 | RAML6 | RAML7" and ".ebss : > RAML47" do the same thing as RAML47 is defined as RAML4 | RAML5 | RAML6 | RAML7?

Memory
{
PAGE 0:
...
...
Page 1:
...
RAML47: origin = 0x00C000, length 0x004000
...
}
SECTIONS
{
...
.ebss : > RAML47 PAGE=1
...
}
  • Tim,

    The RAM47 approach clumps the four memories together as a single, large memory. This is least restrictive, in that as long as the RAM47 total memory size is greater than the entire .ebss, the .ebss will fit.

    The RAML4 | RAML5 | ... approach tells the linker that, if necessary, it can break up the .ebss section along INPUT SECTION BOUNDARIES, and fit each piece into any of RAML4, RAML5, ... . I suspect the problem here is that you have a .ebss input section from some file that exceeds the size of each individual RAMLx. Maybe you have a large array allocated. Either that, or you simply have a very large .ebss section coming from one of your source files.

    Regards,
    David
  • David,
    Thank you for the quick response. This is for Lab 5 of the TI-RTOS training, which is a simple Blink-LED program...nothing phenomenal about the code length, though the TI-RTOS may be bloating that somewhat.

    Is there a way in the CMD file to specify it both ways, such that I have individual sections RAML4, RAML5, RAML6 and RAML7, while additionally calling out RAML47? I'm afraid that would confuse the linker as the memory range would be specified twice with different conventions. Or, another idea, is there a way to keep the RAML4, RAML5, RAML6 and RAML7 convention and tell the linker that it can span the INPUT SECTION BOUNDARIES instead of just trying to fit it in between these boundaries? Instead of the pipe, |, maybe use the ampersand, &? I don't know the answer here, and I like having the individual sections split, though I can live with specifying one large section as I have done with RAML47.
    -Tim
  • Tim,

    >> Is there a way in the CMD file to specify it both ways, such that I have individual sections RAML4, RAML5, RAML6 and RAML7, while additionally calling out RAML47?

    Not really.

    In general, the only reason why you wouldn't use the RAML47 approach is if you needed to separate code and data (or multiple datum) into different RAM blocks. Each RAM block can be accessed once per clock cycle. The classic example is a MAC instructions where you want the two data values you are multiplying in different RAM blocks.

    Why not combine enough blocks to fit your .ebss, and leave the other blocks separate. For example, RAML45, RAML6, and RAML7?

    Regards,
    David
  • David,
    I'll probably do what you suggest, and create a RAML46 block along with RAML7, or something to that effect. Thank you for the information!
    -Tim