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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user