View previous topic :: View next topic |
Author |
Message |
carvell
Joined: 20 Sep 2016 Posts: 4
|
Variable watch bug in either CCS or MPLAB X |
Posted: Sat Apr 08, 2017 2:53 am |
|
|
I'm seeing a frustrating bug whereby the MPLAB X simulator is reporting the wrong values for variables in the 'watch' window.
CCS version 5.065
MPLAB X version 3.55
PIC device 16LF18345
The following code demonstrates it:
Code: | #include <16lf18345.h>
void main(void)
{
char array[99], i;
for (i=0;i<99;i++) array[i] = i;
/* Put a breakpoint on this i=0 line, run the MPLAB simulator.
* Look at 'array' in the Variables window and you'll see that
* the values for each element aren't all correct. For me, they go wrong
* at memory address 0x70.
*
* The value appears correct in memory, but the debugger reports the wrong
* value.
*/
i = 0;
} |
The watch window reports array[79] as 0x00, when of course it should be 79. This happens at memory address 0x70.
No hardware required, this is all in the simulator. I see the same issue with a pickit 3 and real hardware for what it's worth.
Hopefully somebody can reproduce it - it is easily reproducible on my system. |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9178 Location: Greensville,Ontario
|
|
Posted: Sat Apr 08, 2017 5:02 am |
|
|
While I don't use that PIC, most(all ?) 16F series have 'banks' of RAM and need a device 'pointer' like *=16 to access all of RAM as one continuous amount.
Someone that uses PICs everyday will know for sure, me, I gotta sand drywall....sigh...
Jay |
|
![](templates/subSilver/images/spacer.gif) |
carvell
Joined: 20 Sep 2016 Posts: 4
|
|
Posted: Sat Apr 08, 2017 6:35 am |
|
|
Ah yes, I forgot the 80 byte limitation on 16F devices.
Although the *=16 thing isn't the issue here, you have prompted me to delve further into the bank switching!
The symbols file contains this:
021-06F,0A0-0B3 main.array
As expected, the array is split across two banks.
What MPLAB X is doing is looking at 0x21 and then just reading 99 byte from there, rather than switching at 0x06F and continuing at 0x0A0.
I wonder if this is a limitation of MPLAB X or a bug. Clearly it isn't interpreting CCS's symbols file correctly. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19384
|
|
Posted: Sat Apr 08, 2017 10:23 am |
|
|
There was a thread about this before. I think the feeling was it is just a limitation of MPLAB. I seem to remember there is a 'note' somewhere in the electronic 'paperwork' for MPLAB, that says it won't handle variables that are split across multiple banks. |
|
![](templates/subSilver/images/spacer.gif) |
carvell
Joined: 20 Sep 2016 Posts: 4
|
|
Posted: Sat Apr 08, 2017 6:14 pm |
|
|
It seems that the 16F1xxx devices have a feature called 'Linear Data Memory', described thus:
Quote: | 4.5.2 LINEAR DATA MEMORY
The linear data memory is the region from FSR address 0x2000 to FSR address 0x29AF. This region is a virtual region that points back to the 80-byte blocks of GPR memory in all the banks.
Unimplemented memory reads as 0x00. Use of the linear data memory region allows buffers to be larger than 80 bytes because incrementing the FSR beyond one bank will go directly to the GPR memory of the next bank. |
I think it would be a good enhancement if future CCS versions utilised this feature and this linear region was addressed instead of the traditional 'banked' regions. |
|
![](templates/subSilver/images/spacer.gif) |
|