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

program reboots from long function call

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



Joined: 22 Feb 2012
Posts: 4

View user's profile Send private message

program reboots from long function call
PostPosted: Wed Mar 07, 2012 12:13 pm     Reply with quote

PIC18LF458
CCS v4.084
IDE v8.46


Ok, I can't figure this one out. I am trying to implement a boot sector at the beginning of the program. After completion, the boot sector will jump to a function with a set address at the beginning of the main sector, which in turn will call the main application routine. Fairly standard stuff.

Everything was working fine, until my program got to a certain length. Now my program reboots after the call to the application main routine.

The following is a stripped-down version of the code I am developing:

Code:

#include   "PIC18F458.h"               
#FUSES   HS


#define   RCON (*(unsigned char *)0x0FD0)
unsigned char   bRCON;


//   ***** BOOT SECTOR
#ORG   0x0028, 0x01FE DEFAULT
#use    delay(clock=16000000)                     
#use   RS232(baud=19200, UART1)      

void main(void)
{
   bRCON   =   RCON;   
   RCON   =   0x1F;      
   
   output_low(PIN_D5);            //needed to power my hardware RS232 xceiver
   delay_ms(100);   

   printf("\r\nRCON=0x%02x  ", bRCON);
   putc('1');
   
   goto_address(0x0200);
}
#ORG   DEFAULT



//   ***** MAIN CODE SECTOR
#ORG   [b]0x2556[/b], 0x7FFE DEFAULT
void   test(void)
{
   putc('3');

infiniteloop:
   restart_wdt();
   goto infiniteloop;
}
#ORG   DEFAULT



//   ***** ENTRY POINT TO MAIN CODE SECTOR
#ORG   0x0200, 0x208
void   mainjump(void)
{
   putc('2');
   test();
}



The location of the test() routine seems to be the problem. In the snipped above, I have the routine set at ROM address 0x2556. This code will execute fine (the output is "RCON=0x1f 123"), and the the program will just set there idle in its infinite loop.

However, if I move the test() function to address 0x2558 or 0x255A, the program will give me the same output message, but then will immediately reboot.

If I set the address to 0x255C or greater, I'll only get the message RCON=0x1f 12", and the unit will continuously reboot.

Note that the RCON register always gives me the value 0x1f, which is interpreted as a "MCLR from run". No hardware reset is actually occurring (there's only a pull-up on the MCLR pin). I also tried sticking a RESET instruction at the end of ROM space to detect if the program counter was somehow getting outside of my code, but it didn't make any difference.

Anyone have any idea what could be the issue here? I've checked the program and disassembly listings, and the op codes look right to me, so I don't think it is necessarily a compiler bug. I'm kinda stumped here.
drolleman



Joined: 03 Feb 2011
Posts: 116

View user's profile Send private message

PostPosted: Wed Mar 07, 2012 1:58 pm     Reply with quote

I've had this problem before. to fix it I'll break it into smaller functions, another way is to change the order of the functions. This usually works.
gpsmikey



Joined: 16 Nov 2010
Posts: 588
Location: Kirkland, WA

View user's profile Send private message

PostPosted: Wed Mar 07, 2012 3:47 pm     Reply with quote

Are you sure you are not managing to overwrite some other code located up there (like a loader or something) ? Another possibility that comes to mind is you have run into a chip with bad flash memory. You might try another chip and try reading the flash back to see if it matches what was supposed to be written. One of the things we used to do in critical systems was to have a background task running that calculated the CRC of each "task" in FLASH and compared it to the known CRC for that task. If it didn't match, it reset the processor or halted it depending on the criteria.
_________________
mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3
DrDoug



Joined: 22 Feb 2012
Posts: 4

View user's profile Send private message

PostPosted: Wed Mar 07, 2012 6:27 pm     Reply with quote

Arrrggghhh!

Ok, I figured out the problem (I guess). I downloaded the code from the chip and discovered that any program data past a certain address (0x2560) wasn't actually programmed into the chip. I checked the hex file, and confirmed that the codes for these addresses were in the file, but somehow they weren't actually getting programmed. I then imported the hex file into MPLAB (rather than build it through the compiler), downloaded it, and this time all the code space programmed correctly!?!

So, essentially, if I build my project, then try to use the ICD3 to program my chip, nothing past 0x2560 was getting programmed (but this would still pass the verify test). But importing a hex file would work fine with the ICD3.

I dug around in my drawers and found a PicKit3. I tried it with the compiler and it works just fine. So I guess this was all a ICD3 bug. Wow, that was 2 work days completely wasted.
gpsmikey



Joined: 16 Nov 2010
Posts: 588
Location: Kirkland, WA

View user's profile Send private message

PostPosted: Wed Mar 07, 2012 7:22 pm     Reply with quote

It's always easy once you know the answer :-) Having been down similar paths in the past was why I suggested reading it back again to verify it was actually programmed. Years ago, I beat my head on the wall trying to find out why my hand assembled code for the 8080 was not working - including putting a hardware write protect on the memory. Turned out to be a 2102 STATIC RAM chip with a bit that would flip after about 45 seconds all by itself.
_________________
mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3
RF_Developer



Joined: 07 Feb 2011
Posts: 839

View user's profile Send private message

PostPosted: Thu Mar 08, 2012 4:48 am     Reply with quote

Do you REALLY know whats going on? There's an awful lot of "I guess"s there. This smells to me of the "boot sector" code not fitting in the space you've allocated for it. There's quite a bit of compiler supplied set up code which is of unknown length. Fitting compiled C code into any given, small, memory space is always tricky. Its one reason why bootloaders are usually written in assembler - you can control the size of the code precisely: no guessing.

I'd review everything about this code: where its placed (all of it), how big it is, what calls what, and when. There are very few reports of issues with ICD3. I use it all the time, never had any thing similar. Though there's always a first time. I'd look carefully at the programmer settings for the ICD 3: maybe you, or someone else, set something up there that, on the assumption of what memory was required, only programs some regions. There's all sorts of things that may be wrong. I'd always assume operator and developer error first until proven different, AND IMPORTANTLY, UNDERSTOOD WHY.

RF Developer
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