some newbie questions
Joel Sherrill
joel.sherrill at OARcorp.com
Wed Feb 18 18:51:56 UTC 2004
Anoother approach which is sometimes useful is to
write a variable to a known address or parallel
port and trace those writes with a hardwre
debug device or logic analyzer as appropriate.
I know that the MIPS MongooseV folks have learned a lot
by tracing writes to certain addresses with a logic
analyzer and analyzing that.
--joel
Ed Sutter wrote:
> Seb,
> Does your monitor allow you to hook to any of its resident
> facilities? If it does, then you should be able to hook
> to its printf() functionality to give you a peek into the
> startup of the operating system. ALternatively, you can
> add a global variable to the startup code that is used to
> trace the startup. After the call to start() hangs, you
> can observe the value of the variable to determine how far
> your startup got.
> For example...
>
> int sebs_trace_variable;
>
> start()
> {
> ...
> seb_trace_variable = 1;
> ...
> seb_trace_variable = 2;
> ...
> seb_trace_variable = 3;
> ...
> seb_trace_variable = 4;
> ...
> ect...
> }
>
> Then, after you call start() and it hangs, see what the
> content of that variable is. That will give you an idea
> of where you start() hung.
>
> I may as well mention that MicroMonitor has facilities in it
> to make this process pretty easy to debug. If transitioning
> over to that is a possibility, let me know.
> Ed
>
> Ed Sutter wrote:
>
>>Seb,
>>You can't call something with printf() in it at this level.
>>Think about it...
>>The guts of printf() requires console IO to be working.
>>Console IO is likely handled by the serial port device
>>driver in RTEMS. Since we're side-stepping the whole
>>RTOS startup here, printf() will certainly not work.
>>
>>Ed
>>
>>sebastian ssmoller wrote:
>>
>>>hi,
>>>using an "independent" function is of cause a good idea :)
>>>calling this funct does NOT cause the board to hang - so this is one step
>>>into the right direction :)
>>>
>>>i wasnt able yet to get the value of the variable - i have to read some
>>>docs about the monitor first.
>>>
>>>but what i did is, i only include a printf (which causes to inlcude and use
>>>lots of other stuff of course). calling the funct again caused a bus error.
>>>next pc points into the fstat function ...
>>>
>>>this let me believe that my linkcmds file is not correct. so possibly u
>>>could have a look at it ?
>>>
>>>====== linkcmds from intro (which works) =========
>>>//
>>>// This linker command file was created by Introl-CODE.
>>>//
>>>
>>>// Library modules used by this program
>>>
>>>// Program memory groups
>>>group ROM rom itemalign 2 origin 0x0700 maxsize 0x10000-0x0700;
>>> section .vectors data;
>>>
>>> section .start0 text;
>>> section .start1 text;
>>> section .start2 text;
>>> section .start3 text;
>>> section .start4 text;
>>> section .start5 text;
>>> section .start6 text;
>>> section .start7 text;
>>> section .start8 text;
>>> section .start9 text;
>>> section .startX text;
>>> section .startZ text;
>>>
>>> section ROM.const data = .const .strings;
>>> section ROM.text text = .text;
>>>
>>> section .init;
>>>group ROM;
>>>
>>>set __ROMstart = 0x0700;
>>>set __ROMend = 0x10000;
>>>set __ROMsize = 0x10000-0x0700;
>>>
>>>group RAM ram bss itemalign 2 origin 0x10000 maxsize 0x50000-0x10000;
>>> section .bss comms;
>>> section .data data copiedfrom .init;
>>> section .retm comm;
>>> section .heap expand minsize 0;
>>> section .stack minsize 0;
>>>
>>> section RAM.ubss = .ubss;
>>>group RAM;
>>>
>>>set __RAMstart = 0x10000;
>>>set __RAMend = 0x50000;
>>>set __RAMsize = 0x50000-0x10000;
>>>
>>>group IO io bss origin 0xFFF000 maxsize 0x1000000-0xFFF000;
>>> section .chip;
>>>group IO;
>>>
>>>set __IOstart = 0xFFF000;
>>>set __IOend = 0x1000000;
>>>set __IOsize = 0x1000000-0xFFF000;
>>>
>>>// Link time variable definitions
>>>set __ramstart = startof(.bss);
>>>set __ramend = endof(.bss);
>>>set __heapstart = startof(.heap);
>>>set __heapend = endof(.heap);
>>>set __stackstart = startof(.stack);
>>>set __stackend = endof(.stack);
>>>set __initstart = startof(.init);
>>>set __initend = endof(.init);
>>>set __datastart = startof(.data);
>>>set __dataend = endof(.data);
>>>set __fastend = endof(.start1);
>>>set __chipstart = startof(.chip);
>>>
>>>readline; // Read files from the command line
>>>
>>>end;
>>>
>>>============ linkcmds intro end ==================
>>>
>>>============ linkcmds from rtems (with memory values changed) ========
>>>/*
>>> * This file contains GNU linker directives for a generic MC68360 board.
>>> * Variations in memory size and allocation can be made by
>>> * overriding some values with linker command-line arguments.
>>> *
>>> * Saskatchewan Accelerator Laboratory
>>> * University of Saskatchewan
>>> * Saskatoon, Saskatchewan, CANADA
>>> * eric at skatter.usask.ca
>>> *
>>> * linkcmds,v 1.20 2003/01/20 20:19:44 joel Exp
>>> */
>>>
>>>/*
>>>OUTPUT_FORMAT("srec");
>>>*/
>>>
>>>/*
>>> * Declare some sizes.
>>> * A heap size of 0 means `use all available memory for the heap'.
>>> */
>>>_RamBase = DEFINED(_RamBase) ? _RamBase : 0x10000;
>>>_RamSize = DEFINED(_RamSize) ? _RamSize : 0x50000-0x10000;
>>>_HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0;
>>>_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
>>>
>>>/*
>>> * Declare on-board memory.
>>> */
>>>MEMORY {
>>> rom : ORIGIN = 0x0700, LENGTH = 0x10000 - 0x0700
>>> ram : ORIGIN = 0x10000, LENGTH = 0x50000 - 0x10000
>>> dpram : ORIGIN = 0xFFC00001, LENGTH = 0xFFC02000 - 0xFFC00000
>>>}
>>>
>>>/*
>>> * Load objects
>>> */
>>>SECTIONS {
>>> /*
>>> * Boot PROM
>>> */
>>> rom : {
>>> _RomBase = .;
>>> } >rom
>>>
>>> /*
>>> * Dynamic RAM
>>> */
>>> ram : {
>>> _RamBase = .;
>>> } >ram
>>>
>>> /*
>>> * Text, data and bss segments
>>> */
>>> .text : {
>>> *(.text)
>>>
>>> /*
>>> * C++ constructors/destructors
>>> */
>>> *(.gnu.linkonce.t.*)
>>>
>>> /*
>>> * Initialization and finalization code.
>>> */
>>> PROVIDE (_init = .);
>>> *crti.o(.init)
>>> *(.init)
>>> *crtn.o(.init)
>>> PROVIDE (_fini = .);
>>> *crti.o(.fini)
>>> *(.fini)
>>> *crtn.o(.fini)
>>>
>>> /*
>>> * Special FreeBSD sysctl sections.
>>> */
>>> . = ALIGN (16);
>>> __start_set_sysctl_set = .;
>>> *(set_sysctl_*);
>>> __stop_set_sysctl_set = ABSOLUTE(.);
>>> *(set_domain_*);
>>> *(set_pseudo_*);
>>>
>>> /*
>>> * C++ constructors/destructors
>>> */
>>> . = ALIGN (16);
>>> *crtbegin.o(.ctors)
>>> *(.ctors)
>>> *crtend.o(.ctors)
>>> *crtbegin.o(.dtors)
>>> *(.dtors)
>>> *crtend.o(.dtors)
>>>
>>> /*
>>> * Exception frame info
>>> */
>>> . = ALIGN (16);
>>> *(.eh_frame)
>>>
>>> /*
>>> * Read-only data
>>> */
>>> . = ALIGN (16);
>>> _rodata_start = . ;
>>> *(.rodata*)
>>> *(.gnu.linkonce.r*)
>>>
>>> . = ALIGN (16);
>>> PROVIDE (etext = .);
>>> } >ram
>>> .data : {
>>> _copy_start = .;
>>> *(.data)
>>> *(.gnu.linkonce.d*)
>>> *(.gcc_except_table)
>>> *(.jcr)
>>> . = ALIGN (16);
>>> PROVIDE (edata = .);
>>> _copy_end = .;
>>> } >ram
>>> .bss : {
>>> M68Kvec = .;
>>> . += (256 * 4);
>>> _clear_start = .;
>>> *(.bss)
>>> *(COMMON)
>>> . = ALIGN (16);
>>> PROVIDE (end = .);
>>>
>>> . += _StackSize;
>>> . = ALIGN (16);
>>> _stack_init = .;
>>> _clear_end = .;
>>>
>>> _WorkspaceBase = .;
>>> variable = .;
>>> } >ram
>>>
>>> /*
>>> * On-chip memory/peripherals
>>> */
>>> dpram : {
>>> m360 = .;
>>> . += (8 * 1024);
>>> } >dpram
>>>
>>> /* Stabs debugging sections. */
>>> .stab 0 : { *(.stab) }
>>> .stabstr 0 : { *(.stabstr) }
>>> .stab.excl 0 : { *(.stab.excl) }
>>> .stab.exclstr 0 : { *(.stab.exclstr) }
>>> .stab.index 0 : { *(.stab.index) }
>>> .stab.indexstr 0 : { *(.stab.indexstr) }
>>> .comment 0 : { *(.comment) }
>>>
>>> /* DWARF debug sections.
>>> Symbols in the DWARF debugging sections are relative to the beginning
>>> of the section so we begin them at 0. */
>>> /* DWARF 1 */
>>> .debug 0 : { *(.debug) }
>>> .line 0 : { *(.line) }
>>>
>>> /* GNU DWARF 1 extensions */
>>> .debug_srcinfo 0 : { *(.debug_srcinfo) }
>>> .debug_sfnames 0 : { *(.debug_sfnames) }
>>>
>>> /* DWARF 1.1 and DWARF 2 */
>>> .debug_aranges 0 : { *(.debug_aranges) }
>>> .debug_pubnames 0 : { *(.debug_pubnames) }
>>>
>>> /* DWARF 2 */
>>> .debug_info 0 : { *(.debug_info) }
>>> .debug_abbrev 0 : { *(.debug_abbrev) }
>>> .debug_line 0 : { *(.debug_line) }
>>> .debug_frame 0 : { *(.debug_frame) }
>>> .debug_str 0 : { *(.debug_str) }
>>> .debug_loc 0 : { *(.debug_loc) }
>>> .debug_macinfo 0 : { *(.debug_macinfo) }
>>>
>>> /* SGI/MIPS DWARF 2 extensions */
>>> .debug_weaknames 0 : { *(.debug_weaknames) }
>>> .debug_funcnames 0 : { *(.debug_funcnames) }
>>> .debug_typenames 0 : { *(.debug_typenames) }
>>> .debug_varnames 0 : { *(.debug_varnames) }
>>> /* These must appear regardless of . */
>>>}
>>>============ linkcmds rtems end ==================
>>>
>>>i checked the "ca" (call) syntax again and i guess it is correct, cause it
>>>works with introl code and when calling the unique_function
>>>
>>>many thx again
>>>regards,
>>>seb
>>>
>>>On Wed, 18 Feb 2004 12:14:30 -0500
>>>Ed Sutter <els at emailbox.hdtv.lucent.com> wrote:
>>>
>>>
>>>>Seb,
>>>>Try starting with something simpler.
>>>>Here's a few suggestions...
>>>>
>>>>In your application add a function and a variable..
>>>>
>>>>long unique_variable;
>>>>
>>>>long
>>>>unique_function(void)
>>>>{
>>>> return(++unique_variable);
>>>>}
>>>>
>>>>Then load your application and instead of calling the entrypoint,
>>>>parse your symbol table and call this function's address. If this
>>>>hangs, you have a more fundamental problem, if it doesn't hang
>>>>the do some more investigation...
>>>>If the "call" command that you have shows the return value of the
>>>>function you called, then you should notice it incrementing.
>>>>If the "call" command doesn't support that, then call the function
>>>>and then display the variable using some other monitor command.
>>>>
>>>>Another thing to try would be to disassemble the the address of
>>>>the application entrypoint and see if it makes sense.
>>>>
>>>>The point here is to test some of the stuff outside of RTEMS.
>>>>Make sure your "call" command is working the way you think, etc...
>>>>For example, maybe "call" gets confused if your address is not prefixed
>>>>with "0x". Or, maybe it gets confused if yoru address IS prefixed
>>>>with "0x".
>>>>Get the idea? These things will just give you a confidence level
>>>>(maybe good maybe not so good) in what you're doing.
>>>>
>>>>Ed
>>>>
More information about the users
mailing list