This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FW: how to build an eCos library for ARM7tdmi simulator


Further to my original message, I have now run through it step-by-step doing
a clean install. There were some issues with the original text, so I have
updated it. I am in the process of doing an SGML version.

Robert Cragie, Design Engineer
_______________________________________________________________
Jennic Ltd, Furnival Street, Sheffield, S1 4QT,  UK
http://www.jennic.com  Tel: +44 (0) 114 281 2655

-----Original Message-----
From: ecos-discuss-owner@sources.redhat.com
[mailto:ecos-discuss-owner@sources.redhat.com]On Behalf Of Robert Cragie
Sent: 03 September 2002 09:09
To: ecos-discuss@sources.redhat.com
Subject: RE: [ECOS] how to build an eCos library for ARM7tdmi simulator


Seeing as there is some interest in this, I am attaching the draft of my
'mini-HOWTO' on how I got it going. Note this is in draft state, and I have
not followed it all step-by-step; the SID bits are from memory. I will have
a go following step-by-step when I get a spare few minutes. I would also be
interested to know how Cygwin users get on.

[snip]

<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">

<HTML>

  <HEAD>
    <TITLE>eCos and SID on ARM PID target HOWTO</TITLE>
  </HEAD>

  <BODY>

    <H1>eCos and SID on ARM PID target HOWTO</H1>

    <P>This document describes howto set up the environments for getting
eCos
      and a target application to work with SID. By the end of this
tutorial,
      you should be able to:</P>
    <OL>
      <LI>Build a simple, multi-threaded application linked with eCos.</LI>
      <LI>Build the SID simulator infrastucture to support a simulated ARM
PID
        target.</LI>
      <LI>Debug and run the application using GDB (Insight) connected to a
        simulated ARM PID target.</LI>
    </OL>

    <H2>What is eCos?</H2>

    <P>eCos is an embedded, configurable multi-threaded operating system
which
      can target many systems and CPUs.</P>

    <P>For more details see <A
HREF="http://sources.redhat.com/ecos";>Redhat's
        eCos page</A>.</P>

    <H2>What is SID?</H2>

    <P>SID is a simulation environment which allows a number of
      software-defined components to be built together to provide a target
which
      simulates a real hardware target.</P>

    <P>For more details see <A HREF="http://sources.redhat.com/sid";>Redhat's
        SID page</A>.</P>

    <H2>Assumptions</H2>

    <P>I am assuming use of the following environment:</P>
    <UL>
      <LI>Linux.</LI>
      <LI><TT>bash</TT> is used as the command shell.</LI>
      <LI>The user's user ID is 'user'.</LI>
      <LI>All created directories are based on the user's root directory
        (reached using '<TT>cd ~</TT>', or '<TT>cd /home/user</TT>').</LI>
      <LI>Superuser access is possible.</LI>
      <LI>Tcl/Tk is installed (8.0 or later)</LI>
    </UL>

    <P>It is undoubtedly possible to get it all working using
      <A HREF="http://sources.redhat.com/cygwin";>cygwin</A> on Windows(tm),
but
      I have not done this.</P>

    <P>The following syntax indicates a command run as <EM>user</EM>:</P>

    <P><TT>$ &lt;command&gt;</TT></P>

    <P>The following syntax indicates a command run as a superuser:</P>

    <P><TT># &lt;command&gt;</TT></P>

    <H1>Installing eCos</H1>

    <H2>Getting eCos source</H2>

    <P>I would strongly recommend getting the latest CVS version of eCos,
and
      not to attempt to use version 1.3.1, which still seems to be being
used
      even though it is very old. The following contains extracts from
Redhat's
      <A HREF="http://sources.redhat.com/ecos/anoncvs.html";>eCos anonymous
CVS
        page</A>.</P>

    <P>Type the following command to login to the CVS server:</P>

    <P><TT>$ cvs -d :pserver:anoncvs@sources.redhat.com:/cvs/ecos
login</TT></P>

    <P>You will be prompted for a password which is <EM>anoncvs</EM>. You
only
      need to perform this login the first time you access the eCos CVS
      repository. The password is saved in the file <TT>.cvspass</TT> in
your
      home directory for use in subsequent sessions.</P>

    <P>It is recommended that you use different directory trees for the
      anonymous CVS sources and for full releases of eCos. Create a new
      directory for the check out and change to that directory:</P>

    <P><TT>$ mkdir ~/ecos-cvs</TT></P>

    <P><TT>$ cd ~/ecos-cvs</TT></P>

    <P>Now type:</P>

    <P><TT>$ cvs -d :pserver:anoncvs@sources.redhat.com:/cvs/ecos co -P
ecos</TT>
    </P>

    <P>This command should initiate a connection to the CVS server and check
      out the latest version of eCos, including TCP/IP networking stack and
      SNMP. It may take quite a while.</P>

    <P>If you are unable to use CVS, David Airlie of Parthus Technologies
plc.
      <A HREF="ftp://ftp.skynet.ie/cvs";>places complete CVS snapshots
here</A>;
      obtain the latest one of these and unzip it into the <TT>ecos-cvs</TT>
      directory.</P>

    <H2>Getting eCos Configuration Tool Version 2</H2>

    <P>I would recommend using the graphical Configuration Tool as it is
      generally easier to use than trying to decipher the relatively terse
      configuration files to change options. The following contains extracts
      from Redhat's <A HREF="http://sources.redhat.com/ecos/ct2.html";>eCos
        Configuration Tool Version 2 page</A>:</P>

    <P>Download
      <A
HREF="ftp://sources.redhat.com/pub/ecos/ct2/configtool-2.11-i386.tar.gz";>con
figtool-2.11-i386.tar.gz
        (3.1Mb)</A> or
      <A
HREF="ftp://sources.redhat.com/pub/ecos/ct2/configtool-2.11-i386.tar.bz2";>co
nfigtool-2.11-i386.tar.bz2
        (2.8Mb)</A></P>

    <P>Login as superuser and unarchive the tar file into a suitable
directory.
      I am assuming here that <TT>/opt/ecos/configtool</TT> is the required
      destination directory for all files (note: <TT>configtool</TT> does
not
      have to be installed by superuser, but it is preferable):</P>

    <P><TT>$ su</TT></P>

    <P><TT># mkdir -p /opt/ecos/configtool/bin</TT></P>

    <P><TT># cd /opt/ecos/configtool/bin</TT></P>

    <P><TT># tar xvfz /home/user/configtool-2.11-i386.tar.gz</TT> </P>

    <P>(or, if you dowloaded the bz2 version:)</P>

    <P><TT># bunzip2 -c /home/user/configtool-2.11-i386.tar.bz2 | tar
xvf -</TT></P>

    <P>As there is only one executable, it is probably easiest to create a
      symbolic link to it:</P>

    <P><TT># ln -s /opt/ecos/configtool/configtool-2.11/bin/configtool
      /usr/bin/configtool</TT></P>

    <P>Alternatively, make sure that
<TT>/opt/ecos/configtool/configtool-2.11/bin</TT>
      is added to your PATH environment variable.</P>

    <P>The following files will be extracted to the installation
directory:</P>

    <P><TT>configtool, ecoslogo.png, rhlogo.png, about.htm, README.txt,
      license.txt, ecosplatforms.tar.gz, manual/</TT></P>

    <P>Optionally, untar the contents of ecosplatforms.tar.gz into your home
      directory, where it will create a directory called .eCosPlatforms. The
      information in these files isn't yet used by the Configuration Tool,
but
      will keep the tool from generating some warnings.</P>

    <P>The executable is statically linked to the wxWindows library, but
does
      require the GTK+ 1.2, GDK 1.2 and TCL 8.x libraries to be installed.
</P>

    <P><STRONG>Note: On SuSE Linux, there needs to be an additional symbolic
      link to the Tcl library. Do the following:</STRONG></P>

    <P><TT># cd /usr/lib</TT></P>

    <P><TT># ln -s libtcl8.3.so libtcl.so</TT></P>

    <H2>Getting <TT>arm-elf</TT> tools</H2>

    <P>As this is a complex procedure, you need to follow the directions
      <A
HREF="http://sources.redhat.com/ecos/tools/linux-arm-elf.html";>here</A>
      exactly. Once you have done this, you will have all the required tools
      needed to build for an <TT>arm-elf</TT> target (note this does not
      include the thumb target).</P>

    <P><STRONG>Note that the link to Insight 5.0 is broken. However, I have
      downloaded and installed
      <A
HREF="ftp://sources.redhat.com/pub/gdb/releases/insight-5.2.1.tar.bz2";>Insig
ht
        5.2.1 (insight-5.2.1.tar.bz2)</A> instead and see that it has some
      worthwhile bugfixes from 5.0.</STRONG></P>

    <H2>Building eCos environment for PID target</H2>

    <H3>Set the repository</H3>

    <P>Assuming you have checked out the latest version to a directory
called
      <TT>ecos-cvs</TT>, you need to set the following environment variable
for
      the Configuration Tool to pick up where all the source is (known as
the
      <EM>repository</EM>, not to be confused with the CVS repository):</P>

    <P><TT>$ ECOS_REPOSITORY=/home/user/ecos-cvs/ecos/packages; export
      ECOS_REPOSITORY</TT></P>

    <P>This line should also be added to your shell initialisation script
(<TT>.bashrc</TT>,
      or <TT>.bash_profile</TT>)</P>

    <H3>Create the <TT>ecos.ecc</TT> file</H3>

    <P>Create a new directory in your home directory and change to it:</P>

    <P><TT>$ mkdir -p ~/ecos-targets/pid-current</TT></P>

    <P><TT>$ cd ~/ecos-targets/pid-current</TT></P>

    <H3>Run the configtool</H3>

    <P>Enter the following</P>

    <P><TT>$ configtool</TT></P>

    <P>You should see the Configuration Tool start.</P>

    <H3>Create default settings for the PID target</H3>

    <P>Select the <EM>Build-&gt;Templates...</EM> menu item. In the
<EM>Hardware</EM>
      combo box, select <EM>ARM development board (PID)</EM>, and press
'OK'.</P>

    <P>Change the following options:</P>

    <P><EM>eCos HAL-&gt;ROM Monitor support-&gt;Work with a ROM Monitor</EM>
      to disabled (unchecked)</P>

    <P><EM>eCos HAL-&gt;Platform-independent HAL options-&gt;Route
diagnostic
      output to debug channel</EM> to disabled (unchecked)</P>

    <P>Now save the file as <TT>ecos.ecc</TT> using the <EM>File-&gt;Save
      as...</EM> menu item</P>

    <H3>Build the tree</H3>

    <P>To build the tree for the PID development board, select the
<EM>Build-&gt;Generate
      Build Tree</EM> menu item. You will see three directories:
<TT>ecos_build</TT>,
      <TT>ecos_install</TT> and <TT>ecos_mlt</TT></P>

    <H3>Make the libraries</H3>

    <P><TT>$ cd ecos_build</TT></P>

    <P><TT>$ make</TT></P>

    <P>This will place all the required files for an application in
<TT>ecos_install</TT>.
    </P>

    <H3>Create the 'two threads' example</H3>

    <P><TT>$ cd ../ecos_install</TT></P>

    <P><TT>$ mkdir examples</TT></P>

    <P><TT>$ cd examples</TT></P>

    <P><A
HREF="http://sources.redhat.com/ecos/docs-latest/tutorials/arm/ecos-tutorial
.13.html#pgfId=1982019">Get
        the two threads source code from here</A>. Copy it into a file
called
      <TT>twothreads.c</TT>.</P>

    <P>Build this as follows</P>

    <P><TT>$ arm-elf-gcc -g -I../include twothreads.c -L../lib -o
twothreads.x
      -Ttarget.ld -nostdlib</TT></P>

    <P>There should be no errors. You now have the executable
(<TT>twothreads.x</TT>)
      which you can download, debug and run on the SID target using Insight,
or
      gdb.</P>

    <H1>Installing SID</H1>

    <H2>Getting SID source</H2>

    <P><STRONG></STRONG>The following contains extracts from Redhat's
      <A HREF="http://sources.redhat.com/sid";>SID page</A>.</P>

    <P>Type the following command to login to the CVS server:</P>

    <P><TT>$ cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src
login</TT></P>

    <P>You will be prompted for a password which is <EM>anoncvs</EM>. You
only
      need to perform this login the first time you access the SID CVS
      repository. The password is saved in the file <TT>.cvspass</TT> in
your
      home directory for use in subsequent sessions.</P>

    <P>It is recommended that you use different directory trees for the
      anonymous CVS sources and for full releases of SID. Create a new
directory
      for the check out and change to that directory:</P>

    <P><TT>$ mkdir ~/sid-cvs</TT></P>

    <P><TT>$ cd ~/sid-cvs</TT></P>

    <P>Now type:</P>

    <P><TT>$ cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src co
sid</TT>
    </P>

    <P>This command should initiate a connection to the CVS server and check
      out the latest version of SID. It may take quite a while.</P>

    <P>If you are unable to use CVS, automated CVS snapshots are available
      <A HREF="ftp://sources.redhat.com/pub/sid/snapshots";>here</A>; obtain
the
      latest one of these and unzip it into the <TT>sid-cvs</TT>
directory.</P>

    <H2>Building SID</H2>

    <P>Having checked out the source, you should see a single <TT>src</TT>
      subdirectory in the <TT>sid-cvs</TT> directory. Create a
<TT>build</TT>
      directory alongside this:</P>

    <P><TT>$ mkdir build</TT></P>

    <P><TT>$ cd build</TT></P>

    <P>Login as superuser and run <TT>configure</TT> to produce the build
      tree. I am assuming here that <TT>/opt/sid</TT> is the required
      destination directory for all files:</P>

    <P><TT>$ su</TT></P>

    <P><TT># ../src/configure --prefix=/opt/sid --exec-prefix=/opt/sid
2&gt;&amp;1
      | tee configure.out</TT></P>

    <P>You will need the additional
      <A HREF="http://sources.redhat.com/ml/sid/2002-q3/msg00036.html";>patch
        submitted by Robert Cragie on 03-Sep-02</A>:</P>

    <P><TT># cd ~/sid-cvs/src/cgen/cpu</TT></P>

    <P><TT># patch -p0 &lt; arm7.cpu.patch</TT></P>

    <P><TT># cd ~/sid-cvs/build/sid/component/cgen-cpu/arm7t</TT></P>

    <P><TT># make cgen-all</TT></P>

    <P>Now make all the files and install them:</P>

    <P><TT># cd ~/sid-cvs/build</TT></P>

    <P><TT># make all install</TT></P>

    <P>Note that this may take a <EM>very</EM> long time (hours).</P>

    <P>Add the executable directory to the path:</P>

    <P><TT>$ export PATH=/opt/sid/bin:$PATH</TT></P>

    <P>This line should also be added to your shell initialisation script
(<TT>.bashrc</TT>,
      or <TT>.bash_profile</TT>)</P>

    <H1>Running a sample session </H1>

    <P>Change back to where the twothreads executable is:</P>

    <P><TT>$ cd ~/ecos-targets/pid-current/ecos_install/examples</TT></P>

    <P>Run SID with the following options:</P>

    <P><TT>$ arm-elf-sid --board=pid7t-normalmap --gdb=2000 -EL --tksm
&amp;</TT></P>

    <P>What this actually does is run a script file called
<TT>arm-elf-sid</TT>.
      This in turn runs a more complex Perl script called
<TT>configrun-sid</TT>,
      which builds the complex configuration file needed for SID on the fly,
and
      then runs it.</P>
    <UL>
      <LI>The <TT>--board=pid7t</TT> option is a <TT>configrun-sid</TT>
        option which specifies that the configuration file for the PID7T
target
        should be constructed. The additional <TT>-normalmap</TT> option
        ensures that the remapping operations done at startup by eCos do not
        affect the board.</LI>
      <LI>The <TT>--gdb=2000</TT> option is also a <TT>configrun-sid</TT>
        option which specifies that the configuration file should also
include a
        stub to allow GDB connection to the PID7T target via TCP/IP using
port
        2000.</LI>
      <LI>The -EL option specifies little-endian mode</LI>
      <LI>The <TT>--tksm</TT> option is also a <TT>configrun-sid</TT> option
        which specifies that the configuration file should also include an
        experimental GUI interface which can show the 'innards' of the
target.
        This is needed to see the output from the UART.</LI>
      <LI><TT>&amp;</TT> simply runs it as a background task.</LI>
    </UL>

    <P>Select the experimental GUI window titled 'System Monitor' and
      left-click and hold on 'uart1' in the left hand column. Select 'GUIs'
and
      then 'tk tty'. You should see an empty window called 'hw-uart-ns16550
      uart1' come up.</P>

    <P>Run GDB (I am assuming you are using Insight):</P>

    <P><TT>$ arm-elf-gdb twothreads.x</TT></P>

    <P>Connect to the target by selecting the <EM>Run-&gt;Connect to
target</EM>
      menu item. Initially, you will get a dialog box; select the following
      options in the combo boxes on the left hand side:</P>
    <TABLE WIDTH="50%" BORDER="1">
      <TR>
        <TD WIDTH="80"><EM>Target</EM></TD>
        <TD WIDTH="129">Remote/TCP</TD>
      </TR>
      <TR>
        <TD WIDTH="80"><EM>Hostname</EM></TD>
        <TD WIDTH="129">localhost</TD>
      </TR>
      <TR>
        <TD WIDTH="80"><EM>Port</EM></TD>
        <TD WIDTH="129">2000</TD>
      </TR>
    </TABLE>

    <P>Enable (check) the <EM>Set breakpoint at</EM> checkbox, and enter
      'cyg_user_start' in the edit box to the right.</P>

    <P>Disable (uncheck) the <EM>Display download Dialog</EM> checkbox.</P>

    <P>Click on OK. You should see a dialog saying 'Successfully connected';
      press OK on this dialog to dismiss it. Note that on Insight 5.2.1
these
      settings are remembered on further connections to the target.</P>

    <P>Download the code to the target by selecting the
<EM>Run-&gt;Download</EM>
      menu item.You should see a blue bar in the status bar showing the
download
      progress.</P>

    <P>Run the code by selecting the <EM>Run-&gt;Run</EM> menu item. You
      should see the code run up to the breakpoint specified at
      'cyg_user_start'.</P>

    <P>Continue the execution by selecting the <EM>Control-&gt;Continue</EM>
      menu item. You will see it hit another breakpoint at the end of
'main',
      and another at 'exit'; ignore these and continue the execution further
by
      selecting the <EM>Control-&gt;Continue</EM> menu item in each
case.</P>

    <P>Select the 'hw-uart-ns16550 uart1' window. You should already see the
      following text:</P>

    <P><TT>Entering twothreads' cyg_user_start() function<BR>
       Beginning execution, thread data is 0<BR>
       Beginning execution, thread data is 1</TT></P>

    <P>Wait patiently. After a while, you should see something like the
      following:</P>

    <P><TT>Thread 0: and now a delay of 239 clock ticks<BR>
       Thread 1: and now a delay of 230 clock ticks</TT></P>

    <P>You are now running a fully multi-thread application using eCos
running
      on a simulated real target board (i.e. one which actually exists in
real
      life).</P>

    <H1>Finishing the sample session </H1>

    <P>To finish, simply exit GDB as usual, and kill SID by typing:</P>

    <P><TT>$ killall -9 sid</TT></P>

    <H1>Further issues</H1>

    <P>The main problem with the simulation is that the timer tick seems to
be
      running much slower than it would do in real life. This needs to be
looked
      at. If the delays are reduced in <TT>twothreads.c</TT> then the above
      will run quicker.</P>

    <P>SID is a complex package, and modifying it for other targets will
      require a very good understanding of how it all works and fits
together.
      It may also require additional components to be written. This is not a
      trivial task.</P>
  </BODY>
</HTML>



-- 
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]