Copyright Ó 1998 CYGNUS
SOLUTIONS, Inc. All rights reserved.
No part of this document may be reproduced in any form
or by any means without the prior express written consent of CYGNUS
SOLUTIONS, Inc.
No part of this document may be changed and/or modified
without the prior express written consent of CYGNUS
SOLUTIONS, Inc.
GNUProÔ , the GNUProÔ
logo, and the Cygnus Solutions logo are trademarks of
CYGNUS SOLUTIONS, Inc.
All other brand and product names are trademarks of their respective owners.
Corporate Headquarters
CYGNUS SOLUTIONS
1325 Chesapeake Terrace
Sunnyvale, CA 94089 USA
TEL: +1 408 542 9600
Cygnus East
CYGNUS SOLUTIONS
955 Massachusetts Avenue
Cambridge, MA 02139-3180
Cygnus Japan
NIHON CYGNUS SOLUTIONS
Madre Matsuda Building
4-13 Kioi-cho Chiyoda-ku
Tokyo 102-0094 JAPAN
TEL: +81-3-3234-3896
FAX: +81-3-3239-3300
EMAIL: info@cygnus.co.jp
WEBSITE: http://www.cygnus.co.jp/
Cygnus U.K.
CYGNUS SOLUTIONS
35-36 Cambridge Place
Cambridge CB2 1NS
United Kingdom
The complete tool name is a four-part hyphenated string. The first part indicates the processor family (mips). The second part indicates the processor (tx39). The third part indicates the file format output by the tool (elf). The fourth part is the generic tool name (gcc). For example, the GCC compiler for the Toshiba TX39 is mips-tx39-elf-gcc.
The TX39 package includes the following supported tools:
| Tool Description | Tool Name |
| GCC compiler | mips-tx39-elf-gcc |
| C++ compiler | mips-tx39-elf-c++ |
| GAS assembler | mips-tx39-elf-as |
| GLD linker | mips-tx39-elf-ld |
| Standalone simulator | mips-tx39-elf-run |
| Binary Utilities | mips-tx39-elf-ar
mips-tx39-elf-nm mips-tx39-elf-objcopy mips-tx39-elf-objdump mips-tx39-elf-ranlib mips-tx39-elf-size mips-tx39-elf-strings mips-tx39-elf-strip |
| GDB debugger | mips-tx39-elf-gdb |
Toshiba JMR-TX3904A-50 Evaluation board
Both targets run in big-endian mode.
| CPU | Operating System | Vendor |
| x86 | Windows NT 4.0 | Microsoft |
| x86 | Redhat Linux 5.x | Redhat |
C:\cygnus\gnupro\i386-cygwin32\mips-tx39-elf\ecos-98r1p3
SET PROOT=C:\cygnus\gnupro\i386-cygwin32\mips-tx39-elf\ecos-98r1p3
SET PATH=%PROOT%\H-i386-cygwin32\bin;%PATH%
SET INFOPATH=%PROOT%\info
REM Set TMPDIR to point
to a ramdisk if you have one
SET TMPDIR=C:\TEMP
For the Sourceware release of eCos, ensure that the Unsupported Tools for eCos are also installed. Assuming these are installed in their default location in
C:\cygnus\gnupro\i386-cygwin32\i386-cygwin32\unsupported-98r1p2
then add the environmental setting:
SET PATH=C:\cygnus\gnupro\i386-cygwin32\i386-cygwin32\unsupported-98r1p2\H-i386-cygwin32\bin;%PATH%
Programs->Cygnus eCos->eCos Development Environment.
This will bring up a window running "bash", and your Windows environment will be automatically set up.
For Bourne shell compatible shells:
if ( "$?MANPATH" == "0"
) then
setenv MANPATH "/usr/local/man:/usr/man"
endif
if ( "$?INFOPATH" ==
"0" ) then
setenv INFOPATH "/usr/local/info:/usr/info"
endif
setenv MANPATH $PROOT/man:$MANPATH
setenv INFOPATH $PROOT/info:$INFOPATH
set path = ( $PROOT/H-i386-pc-linux-gnu/bin
$path )
-msoft-float
__mips__
__R3000__
New compiler and linker
features
static object_t myobj __attribute__((init_priority (30000) ));
The syntax is slightly different if the object takes any arguments to its constructor:
static object_t myobj __attribute__((init_priority (30000) )) = object_t(arg1, arg2);
The numeric priority can be from 1 to 65535, with 1 being the highest priority, and 65535 being the lowest. The default priority for objects without this attribute is 65535. Constructors with a higher priority are guaranteed execution before constructors with lower priority.
In all cases, you must provide the argument -finit-priority to the compiler on its command-line for it to recognize this attribute when you are compiling your C++ source files.
If you are using eCos, be warned that eCos uses initialization priorities internally. Ensure you choose an appropriate priority level so that other eCos subsystems will have initialized before you refer to them in your own constructor.
The GNUPro C and C++ compilers can now optionally remove these unnecessary functions from the final image. They also ensure that any shared global data is removed that is only referenced by functions that are removed. This can be done by including the options -ffunction-sections and -fdata-sections on the command-line, when you invoke the C or C++ compiler. The -ffunction-sections option removes unnecessary functions, and the -fdata-sections option removes unnecessary data.
In addition, when classes define virtual methods in C++, it is possible to remove any unused methods from the final image by passing the option -fvtable-gc to the C++ compiler on its command-line.
In all cases, you must also supply a command-line option
when linking. If invoking the linker ld directly, use --gc-sections
on its command-line; alternatively, if you are using the preferred method
of linking your executable, using the form
gcc
-o <program name> <file1>.o <file2>.o,
then also pass the option -Wl,--gc-sections
on the compiler command-line, for example:
| Type | Size (bytes) | Alignment (bytes) |
| char | 1 byte | 1 byte |
| short | 2 bytes | 2 bytes |
| int | 4 bytes | 4 bytes |
| unsigned | 4 bytes | 4 bytes |
| long | 4 bytes | 4 bytes |
| long long | 8 bytes | 8 bytes |
| float | 4 bytes | 4 bytes |
| double | 8 bytes | 8 bytes |
| pointer | 4 bytes | 4 bytes |
| Parameter registers: | |
| general-purpose | r4-r11 |
| floating point | f12-f19 |
| Register usage: | |
| fixed 0 value | r0 |
| volatile | r1-r15, r24, r25 |
| non-volatile | r16-r23, r30 |
| kernel reserved | r26, r27 |
| gp (SDA base) | r28 |
| stack pointer | r29 |
| frame pointer | r30 (if needed) |
| return address | r31 |
* If
no alloca
region the frame pointer (FP) points to the same place as SP.
Stack frames for functions that take a variable number of arguments look like this:
* If no alloca region the frame pointer (FP) points to the same place as SP.
DOUBLE OR FLOAT:
If FR > f19, go to STACK. Otherwise, load the parameter
value into
floating-point register FR and advance FR to the
next floating-point register (or register pair in 32-bit mode). Then go
to SCAN.
SIMPLE ARG:
A SIMPLE ARG is one of the following:
LONG LONG in 32-bit mode:
If GR > r10, go to STACK. Otherwise, if GR is odd, advance GR to the next register. Load the 64-bit long long value into register pair GR and GR+1. Advance GR to GR+2 and go to SCAN.
STACK:
Parameters not otherwise handled above are passed in the parameter words of the caller's stack frame. SIMPLE ARGs, as defined above, are considered to have size and alignment equal to the size of a general-purpose register, with simple argument types shorter than this sign- or zero-extended to this width. float arguments are considered to have size and alignment equal to the size of a floating-point register. In 64-bit mode, floats are stored in the low-order 32 bits of the 64-bit space allocated to them. double and long long are considered to have 64-bit size and alignment. Round STARG up to a multiple of the alignment requirement of the parameter and copy the argument byte-for-byte into STARG, STARG+1, ... STARG+size-1. Set STARG to STARG+size and go to SCAN.
Copies of large structs are made under the following rules:
| ANSI mode | K&R Mode | |
| Normal param | Callee copies if needed | Caller copies |
| Varargs (...) param | Caller copies | Caller copies |
The varargs macros set up a two-part register save area, one part for the general-purpose registers and one part for floating-point registers, and maintain separate pointers for these two areas and for the stack parameter area. The register save area lies between the caller and callee stack frame areas.
In the case of software floating-point only the general-purpose registers need to be saved. Because the save area lies between the two stack frames, the saved register parameters are contiguous with parameters passed on the stack. This allows the varargs macros to be much simpler. Only one pointer is needed, which advances from the register save area into the caller's stack frame.
| Type | Register |
| int | r2 |
| short | r2 |
| long | r2 |
| long long | r2-r3 (32-bit mode) |
| float | f0 |
| double | f0-f1 (32-bit mode) |
| struct/union | see below |
The symbols $0 through $31 refer to the general-purpose registers.
The following symbols can be used as aliases for individual registers:
| Symbol | Register |
| $at | $1 |
| $kt0 | $26 |
| $kt1 | $27 |
| $gp | $28 |
| $sp | $29 |
| $fp | $30 |
| .abicalls | .dcb.b | .fail | .irepc | .psize |
| .abort | .dcb.d | .file | .irp | .purgem |
| .aent | .dcb.l | .fill | .irpc | .quad |
| .align | .dcb.s | .float | .lcomm | .rdata |
| .appfile | .dcb.w | .fmask | .lflags | .rep |
| .appline | .dcb.x | .format | .linkonce | .rept |
| .ascii | .debug | .frame | .list | .rva |
| .asciiz | .double | .global | .livereg | .sbttl |
| .asciz | .ds | .globl | .llen | .sdata |
| .balign | .ds.b | .gpword | .loc | .set |
| .balignl | .ds.d | .half | .long | .short |
| .balignw | .ds.l | .hword | .lsym | .single |
| .bgnb | .ds.p | .if | .macro | .skip |
| .bss | .ds.s | .ifc | .mask | .space |
| .byte | .ds.w | .ifdef | .mexit | .spc |
| .comm | .ds.x | .ifeq | .mri | .stabd |
| .common | .dword | .ifeqs | .name | .stabn |
| .common.s | .eject | .ifge | .noformat | .stabs |
| .cpadd | .else | .ifgt | .nolist | .string |
| .cpload | .elsec | .ifle | .nopage | .struct |
| .cprestore | .end | .iflt | .octa | .text |
| .data | .endb | .ifnc | .offset | .title |
| .dc | .endc | .ifndef | .option | .ttl |
| .dc.b | .endif | .ifne | .org | .verstamp |
| .dc.d | .ent | .ifnes | .p2align | .word |
| .dc.l | .equ | .ifnotdef | .p2alignl | .xcom |
| .dc.s | .equiv | .include | .p2alignw | .xdef |
| .dc.w | .err | .insn | .page | .xref |
| .dc.x | .exitm | .int | .plen | .xstabs |
| .dcb | .extern | .irep | .zero |
MIPS Synthetic Instructions
Supported for the TX39
R1 R2 R3 - integer registers
I1 I2 I3 - immediate integers
I? - integer value dependent on values of macro arguments
| Instruction | Expansion |
| abs R1 R2 | bgez
R2,abs-L1
ove R1,R2 neg R1,R2 abs-L1: |
| add R1 R2 I1 | addi R1,R2,I1 |
| addu R1 R2 I1 | addiu R1,R2,I1 |
| and R1 R2 I1 | andi R1,R2,I1 |
| beq R1 I1 I2 | li
$at,I1
beq R1,$at,+I2 |
| beql R1 I1 I2 | li
$at,I1
beql R1,$at,+I2 |
| bge R1 R2 I1 | slt
$at,R1,R2
beqz $at,+I1 |
| bge R1 I1 I2 | slti
$at,R1,I1
beqz $at,+I2 |
| bgel R1 R2 I1 | slt
$at,R1,R2
beqzl $at,+I1 |
| bgel R1 I1 I2 | slti
$at,R1,I1
beqzl $at,+I2 |
| Instruction | Expansion |
| bgeu R1 R2 I1 | sltu
$at,R1,R2
beqz $at,+I1 |
| bgeu R1 I1 I2 | sltiu
$at,R1,I1
beqz $at,+I2 |
| bgeul R1 R2 I1 | sltu
$at,R1,R2
beqzl $at,+I1 |
| bgeul R1 I1 I2 | sltiu
$at,R1,I1
beqzl $at,+I2 |
| bgt R1 R2 I1 | slt
$at,R2,R1
bnez $at,+I1 |
| bgt R1 I1 I2 | slti
$at,R1,I1+1
beqz $at,+I2 |
| bgtl R1 R2 I1 | slt
$at,R2,R1
bnezl $at,+I1 |
| bgtl R1 I1 I2 | slti
$at,R1,I1+1
beqzl $at,+I2 |
| bgtu R1 R2 I1 | sltu
$at,R2,R1
bnez $at,+I1 |
| bgtu R1 I1 I2 | sltiu
$at,R1,I1+1
beqz $at,+I2 |
| bgtul R1 R2 I1 | sltu
$at,R2,R1
bnezl $at,+I1 |
| bgtul R1 I1 I2 | sltiu
$at,R1,I1+1
beqzl $at,+I2 |
| ble R1 R2 I1 | slt
$at,R2,R1
beqz $at,+I1 |
| Instruction | Expansion |
| ble R1 I1 I2 | slti
$at,R1,I1+1
bnez $at,+I2 |
| blel R1 R2 I1 | slt
$at,R2,R1
beqzl $at,+I1 |
| blel R1 I1 I2 | slti
$at,R1,I1+1
bnezl $at,+I2 |
| bleu R1 R2 I1 | sltu
$at,R2,R1
beqz $at,+I1 |
| bleu R1 I1 I2 | sltiu
$at,R1,I1+1
bnez $at,+I2 |
| bleul R1 R2 I1 | sltu
$at,R2,R1
beqzl $at,+I1 |
| bleul R1 I1 I2 | sltiu
$at,R1,I1+1
bnezl $at,+I2 |
| blt R1 R2 I1 | slt
$at,R1,R2
bnez $at,+I1 |
| blt R1 I1 I2 | slti
$at,R1,I1
bnez $at,+I2 |
| bltl R1 R2 I1 | slt
$at,R1,R2
bnezl $at,+I1 |
| bltl R1 I1 I2 | slti
$at,R1,I1
bnezl $at,+I2 |
| bltu R1 R2 I1 | sltu
$at,R1,R2
bnez $at,+I1 |
| bltu R1 I1 I2 | sltiu
$at,R1,I1
bnez $at,+I2 |
| Instruction | Expansion |
| bltul R1 R2 I1 | sltu
$at,R1,R2
bnezl $at,+I1 |
| bltul R1 I1 I2 | sltiu
$at,R1,I1
bnezl $at,+I2 |
| bne R1 I1 I2 | li
$at,I1
bne R1,$at,+I2 |
| bnel R1 I1 I2 | li
$at,I1
bnel R1,$at,+I2 |
| daddu R1 R2 I1 | daddiu R1,R2,I1 |
| ddiv R1 R2 R3 | ddiv
$zero,R2,R3
bnez R3,ddiv-L3 nop break 0x7 ddiv-L3: daddiu $at,$zero,-1 bne R3,$at,ddiv-L4 daddiu $at,$zero,1 dsll32 $at,$at,0x1f bne R2,$at,ddiv-L4 nop break 0x6 ddiv-L4: mflo R1 |
| ddiv R1 R2 I1 | li
$at,I1
ddiv $zero,R2,$at mflo R1 |
| ddivu R1 R2 R3 | ddivu
$zero,R2,R3
bnez R3,ddivu-L5 nop break 0x7 ddivu-L5: mflo R1 |
| ddivu R1 R2 I1 | li $at,I1
ddivu $zero,R2,$at mflo R1 |
| Instruction | Expansion |
| div R1 R2 R3 | div
$zero,R2,R3
bnez R3,div-L6 nop break 0x7 div-L6: li $at,-1 bne R3,$at,div-L7 lui $at,0x8000 bne R2,$at,div-L7 nop break 0x6 div-L7: mflo R1 |
| div R1 R2 I1 | li
$at,I1
div $zero,R2,$at mflo R1 |
| divu R1 R2 R3 | divu
$zero,R2,R3
bnez R3,divu-L8 nop break 0x7 divu-L8: mflo R1 |
| divu R1 R2 I1 | li
$at,I1
divu $zero,R2,$at mflo R1 |
| dla R1 I1(R2) | li
R1,I1
daddu R1,R1,R2 |
| dli R1 I1 | li R1,I1 |
| dmul R1 R2 R3 | dmultu
R2,R3
mflo R1 |
| dmul R1 R2 I1 | li
$at,I1
dmult R2,$at mflo |
| Instruction | Expansion |
| drem R1 R2 R3 | ddiv
$zero,R2,R3
bnez R3,2e4 nop break 0x7 drem-L9: daddiu $at,$zero,-1 bne R3,$at,drem-L10 daddiu $at,$zero,1 dsll32 $at,$at,0x1f bne R2,$at,drem-L10 nop break 0x6 drem-L10: mfhi R1 |
| drem R1 R2 I1 | li
$at,I1
ddiv $zero,R2,$at mfhi R1 |
| dremu R1 R2 R3 | ddivu
$zero,R2,R3
bnez R3,dremu-L11 nop break 0x7 dremu-L11: mfhi R1 |
| dremu R1 R2 I1 | li
$at,I1
ddivu $zero,R2,$at mfhi R1 |
| dsub R1 R2 I1 | daddi R1,R2,-I1 |
| dsubu R1 R2 I1 | daddiu R1,R2,-I1 |
| jal R1 R2 | jalr R1,R2 |
| jal R1 | jalr R1 |
| la R1 I1(R2) | li
R1,I1
daddu R1,R1,R2 |
| lb R1 I1(R2) | lb R1,I1(R2) |
| Instruction | Expansion |
| lbu R1 I1(R2) | lbu R1,I1(R2) |
| ld R1 I1(R2) | ld R1,I1(R2) |
| ldc2 R1 I1(R2) | ldc2 R1,I1(R2) |
| ldc3 R1 I1(R2) | ld R1,I1(R2) |
| ldl R1 I1(R2) | ldl R1,I1(R2) |
| ldr R1 I1(R2) | ldr R1,I1(R2) |
| lh R1 I1(R2) | lh R1,I1(R2) |
| lhu R1 I1(R2) | lhu R1,I1(R2) |
| li.d R1 I1 | li
R1,I?
dsll32 R1,R1,0xf |
| li.s R1 I1 | lui R1,I? |
| lwc0 R1,I1(R2) | ll R1,I1(R2) |
| mul R1 R2 R3 | multu
R2,R3
mflo R1 |
| Instruction | Expansion |
| mul R1 R2 I1 | li
$at,I1
mult R2,$at mflo R1 |
| nor R1 R2 I1 | ori
R1,R2,I1
nor R1,R1,$zero |
| or R1 R2 I1 | ori R1,R2,I1 |
| rem R1 R2 R3 | div
$zero,R2,R3
bnez R3,rem-L12 nop break 0x7 rem-L12: li $at,-1 bne R3,$at,rem-L13 lui $at,0x8000 bne R2,$at,rem-L13 nop break 0x6 rem-L13: mfhi R1 |
| rem R1 R2 I1 | li
$at,I1
div $zero,R2,$at mfhi R1 |
| remu R1 R2 R3 | divu
$zero,R2,R3
bnez R3,remu-L14 nop break 0x7 remu-L14 mfhi R1 |
| remu R1 R2 I1 | li
$at,I1
divu $zero,R2,$at mfhi R1 |
| rol R1 R2 R3 | negu
$at,R3
srlv $at,R2,$at sllv R1,R2,R3 or R1,R1,$at |
| Instruction | Expansion |
| rol R1 R2 I1 | sll
$at,R2,I1
srl R1,R2,32-I1 or R1,R1,$at |
| ror R1 R2 R3 | negu
$at,R3
sllv $at,R2,$at srlv R1,R2,R3 or R1,R1,$at |
| ror R1 R2 I1 | srl
$at,R2,I1
sll R1,R2,32-I1 or R1,R1,$at |
| sdc3 R1 I1(R2) | sd R1,I1(R2) |
| seq R1 R2 R3 | xor
R1,R2,R3
sltiu R1,R1,1 |
| seq R1 R2 I1 | xori
R1,R2,I1
sltiu R1,R1,1 |
| sge R1 R2 R3 | slt
R1,R2,R3
xori R1,R1,0x1 |
| sge R1 R2 I1 | slti
R1,R2,I1
xori R1,R1,0x1 |
| sgeu R1 R2 R3 | sltu
R1,R2,R3
xori R1,R1,0x1 |
| sgeu R1 R2 I1 | sltiu
R1,R2,I1
xori R1,R1,0x1 |
| sgt R1 R2 R3 | slt R1,R3,R2 |
| Instruction | Expansion |
| sgt R1 R2 I1 | li
$at,I1
slt R1,$at,R2 |
| sgtu R1 R2 R3 | sltu R1,R3,R2 |
| sgtu R1 R2 I1 | li
$at,I1
sltu R1,$at,R2 |
| sle R1 R2 R3 | slt
R1,R3,R2
xori R1,R1,0x1 |
| sle R1 R2 I1 | li
$at,I1
slt R1,$at,R2 xori R1,R1,0x1 |
| sleu R1 R2 R3 | sltu
R1,R3,R2
xori R1,R1,0x1 |
| sleu R1 R2 I1 | li
$at,I1
sltu R1,$at,R2 xori R1,R1,0x1 |
| slt R1 R2 I1 | slti R1,R2,I1 |
| sltu R1 R2 I1 | sltiu R1,R2,I1 |
| sne R1 R2 R3 | xor
R1,R2,R3
sltu R1,$zero,R1 |
| sne R1 R2 I1 | xori
R1,R2,I1
sltu R1,$zero,R1 |
| sub R1 R2 I1 | addi R1,R2,-I1 |
| subu R1 R2 I1 | addiu R1,R2,-I1 |
| swc0 R1 I1(R2) | sc R1,I1(R2) |
| Instruction | Expansion |
| scache R1 I1(R2) | swl R1,I1(R2) |
| invalidate R1 I1(R2) | swr R1,I1(R2) |
| teq R1 I1 | teqi R1,I1 |
| tge R1 I1 | tgei R1,I1 |
| tgeu R1 I1 | tgeiu R1,I1 |
| tlt R1 I1 | tlti R1,I1 |
| tltu R1 I1 | tltiu R1,I1 |
| tne R1 I1 | tnei R1,I1 |
| uld R1 I1(R2) | ldl
R1,I1(R2)
ldr R1,I1+7(R2) |
| ulh R1 I1(R2) | lb
R1,I1(R2)
lbu $at,I1+1(R2) sll R1,R1,0x8 or R1,R1,$at |
| ulhu R1 I1(R2) | lbu
R1,I1(R2)
lbu $at,I1+1(R2) sll R1,R1,0x8 or R1,R1,$at |
| ulw R1 I1(R2) | lwl
R1,I1(R2)
lwr R1,I1+3(R2) |
| Instruction | Expansion |
| usd R1 I1(R2) | sdl
R1,I1(R2)
sdr R1,I1+7(R2) |
| ush R1 I1(R2) | sb
R1,I1+1(R2)
srl $at,R1,0x8 sb $at,I1(R2) |
| usw R1 I1(R2) | swl
R1,I1(R2)
swr R1,I1+3(R2) |
| xor R1 R2 I1 | xori R1,R2,I1 |
There are two ways for GDB to talk to a TX39 target.
Note:
Loading binaries into the simulator that were built for
the standard evaluation board with RAM startup will not work.
To activate the simulator in GDB, follow the instructions
in the Simulator section later in this document.
target remote <devicename>
where <devicename> will be a serial device such as com2 (Windows NT) or /dev/ttyS1 (Linux). Then load the code onto the target board by typing load. After being downloaded, the program can be executed.
Debugging programs with
multiple threads
In some operating systems, such as eCos, a single program may have more than one thread of execution. The precise semantics of threads differ from one operating system to another, but in general the threads of a single program are akin to multiple processes, except that they share one address space (that is, they can all examine and modify the same variables). On the other hand, each thread has its own registers and execution stack, and perhaps private memory.
GDB provides the following functions for debugging multi-thread programs
info threads
When your program has multiple threads, you can choose
whether to set breakpoints on all threads, or on a particular thread.
If you do not specify thread <threadno> when you set a breakpoint, the breakpoint applies to all threads of your program.
You can use the thread qualifier on conditional breakpoints
as well; in this case, place thread
<threadno> before the breakpoint
condition, as the following example shows.
Conversely, whenever you restart the program, all threads start executing. This is true even when single stepping with commands like step or next. In particular, GDB cannot single-step all threads in lockstep. Since thread scheduling is up to your debugging targets operating system (not controlled by GDB), other threads may execute more than one statement while the current thread completes a single step. In general other threads stop in the middle of a statement, rather than at a clean statement boundary, when the program stops.
You might even find your program stopped in another thread after continuing or even single stepping. This happens whenever some other thread runs into a breakpoint, a signal, or an exception before the first thread completes whatever you requested..
The TX39 simulator is not designed to match timing characteristics of its target board. For example, the CPU module uses a single clock cycle for all instructions, its memory is infinitely fast, and its simulated serial I/O is infinitely fast. Furthermore, a number of obscure or inapplicable functions were omitted from the simulated peripherals. The simulator is just complex and accurate enough to run eCos programs.
The user program is provided with a single 32mb block of memory at address 0xa0000000 (shadowed at address 0x80000000).
--board=BOARD
The tx39 simulator also supports --board=jmr3904pal,
a superset of the JMR TX3904 board simulation. This adds certain virtual
devices used by eCos programs that were configured with the --platform=sim
option.