Anthony,

Are you linking the file that contains main() as the 
first object? It looks like the linker has put 
sdcc_call_dptr() at the address of the reset vector 
which makes it jump to whatever A+DPTR is after reset.

Maarten

> another strange observation.  If I move the actual declaration of the 
> sensors_event to a different file everything works.  Unfortunately this 
> is not a suitable long term solution.
> 
> Anthony Asterisk wrote:
> > I hit a very frustrating problem yesterday and a solution is still 
> > alluding me.   Unfortunately the problem shows up when trying to 
> > execute the linked ihx file on the target platform so it is not easy 
> > for me to provide a testcase.  I will give some code snippets, please 
> > let me know any steps I can take to further debug it.
> >
> >
> > Here is the code that I am altering.  A working version looks like this:
> >
> >   printf("\n\npress button  ");
> >   etimer_set(&timer,CLOCK_CONF_SECOND/5);
> >   while (1) {
> >     PROCESS_WAIT_EVENT();
> >     if (ev==PROCESS_EVENT_TIMER) {
> >       etimer_reset(&timer);
> >       lcd_putchar(0x08);
> >       lcd_putchar(spin[spin_ptr]);
> >       spin_ptr = (spin_ptr+1)%4;
> >     }
> >     else if (ev==PROCESS_EVENT_MSG) {
> >     //else if (ev == sensors_event) {
> >       exp_port.fields.leds++;
> >     }
> >     else {
> >       printf("unknown event\n");
> >     }
> >   }
> >
> > With this code the message "press button" is displayed.
> >
> > If I switch the commented lines ONLY, press button is never displayed 
> > and it seems like nothing is even loaded/executed on the target platform.
> >
> >   printf("\n\npress button  ");
> >   etimer_set(&timer,CLOCK_CONF_SECOND/5);
> >   while (1) {
> >     PROCESS_WAIT_EVENT();
> >     if (ev==PROCESS_EVENT_TIMER) {
> >       etimer_reset(&timer);
> >       lcd_putchar(0x08);
> >       lcd_putchar(spin[spin_ptr]);
> >       spin_ptr = (spin_ptr+1)%4;
> >     }
> >     //else if (ev==PROCESS_EVENT_MSG) {
> >     else if (ev == sensors_event) {
> >       exp_port.fields.leds++;
> >     }
> >     else {
> >       printf("unknown event\n");
> >     }
> >   }
> >
> >
> > The extern declaration of sensors_event is in an included header 
> > file.  It looks like this:
> >
> > extern process_event_t sensors_event;
> >
> > And the actual declaration (in a code file) looks like this:
> >
> > process_event_t sensors_event;
> >
> >
> > Nothing surprising there.
> >
> >
> > I've been digging around in the *.sym and linker output *.map file for 
> > some clue.
> >
> > In the *.sym file for the module with the code snippet above I see:
> >
> >     _sensors_event                                                 
> > **** GX
> >
> >
> > In the aslink output *.map file,  I see:
> >
> > Hexadecimal
> >
> > Area                               Addr   Size   Decimal Bytes 
> > (Attributes)
> > --------------------------------   ----   ----   ------- ----- 
> > ------------
> > XSEG                               E000   0291 =    657. bytes 
> > (REL,CON,XDATA)
> >
> >       Value  Global
> >    --------  --------------------------------
> >   0D:E010    _exp_port
> >   0D:E016    _ddram_addr
> >   0D:E017    _sensors_event
> >   0D:E10D    _p0ien
> >   0D:E10E    _p2ien
> >
> >
> > If I diff the *.map from the working and non-working version, the 
> > results are very similar.  The order of several various changes but 
> > they are all still present.  One change that I did notice which has me 
> > wondering:
> >
> >
> > 431,432c431,432
> > <   0C:0000    __sdcc_call_dptr
> > <   0C:0088    __sdcc_program_startup
> > ---
> > >   0C:0086    __sdcc_program_startup
> > >   0C:008B    __sdcc_call_dptr
> >
> >
> > these differences are here:
> >
> > Area                               Addr   Size   Decimal Bytes 
> > (Attributes)
> > --------------------------------   ----   ----   ------- ----- 
> > ------------
> > HOME                               0000   008D =    141. bytes 
> > (REL,CON,CODE)
> >
> >       Value  Global
> >    --------  --------------------------------
> >   0C:0000    __sdcc_call_dptr
> >   0C:0088    __sdcc_program_startup
> >
> > Hexadecimal
> >
> >
> >
> >
> > The working version seems to have a non-null address for the 
> > __sdcc_call_dptr code, but the broken version has NULL.  0000 seems to 
> > me like it might indicate some sort of error. 
> 
> 
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
> trial. Simplify your report design, integration and deployment - and focus on 
> what you do best, core application coding. Discover what's new with
> Crystal Reports now.  http://p.sf.net/sfu/bobj-july
> _______________________________________________
> Sdcc-user mailing list
> Sdcc-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sdcc-user
> 



------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to