Hi I am using uvision to develop code for LPC1768. my code is not small but I am sure I have lots of unused SRAM and I have assigned enough heap and stack
But I have a problem. Some of my variables get values other than what they should have. For example a variable that I set it 1 in timer interrupt (and define it volatile when declaring it), is having 0 value when is referred to in code, etc
When these problems happen, I define the variable in a specific address, like this
unsigned char Flash_write_values[512] __attribute__((at(RAM_BaseAddress + 0x5000))); unsigned char Flash_Data[512] __attribute__((at(RAM_BaseAddress + 0x5200))); volatile unsigned char SMS_QueueActive __attribute__((at(RAM_BaseAddress + 0x5A04)));
Now that my code is getting bigger, this problem is occurring more frequently. Maybe I should define all my variables in specific addresses. What is your opinion?
I started studying linker manuals to learn how to create scatter files, but it seems the manuals are too large and not enough simple to work/start with
How do you suggest me to proceed? Thanks in advance
Thanks Per Westermark When I create and compile a project, a SCT file is generated automatically This is the content of that file:
LR_IROM1 0x00000000 0x00080000 { ; load region size_region ER_IROM1 0x00000000 0x00080000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x10000000 0x00008000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x2007C000 0x00008000 { .ANY (+RW +ZI) } }
If I put all my variables in a specific source file like "variables.h" and include it in my main program file, how should I change the code above? Could you please illustrate it for me? I was confused among linker documentation, maybe this example help me
Thanks again
Hey now - the linker have zero knowledge about the existence of any header files.
Note that the linker works with object files - and it isn't header files, but *.c, *.cc, *.cpp, *.cxx or similar that is the reason that the compiler spits out object files. As you can see in your scatter file, there are references to *.o - which seem to imply "all" object files. A daring guess might solve the issue of how to instruct the linker what to do with RW and ZI data for a specific object file.
To get a symbol (variable or function) into a specific object file, the linker don't care about what you do with your header files. And since you seem to think that putting the variables in a single header file would be the solution, I just need to recommend that you take a look in a C/C++ programming book about the difference between definition and declaration of variables. How to tell the compiler that there exists a variable. And how to tell the compiler that you want the memory for a variable allocated within code/object data it emits.