CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Compiler inserting NOP's

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
sjbaxter



Joined: 26 Jan 2006
Posts: 141
Location: Cheshire, UK

View user's profile Send private message Visit poster's website

Compiler inserting NOP's
PostPosted: Tue Dec 05, 2006 4:42 am     Reply with quote

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








PostPosted: Tue Dec 05, 2006 4:50 am     Reply with quote

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

View user's profile Send private message Visit poster's website

PostPosted: Tue Dec 05, 2006 5:04 am     Reply with quote

Oh yeah, why didn't I think of that !!!
_________________
Regards,
Simon.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Dec 05, 2006 5:21 am     Reply with quote

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

View user's profile Send private message Visit poster's website

PostPosted: Tue Dec 05, 2006 5:26 am     Reply with quote

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

View user's profile Send private message

PostPosted: Tue Dec 05, 2006 6:12 am     Reply with quote

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

View user's profile Send private message Visit poster's website

PostPosted: Tue Dec 05, 2006 6:27 am     Reply with quote

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







PostPosted: Tue Dec 05, 2006 7:40 am     Reply with quote

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

View user's profile Send private message Visit poster's website

PostPosted: Tue Dec 05, 2006 8:33 am     Reply with quote

Thanks Ttelmah, that'll explain it ... Maybe I should read the doco a bit more. Embarassed
_________________
Regards,
Simon.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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