|
|
View previous topic :: View next topic |
Author |
Message |
sjbaxter
Joined: 26 Jan 2006 Posts: 141 Location: Cheshire, UK
|
Compiler inserting NOP's |
Posted: Tue Dec 05, 2006 4:42 am |
|
|
Has anyone else ever seen the following, where the compiler just inserts NOP's instead of code:
Code: | 602: // perform a reset of the serial parser
603: if (reset)
E40 CFE0 MOVFF 0xfe0, 0xfd
E42 F0FD NOP
604: {
605: value = 0;
E44 0100 MOVLB 0
E46 CFD8 MOVFF 0xfd8, 0xfe
606: valuelength = 0;
E48 F0FE NOP
E4A 6FFF MOVWF 0xff, BANKED
607: parameter = PARAMETER_UNKNOWN;
E4C CFE9 MOVFF 0xfe9, 0xfc
E4E F0FC NOP
608: reset = false;
E50 CFEA MOVFF 0xfea, 0xfb
609: }
610:
611: bytesinbuffer--;
E52 F0FB NOP
612: currentreadbyte++;
E54 CFFA MOVFF 0xffa, 0xf5
613: if (currentreadbyte >= MAX_BUFFER_LENGTH)
E56 F0F5 NOP
E58 CFFB MOVFF 0xffb, 0xf4
E5A F0F4 NOP
614: currentreadbyte = 0;
E5C 90D4 BCF 0xfd4, 0, ACCESS
|
I'm using MPLAB 7.50, ICD-2, PCH 3.236 (I'm only able to get upto 3.242 and they all give me grief above 3.236 when using structures !!)
PIC is an 18F1220, I'm upto 90% code and 57%-78% RAM.
Any clues anyone ? _________________ Regards,
Simon. |
|
|
Guest
|
|
Posted: Tue Dec 05, 2006 4:50 am |
|
|
Hi Simon,
This is a fairly common problem. To resolve it, go to Tools > Preferences, and uncheck the 'Insert Random NOP's' selection.
Cheers,
Jerry |
|
|
sjbaxter
Joined: 26 Jan 2006 Posts: 141 Location: Cheshire, UK
|
|
Posted: Tue Dec 05, 2006 5:04 am |
|
|
Oh yeah, why didn't I think of that !!! _________________ Regards,
Simon. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Dec 05, 2006 5:21 am |
|
|
They're not NOPs. The MOVFF instruction has two words, for the source
and the destination. The compiler may call it a NOP, but it's not.
I compiled a program with PCH vs. 3.249 under MPLAB, and I can't
make it give this NOP output. I tried setting the .LST file format to
"MPLAB format" and "Normal CCS format". Neither mode shows the NOPS. |
|
|
sjbaxter
Joined: 26 Jan 2006 Posts: 141 Location: Cheshire, UK
|
|
Posted: Tue Dec 05, 2006 5:26 am |
|
|
If I change the device to an 18F1320 (which has more program memory) the code generated is as I would expect.
i.e.
Code: | 631: // perform a reset of the serial parser
632: if (reset)
1224 A63D BTFSS 0x3d, 0x3, ACCESS
1226 EF1C GOTO 0x1238
633: {
634: value = 0;
122A 6B81 CLRF 0x81, BANKED
122C 6B80 CLRF 0x80, BANKED
635: valuelength = 0;
122E 6B83 CLRF 0x83, BANKED
1230 6B82 CLRF 0x82, BANKED
636: parameter = PARAMETER_UNKNOWN;
1232 6A7F CLRF 0x7f, ACCESS
1234 6A7E CLRF 0x7e, ACCESS
637: reset = false;
1236 963D BCF 0x3d, 0x3, ACCESS
638: }
639:
640: bytesinbuffer--;
1238 063B DECF 0x3b, F, ACCESS
641: currentreadbyte++;
123A 2A3A INCF 0x3a, F, ACCESS
642: if (currentreadbyte >= MAX_BUFFER_LENGTH)
123C 503A MOVF 0x3a, W, ACCESS
|
So I suspect the compiler is running out memory and trying to do something strange during the optimization.
I'm working on breaking the code down into smaller separate chunks to see if it is a page size related thing. _________________ Regards,
Simon. |
|
|
libor
Joined: 14 Dec 2004 Posts: 288 Location: Hungary
|
|
Posted: Tue Dec 05, 2006 6:12 am |
|
|
18F1220, 18F1320 datasheet, page 191 says:
...All instructions are a single word, except for three double-word instructions. These three instructions were made double-word instructions so that all the required information is available in these 32 bits. In the second word, the 4 MSbs are ‘1’s. If this second word is executed as an instruction (by itself), it will execute as a NOP. |
|
|
sjbaxter
Joined: 26 Jan 2006 Posts: 141 Location: Cheshire, UK
|
|
Posted: Tue Dec 05, 2006 6:27 am |
|
|
I had a switch statement before the code I posted (with about 20 cases in it). I have commented out about 5 cases and the code generates correctly. So I'm sort of happy for the moment. It does seem to be related to available space ... maybe the debug kernal is overwriting the top end of memory ... just a thought. _________________ Regards,
Simon. |
|
|
Ttelmah Guest
|
|
Posted: Tue Dec 05, 2006 7:40 am |
|
|
Hint.
Look at 'used rousources' in the MPLAB notes about ICD2.
For the 18F1220, program memory from E40, to FFF, and RAM from F0 to FF, is used by the debugger.
Best Wishes |
|
|
sjbaxter
Joined: 26 Jan 2006 Posts: 141 Location: Cheshire, UK
|
|
Posted: Tue Dec 05, 2006 8:33 am |
|
|
Thanks Ttelmah, that'll explain it ... Maybe I should read the doco a bit more. _________________ Regards,
Simon. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|