It's the 0x38 bytes of initialize statics it's copying to RAM (0x20000000), when the processor starts the RAM is ''random'', your program has initialized variable that have some values, some zeros, and these must be copied from FLASH.
ieint foo = 12345; // some global value (ie RW)int bar[256]; // some global array that is zero'd (ie ZI)Look at the ''Program Size'' line emitted by the Linker in the Build Log window, and at the back end of the .MAP file.Instead of using the AT directive, you need to modify the scatter file (.SCT) to keep the changeable flash variables outside the primary load region, by creating another load region and section, and directing them into that. Or by creating a location outside of the scope of the linker, ie by shrinking IROM1, and have your code check if the content is erased FLASH (ie 0xFFFFFFFF) and writing in your new, or default value(s). If you have a bunch of the them, use a structure with an integrity check, it will be easier to manage.
Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..