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