I would appreciate any help getting past this problem. I am attempting to write code that I can use to update the program in flash memory. I am using the xc16x_iap-flash example and so far have successfully managed to locate the flash programming section to RAM and am able to erase and write to flash memory from it. The next part has me confused though. When I erase the sector 0xC00000 (beginning of flash memory) the program in RAM stops running. It appears as though constants from my program in RAM are being stored in flash. I assume that I am missing something in the L166 Locate Options, but after trying many combinations I am quite lost on how to set this up correctly. Keil xc16x_iap-flash example: http://www.keil.com/download/docs/xc16x_iap-flash.zip.asp
Thank you for responding. Actually, I have changed the original example quite a bit. I am not expecting the program to ever return to the Srom section. The flash is being erased and re-programmed from a function in the pflash section that calls PFlash_Erase and PFlash_Write. This function stops if I have it erase sector 0xC00000 The pflash section executable is stored in RAM at 0x420000. How do I tell the linker to store all parts of the pflash code, including constants and variable storage at 0x420000 so it can erase all parts of the flash?
Without knowing your goal, my suggestion would be to go for a completely separate program that would have as its memory target (ROM) to be 0x420000. You would then add an offset to the final hex file to store in a know sector of the internal Flash of the XC16x (the Flash project would reserve this memory area). You then would combine the two hex files for the XC16x flash memory. Then when the XC16x wants to erase the flash you would perform the copy and jump as you did before. This is normally done when you have a boot and application programs (albeit usually the boot code is stored in the first sector of the XC16x Flash).