pc386dx exception 6 was Re: 4.6.0pre2 and docs released
Angelo Fraietta
angelo_f at bigpond.com
Tue Apr 22 22:42:13 UTC 2003
Joel Sherrill wrote:
>
>Angelo Fraietta wrote:
>
>>I have built and modified the ticker example to show how including
>>iostream causes the program to crash.
>>If you comment out line 23 (the include statement), the program runs.
>>This was built using gcc3.2.2. and newlib 1.11.0 And the pre-release 2.
>>
>>I am curently only able to successfully run the first pre-release using
>>gcc3.2 and newlib 1.10. As soon as I try to use anything later than
>>this, it fails.
>>
>>I am running the pc386dx BSP.
>>
>>The program fails with exception 6 immediatly after the device drivers
>>are initialised.
>>
>
>This is an illegal instruction exception. Where does the address
>reported
>correspond in your application? Can you do an objdump on the ticker
>file
>and see what is actually at that address?
>
The register values I get are
eax = 1 ecx = 150d56 edx = 150d38
esi= 150d60 edi=150e18 ebp = 165ae4 esp=165ab8
Objdump shows me addresses ranging from
100000 to 11de51 -- Which one address I look at?
I am not actually using anything in the application. I included the
iostream header but didi not use anything to make it fail. If I remove
the include directive, the app runs and is reduced by about 1050K.
>
>I see PR381 in the ChangeLog for 4.6.0pre2 and it appears to be
>committed
>to src/newlibc.c. So that shouldn't be it.
>
>What type of PC are you on? What CPU is REALLY in it? There are some
>legitimate instruction variations between ix86 CPU models. It is
>possible that the updated tool combination somehow contains or
>generates an instruction that is not valid for an i386DX. It is also
>possible that your CPU model is just enough not an i386dx where
>something
>has finally shown up.
>
I first tested on the DIMMPC, which is a 386sx. I then tested on 386dx
with no-coprocessor and it failed.
I tested on Pentium and it passed. The think that std cpp library
getting linked has co processor instructions in it. I can't find my
co-processor to plug into the dx computer right now so I can't confirm
that.
I want to re-iterate that the prerelease 1 that works is using gcc 3.2
and not 3.2.2. This also happened with 3.2.1, when I first tried to
build the pre-release 1, however, the task switching problem seemed to
take precendence.
>
>--joel
>
>>Joel Sherrill wrote:
>>
>>>Hi,
>>>
>>>RTEMS 4.6.0pre2 is now available at:
>>>
>>>ftp://ftp.oarcorp.com/pub/rtems/cd-working
>>>
>>>It closes the following PRs:
>>>
>>>PR 338/filesystem PR 348/bsps PR 349/bsps
>>>PR 351/networking PR 352/rtems_misc PR 353/bsps
>>>PR 354/networking PR 356/bsps PR 357/rtems_misc
>>>PR 360/bsps PR 367/filesystem PR 368/filesystem
>>>PR 368/filesystems PR 374/networking PR 378/bsps
>>>PR 379/bsps PR 380/bsps PR 381/core
>>>PR 383/bsps PR 385/filesystem PR 387/rtems_misc
>>>PR 388/networking PR 389/rtems
>>>
>>>[NOTE: Hopefully next time I will know how to automate the GNATS
>>>query so we will see the PR synopsis with that list. :)
>>>
>>>Corresponding documentation is at:
>>>
>>>http://www.oarcorp.com/rtemsdoc-4.6.0-pre/
>>>
>>>I hope this is the final preview before the release. But feedback is
>>>needed.
>>>
>>>Thanks
>>>
>>>--joel
>>>
>>>
>>>
>>--
>>Angelo Fraietta
>>
>>PO Box 859
>>Hamilton NSW 2303
>>
>>Home Page
>>
>>http://www.users.bigpond.com/angelo_f/
>>
>>There are those who seek knowledge for the sake of knowledge - that is CURIOSITY
>>There are those who seek knowledge to be known by others - that is VANITY
>>There are those who seek knowledge in order to serve - that is LOVE
>> Bernard of Clairvaux (1090 - 1153)
>>
>> ------------------------------------------------------------------------
>>#
>># Makefile
>>#
>>
>>#
>># RTEMS_MAKEFILE_PATH is typically set in an environment variable
>>#
>>
>>EXEC=ticker.exe
>>PGM=${ARCH}/$(EXEC)
>>
>># optional managers required
>>MANAGERS=all
>>
>># C source names
>>CSRCS = init.c
>>COBJS_ = $(CSRCS:.c=.o)
>>COBJS = $(COBJS_:%=${ARCH}/%)
>>
>># C++ source names
>>CXXSRCS = tasks.cpp
>>CXXOBJS_ = $(CXXSRCS:.cpp=.o)
>>CXXOBJS = $(CXXOBJS_:%=${ARCH}/%)
>>
>># AS source names
>>ASSRCS =
>>ASOBJS_ = $(ASSRCS:.s=.o)
>>ASOBJS = $(ASOBJS_:%=${ARCH}/%)
>>
>># Libraries
>>LIBS = -lrtemsall -lc
>>
>>include $(RTEMS_MAKEFILE_PATH)/Makefile.inc
>>
>>include $(RTEMS_CUSTOM)
>>include $(PROJECT_ROOT)/make/leaf.cfg
>>
>>OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)
>>
>>all: ${ARCH} $(PGM)
>>
>>$(PGM): $(OBJS)
>> $(make-cxx-exe)
>>
>>j:
>> @echo $(CFLAGS_DEBUG_V)
>> @echo $(RTEMS_USE_GCC272)
>>
>> ------------------------------------------------------------------------
>>/* Init
>> *
>> * This routine is the initialization task for this test program.
>> * It is called from init_exec and has the responsibility for creating
>> * and starting the tasks that make up the test. If the time of day
>> * clock is required for the test, it should also be set to a known
>> * value by this function.
>> *
>> * Input parameters: NONE
>> *
>> * Output parameters: NONE
>> *
>> * COPYRIGHT (c) 1989-1999.
>> * On-Line Applications Research Corporation (OAR).
>> *
>> * The license and distribution terms for this file may be
>> * found in the file LICENSE in this distribution or at
>> * http://www.OARcorp.com/rtems/license.html.
>> *
>> * init.c,v 1.11 2000/06/12 15:00:12 joel Exp
>> */
>>
>>#define CONFIGURE_INIT
>>#include "system.h"
>>#include <stdio.h>
>>
>>rtems_task Test_task(
>> rtems_task_argument argument
>>);
>>
>>/*
>> * Keep the names and IDs in global variables so another task can use them.
>> */
>>
>>rtems_id Task_id[ 4 ]; /* array of task ids */
>>rtems_name Task_name[ 4 ]; /* array of task names */
>>
>>rtems_task Init(
>> rtems_task_argument argument
>>)
>>{
>> rtems_status_code status;
>> rtems_time_of_day time;
>>
>> puts( "\n\n*** CLOCK TICK TEST ***" );
>>
>> time.year = 1988;
>> time.month = 12;
>> time.day = 31;
>> time.hour = 9;
>> time.minute = 0;
>> time.second = 0;
>> time.ticks = 0;
>>
>> status = rtems_clock_set( &time );
>>
>> Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
>> Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
>> Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
>>
>> status = rtems_task_create(
>> Task_name[ 1 ], 1, RTEMS_MINIMUM_STACK_SIZE * 8, RTEMS_DEFAULT_MODES,
>> RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 1 ]
>> );
>>
>> /*
>> status = rtems_task_create(
>> Task_name[ 2 ], 1, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES,
>> RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 2 ]
>> );
>> status = rtems_task_create(
>> Task_name[ 3 ], 1, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES,
>> RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 3 ]
>> );
>> */
>> if (status == RTEMS_SUCCESSFUL)
>> {
>> printf ("Stack Size = %u\r\n", RTEMS_MINIMUM_STACK_SIZE);
>> puts("Starting Task");
>> status = rtems_task_start( Task_id[ 1 ], Test_task, 1 );
>> }
>> else
>> {
>> puts("Unable to create task");
>> }
>> /*
>> status = rtems_task_start( Task_id[ 2 ], Test_task, 2 );
>> status = rtems_task_start( Task_id[ 3 ], Test_task, 3 );
>> */
>> status = rtems_task_delete( RTEMS_SELF );
>>}
>>
>> ------------------------------------------------------------------------
>>/* system.h
>> *
>> * This include file contains information that is included in every
>> * function in the test set.
>> *
>> * COPYRIGHT (c) 1989-1999.
>> * On-Line Applications Research Corporation (OAR).
>> *
>> * The license and distribution terms for this file may be
>> * found in the file LICENSE in this distribution or at
>> * http://www.OARcorp.com/rtems/license.html.
>> *
>> * system.h,v 1.13 2000/06/12 15:00:12 joel Exp
>> */
>>
>>#include <rtems.h>
>>
>>/* functions */
>>
>>rtems_task Init(
>> rtems_task_argument argument
>>);
>>
>>/* global variables */
>>
>>/*
>> * Keep the names and IDs in global variables so another task can use them.
>> */
>>
>>extern rtems_id Task_id[ 4 ]; /* array of task ids */
>>extern rtems_name Task_name[ 4 ]; /* array of task names */
>>
>>/* configuration information */
>>
>>#include <bsp.h> /* for device driver prototypes */
>>
>>#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>>#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>>
>>#define CONFIGURE_MAXIMUM_TASKS 4
>>
>>#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>>
>>#define CONFIGURE_EXTRA_TASK_STACKS (10 * RTEMS_MINIMUM_STACK_SIZE * CONFIGURE_MAXIMUM_TASKS)
>>
>>#include <confdefs.h>
>>
>>/*
>> * Handy macros and static inline functions
>> */
>>
>>/*
>> * Macro to hide the ugliness of printing the time.
>> */
>>
>>#define print_time(_s1, _tb, _s2) \
>> do { \
>> printf( "%s%02d:%02d:%02d %02d/%02d/%04d%s", \
>> _s1, (_tb)->hour, (_tb)->minute, (_tb)->second, \
>> (_tb)->month, (_tb)->day, (_tb)->year, _s2 ); \
>> fflush(stdout); \
>> } while ( 0 )
>>
>>/*
>> * Macro to print an task name that is composed of ASCII characters.
>> *
>> */
>>
>>#define put_name( _name, _crlf ) \
>> do { \
>> rtems_unsigned32 c0, c1, c2, c3; \
>> \
>> c0 = ((_name) >> 24) & 0xff; \
>> c1 = ((_name) >> 16) & 0xff; \
>> c2 = ((_name) >> 8) & 0xff; \
>> c3 = (_name) & 0xff; \
>> putchar( (char)c0 ); \
>> if ( c1 ) putchar( (char)c1 ); \
>> if ( c2 ) putchar( (char)c2 ); \
>> if ( c3 ) putchar( (char)c3 ); \
>> if ( (_crlf) ) \
>> putchar( '\n' ); \
>> } while (0)
>>
>>/*
>> * static inline routine to make obtaining ticks per second easier.
>> */
>>
>>static inline rtems_unsigned32 get_ticks_per_second( void )
>>{
>> rtems_interval ticks_per_second;
>> (void) rtems_clock_get( RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticks_per_second ); return ticks_per_second;
>>}
>>
>>/*
>> * This allows us to view the "Test_task" instantiations as a set
>> * of numbered tasks by eliminating the number of application
>> * tasks created.
>> *
>> * In reality, this is too complex for the purposes of this
>> * example. It would have been easier to pass a task argument. :)
>> * But it shows how rtems_id's can sometimes be used.
>> */
>>
>>#define task_number( tid ) \
>> ( rtems_get_index( tid ) - \
>> rtems_configuration_get_rtems_api_configuration()->number_of_initialization_tasks )
>>
>>/* end of include file */
>>
>> ------------------------------------------------------------------------
>>/* Test_task
>> *
>> * This routine serves as a test task. It verifies the basic task
>> * switching capabilities of the executive.
>> *
>> * Input parameters: NONE
>> *
>> * Output parameters: NONE
>> *
>> * COPYRIGHT (c) 1989-1999.
>> * On-Line Applications Research Corporation (OAR).
>> *
>> * The license and distribution terms for this file may be
>> * found in the file LICENSE in this distribution or at
>> * http://www.OARcorp.com/rtems/license.html.
>> *
>> * tasks.c,v 1.9 2002/04/17 14:01:40 joel Exp
>> */
>>
>>#include "system.h"
>>#include <stdio.h>
>>#include <stdlib.h>
>>#include <iostream>
>>
>>extern "C" rtems_task Test_task(
>> rtems_task_argument unused
>>)
>>{
>>
>> rtems_id tid;
>> rtems_time_of_day time;
>> rtems_unsigned32 task_index;
>> rtems_status_code status;
>>
>> status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
>> task_index = task_number( tid );
>> for ( ; ; ) {
>> printf ("tick\r\n");
>> status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
>> if ( time.second >= 35 ) {
>> puts( "*** END OF CLOCK TICK TEST ***" );
>> exit( 0 );
>> }
>>
>> print_time( " - rtems_clock_get - ", &time, "\n" );
>> status = rtems_task_wake_after( task_index * 5 * get_ticks_per_second() );
>> }
>>
>>}
>>
>
--
Angelo Fraietta
PO Box 859
Hamilton NSW 2303
Home Page
http://www.users.bigpond.com/angelo_f/
There are those who seek knowledge for the sake of knowledge - that is CURIOSITY
There are those who seek knowledge to be known by others - that is VANITY
There are those who seek knowledge in order to serve - that is LOVE
Bernard of Clairvaux (1090 - 1153)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20030423/1f6809a1/attachment-0001.html>
More information about the users
mailing list