We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi there!
I need some help with DPP (I think so).
code:
... mov r0, # _setP0 ; some below _setP0: scxt SYSCON, # 4C0h ...
after compiling and linking label was placed into adress 0x44C2 (in .M66 file and in disassembler). When I step over MOV command - in R0 was written 0x04C2 value, not 0x44C2. In disassembler I can see
00004482 E6F0C204 MOV R0,#0x04C2
Why MM part of code is C2 04, not C2 44?
As I can understand - 0x44C2 placed into 1st memory page and must be accessed via DPP1. I filled DPP1 with 0x1 which gives 1st page from 0x4000 + concatenated 14bit address = 4000 + 4C2 = 44C2.
Some info: Infenion 166 Memory model - small, Rom - 0x0 - 0x10000 Ram - 0x20000 - 0x40000 Rtx-166 tiny Reserve: 08h-0Bh,0ACh-0AFh,3000h-0031B8h,3200h-004428h
Any ideas?
Perhaps you could show the _setP0 entry in your map file? From your code...
The opcode for that memory location correctly states 0x04C2 as shown in your memory snippet.
Hi Chris!
in .m66 file:
0044C2H SYMBOL LABEL --- --- _setP0
In disassembler:
89: mov r0, # _setP0 00004482 E6F0C204 MOV R0,#0x04C2
What does it mean?
I am not sure what problem you have as this is not the output I get. So I tried your example and my map file matches the code. I would suggest you contact Keil support...
00012CH _setP0 LABEL --- NCODE MY_SECTION
In the disassembler
00000126 E6F02C01 MOV R0,#0x012C
So in my case I have the same memory located as the map file shows (both show the address 0x012C, the C166 is little endian so the bytes are flipped in memory).
So I don't know how to help you.
HI again Chris! Thanks for trying.
You got the SAME address because of your project is very SMALL (may be only one function in one c-file). I have the BIG project (6 files) and this function processed in the end of compiling.
If i put this function in beginning of main c-file - it works as your sample (2 address are same), but i want to make my project more reasonable separated in files. It is not error in KEIL, so I don't want to contact to support. I just want to understand where I am wrong in my opinion about compiler\linker working.
So, CAN ANYBODY ELSE SAY SOMETHING ABOUT THIS CASE?
PS: thanks Chris for trying once more
Any warnings from the linker?
DPP1 is used for accessing near constants (NCONST). The label _setP0 is not a near constant.
Try:
mov r0,#SOF _setP0
Are you aware that r0 is the user stack pointer and you must not change it?
Sauli
Hi Sauli !
There are no any warnings.
Try: mov r0,#SOF _setP0
Yes, it's really works:
90: mov r0,#SOF _setP0 91: 00004482 E6F0C244 MOV R0,#0x44C2
Thanks. I didn't know anything about PEC register loading before.