Hi all, I'm currently working on a project which requires that part of the code is located below address 0x1000 and freezed, while other must be above 0x1000 and can be modified. Mixing up is not allowed. I used BL51 options below:
"BL51 X.obj code(?pr?*?upper_1k(1000h))"
Having both "frozen" and changing code in the same uVision project will generally not work, especially not with the more aggressive optimization options like linker code packing and common entry/exit code optimization. IMHO you should compile the frozen parts as a separate project instead, and the changeable ones as another one. You'll want to extract those functions in the frozen part that the modifiable part is allowed to access, and tell the modifiable part's build about their addresses --- this can be done by parsing the map file and generating 'set' statements from it.
The syntax you posted forces ?pr?upper_1k to start at address 1000. What about all the other segment names? For example, some optimizations create code segments named ?L?COMxxx. Maybe you'll have more luck assigning everything to 1000H+, and naming just those segments intended to live below 1000. If the two pieces of code are separately linked, you might just use the CODE directive to restrict the memory address range when you build the 1000H and up part. code (0x1000 - 0x7fff)