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.
Hello All,
I am just getting started with TI-RTOS with the help of the TI videos. When building the basic example, my code does not compile giving me the following error:
"#10099-D program will not fit into available memory. run placement with alignment/blocking fails for section ".ebss" size 0x1458 page 1. Available memory ranges: TMS320F28027.cmd /TM4C_BIOS_New line 109 C/C++ Problem"
I am using the development board with the TMS320F28027. Here is the linker command file. What am I doing wrong? The following linker command was automatically generated when creating a minimial TI-RTOS CCS project. The offending line seems to be " .ebss : > M01SARAM | L0SARAM PAGE = 1"
MEMORY { PAGE 0: /* Program Memory */ OTP : origin = 0x3D7800, length = 0x000400 /* on-chip OTP */ FLASH : origin = 0x3F0000, length = 0x007F80 /* on-chip FLASH */ CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Program with all 0x0000 when CSM is in use. */ BEGIN : origin = 0x3F7FF6, length = 0x000002 /* Used for "boot to Flash" bootloader mode. */ CSM_PWL : origin = 0x3F7FF8, length = 0x000008 /* CSM password locations in FLASH */ IQTABLES : origin = 0x3FE000, length = 0x000B50 /* IQ Math Tables in Boot ROM */ IQTABLES2 : origin = 0x3FEB50, length = 0x00008C /* IQ Math Tables in Boot ROM */ IQTABLES3 : origin = 0x3FEBDC, length = 0x0000AA /* IQ Math Tables in Boot ROM */ ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */ RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */ VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */ PAGE 1 : /* Data Memory */ M01SARAM : origin = 0x000000, length = 0x000800 /* on-chip RAM block M0, M1 */ PIEVECT : origin = 0xD00, length = 0x100 L0SARAM : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */ } /* * Allocate sections to memory blocks. * Note: * codestart user defined section in DSP28_CodeStartBranch.asm * used to redirect code execution when booting to flash * * ramfuncs user defined section to store functions that will be * copied from Flash into RAM */ SECTIONS { /* Allocate program areas: */ .cinit : > FLASH PAGE = 0 .pinit : > FLASH PAGE = 0 .text : > FLASH PAGE = 0 codestart : > BEGIN PAGE = 0 ramfuncs : LOAD = FLASH PAGE = 0, RUN = L0SARAM PAGE = 1, LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart) csmpasswds : > CSM_PWL PAGE = 0 csm_rsvd : > CSM_RSVD PAGE = 0 /* Allocate uninitalized data sections: */ .stack : > M01SARAM | L0SARAM PAGE = 1 .ebss : > M01SARAM | L0SARAM PAGE = 1 .esysmem : > L0SARAM | M01SARAM PAGE = 1 .cio : > L0SARAM | M01SARAM PAGE = 1 /* Initalized sections go in Flash */ /* For SDFlash to program these, they must be allocated to page 0 */ .econst : > FLASH PAGE = 0 .switch : > FLASH PAGE = 0 .args : > FLASH PAGE = 0 /* Allocate IQ math areas: */ IQmath : > FLASH PAGE = 0 /* Math Code */ IQmathTables : > IQTABLES PAGE = 0, TYPE = NOLOAD /* * Uncomment the section below if calling the IQNexp() or IQexp() * functions from the IQMath.lib library in order to utilize the * relevant IQ Math table in Boot ROM (This saves space and Boot ROM * is 1 wait-state). If this section is not uncommented, IQmathTables2 * will be loaded into other memory (SARAM, Flash, etc.) and will take * up space, but 0 wait-state is possible. */ /* IQmathTables2 : > IQTABLES2 PAGE = 0, TYPE = NOLOAD { IQmath.lib<IQNexpTable.obj> (IQmathTablesRam) } */ /* * Uncomment the section below if calling the IQNasin() or IQasin() * functions from the IQMath.lib library in order to utilize the * relevant IQ Math table in Boot ROM (This saves space and Boot ROM * is 1 wait-state). If this section is not uncommented, IQmathTables2 * will be loaded into other memory (SARAM, Flash, etc.) and will take * up space, but 0 wait-state is possible. */ /* IQmathTables3 : > IQTABLES3 PAGE = 0, TYPE = NOLOAD { IQmath.lib<IQNasinTable.obj> (IQmathTablesRam) } */ }
My main.c is rather trivial:
#include <xdc/std.h> #include <xdc/runtime/System.h> #include <ti/sysbios/BIOS.h> #include <ti/sysbios/knl/Task.h> /* * ======== taskFxn ======== */ Void taskFxn(UArg a0, UArg a1) { System_printf("enter taskFxn()\n"); Task_sleep(10); System_printf("exit taskFxn()\n"); } Int main() { /* * use ROV->SysMin to view the characters in the circular buffer */ System_printf("enter main()\n"); BIOS_start(); /* does not return */ return(0); }
I noticed that removing logging (in UIA -> LoggingSetup -> UIA Logging Config) removes this error, and can build it.
When I enabled the logging, I used the default MAUs for the buffer sizes (1024 MAUs).
Changing it to 128 MAUs seems to work.
Hello,
perhaps this is an issue of splitting memory sections and large buffer size. Maybe this thread will useful http://e2e.ti.com/support/microcontrollers/c2000/f/171/p/284770/993827.aspx#993827
Igor
Thanks Igor.
Could you point me to any document which actually explains these lines? I think there are significant gaps in my knowledge to edit it meaningfully
Hi, Mike.
Well, if you mean a general concept of splitting memory, then you can refer to this link http://processors.wiki.ti.com/index.php/C28x_Compiler_-_Understanding_Linking#Q:_The_linker_says_.22placement_fails_for_object.22_but_the_available_memory_is_larger_than_the_section
Regards,
Igor