mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 05:37:46 +08:00
2007-12-14 Joel Sherrill <joel.sherrill@OARcorp.com>
* sp09/screen07.c, sp09/sp09.scn: Add test for rtems_message_queue_broadcast for bad buffer and count pointers. * sp30/init.c, sp30/sp30.scn: Add test for initiating timer server with bad priority or initiating twice. * sp37/sp37.scn, sp37/system.h: Add test for rtems_clock_tick when it forces a dispatch. * sp37/init.c: New file.
This commit is contained in:
@@ -1,3 +1,13 @@
|
||||
2007-12-14 Joel Sherrill <joel.sherrill@OARcorp.com>
|
||||
|
||||
* sp09/screen07.c, sp09/sp09.scn: Add test for
|
||||
rtems_message_queue_broadcast for bad buffer and count pointers.
|
||||
* sp30/init.c, sp30/sp30.scn: Add test for initiating timer server
|
||||
with bad priority or initiating twice.
|
||||
* sp37/sp37.scn, sp37/system.h: Add test for rtems_clock_tick when
|
||||
it forces a dispatch.
|
||||
* sp37/init.c: New file.
|
||||
|
||||
2007-12-13 Joel Sherrill <joel.sherrill@OARcorp.com>
|
||||
|
||||
* Makefile.am, configure.ac: Add new tests for interrupt disable,
|
||||
|
||||
@@ -241,4 +241,21 @@ void Screen7()
|
||||
"rtems_message_queue_urgent with illegal id"
|
||||
);
|
||||
puts( "TA1 - rtems_message_queue_urgent - RTEMS_INVALID_ID" );
|
||||
|
||||
status = rtems_message_queue_broadcast( Queue_id[ 1 ], NULL, MESSAGE_SIZE, &count );
|
||||
fatal_directive_status(
|
||||
status,
|
||||
RTEMS_INVALID_ADDRESS,
|
||||
"rtems_message_queue_broadcast with NULL count"
|
||||
);
|
||||
puts( "TA1 - rtems_message_queue_broadcast - NULL buffer - RTEMS_INVALID_ADDRESS" );
|
||||
|
||||
status = rtems_message_queue_broadcast( Queue_id[ 1 ], buffer, MESSAGE_SIZE, NULL );
|
||||
fatal_directive_status(
|
||||
status,
|
||||
RTEMS_INVALID_ADDRESS,
|
||||
"rtems_message_queue_broadcast with NULL count"
|
||||
);
|
||||
puts( "TA1 - rtems_message_queue_broadcast - NULL count - RTEMS_INVALID_ADDRESS" );
|
||||
|
||||
}
|
||||
|
||||
@@ -122,6 +122,8 @@ TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL
|
||||
TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL
|
||||
TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY
|
||||
TA1 - rtems_message_queue_urgent - RTEMS_INVALID_ID
|
||||
TA1 - rtems_message_queue_broadcast - NULL buffer - RTEMS_INVALID_ADDRESS
|
||||
TA1 - rtems_message_queue_broadcast - NULL count - RTEMS_INVALID_ADDRESS
|
||||
<pause - screen 8>
|
||||
TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL
|
||||
TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL
|
||||
|
||||
@@ -39,6 +39,20 @@ rtems_task Init(
|
||||
status = rtems_clock_set( &time );
|
||||
directive_failed( status, "rtems_clock_set" );
|
||||
|
||||
/* initiate with bad priority */
|
||||
puts( "timer_initiate_server -- INVALID_PRIORITY" );
|
||||
status = rtems_timer_initiate_server(
|
||||
1000,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_ATTRIBUTES
|
||||
);
|
||||
fatal_directive_status(
|
||||
status,
|
||||
RTEMS_INVALID_PRIORITY,
|
||||
"rtems_timer_initiate_server bad priority"
|
||||
);
|
||||
|
||||
puts( "timer_initiate_server -- OK" );
|
||||
status = rtems_timer_initiate_server(
|
||||
RTEMS_TIMER_SERVER_DEFAULT_PRIORITY,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
@@ -46,6 +60,22 @@ rtems_task Init(
|
||||
);
|
||||
directive_failed( status, "rtems_timer_initiate_server" );
|
||||
|
||||
puts( "timer_initiate_server -- already started" );
|
||||
status = rtems_timer_initiate_server(
|
||||
RTEMS_TIMER_SERVER_DEFAULT_PRIORITY,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_ATTRIBUTES
|
||||
);
|
||||
fatal_directive_status(
|
||||
status,
|
||||
RTEMS_INCORRECT_STATE,
|
||||
"rtems_timer_initiate_server already started"
|
||||
);
|
||||
|
||||
/*
|
||||
* Create test tasks
|
||||
*/
|
||||
|
||||
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', ' ' );
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
*** TEST 30 ***
|
||||
timer_initiate_server -- INVALID_PRIORITY
|
||||
timer_initiate_server -- OK
|
||||
timer_initiate_server -- already started
|
||||
TA1 - rtems_clock_get - 09:00:00 12/31/1988
|
||||
TA2 - rtems_clock_get - 09:00:00 12/31/1988
|
||||
TA3 - rtems_clock_get - 09:00:00 12/31/1988
|
||||
TA1 - rtems_clock_get - 09:00:05 12/31/1988
|
||||
TA2 - rtems_clock_get - 09:00:10 12/31/1988
|
||||
TA1 - rtems_clock_get - 09:00:10 12/31/1988
|
||||
TA3 - rtems_clock_get - 09:00:15 12/31/1988
|
||||
TA1 - rtems_clock_get - 09:00:15 12/31/1988
|
||||
TA3 - rtems_clock_get - 09:00:15 12/31/1988
|
||||
TA2 - rtems_clock_get - 09:00:20 12/31/1988
|
||||
TA1 - rtems_clock_get - 09:00:20 12/31/1988
|
||||
TA1 - rtems_clock_get - 09:00:25 12/31/1988
|
||||
TA3 - rtems_clock_get - 09:00:30 12/31/1988
|
||||
TA2 - rtems_clock_get - 09:00:30 12/31/1988
|
||||
TA1 - rtems_clock_get - 09:00:30 12/31/1988
|
||||
TA3 - rtems_clock_get - 09:00:30 12/31/1988
|
||||
*** END OF TEST 30 ***
|
||||
|
||||
@@ -0,0 +1,273 @@
|
||||
/*
|
||||
* Interrupt Disable/Enable Tests
|
||||
* Clock Tick from task level
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* 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.rtems.com/license/LICENSE.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
|
||||
#define TEST_INIT
|
||||
#include "system.h"
|
||||
|
||||
void test_interrupt_inline(void)
|
||||
{
|
||||
rtems_interrupt_level level;
|
||||
boolean in_isr;
|
||||
|
||||
puts( "interrupt is in progress (use body)" );
|
||||
in_isr = rtems_interrupt_is_in_progress();
|
||||
if ( in_isr ) {
|
||||
puts( "interrupt reported to be is in progress (body)" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
|
||||
puts( "interrupt disable (use inline)" );
|
||||
rtems_interrupt_disable( level );
|
||||
|
||||
puts( "interrupt flash (use inline)" );
|
||||
rtems_interrupt_flash( level );
|
||||
|
||||
puts( "interrupt enable (use inline)" );
|
||||
rtems_interrupt_enable( level );
|
||||
}
|
||||
|
||||
volatile int isr_in_progress_body;
|
||||
volatile int isr_in_progress_inline;
|
||||
|
||||
void check_isr_in_progress_inline(void)
|
||||
{
|
||||
boolean in_isr;
|
||||
|
||||
in_isr = rtems_interrupt_is_in_progress();
|
||||
isr_in_progress_inline = ( in_isr ) ? 1 : 2;
|
||||
}
|
||||
|
||||
#undef rtems_interrupt_disable
|
||||
#undef rtems_interrupt_enable
|
||||
#undef rtems_interrupt_flash
|
||||
#undef rtems_interrupt_is_in_progress
|
||||
|
||||
rtems_timer_service_routine test_isr_in_progress(
|
||||
rtems_id timer,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
boolean in_isr;
|
||||
|
||||
check_isr_in_progress_inline();
|
||||
|
||||
in_isr = rtems_interrupt_is_in_progress();
|
||||
isr_in_progress_body = ( in_isr ) ? 1 : 2;
|
||||
}
|
||||
|
||||
void check_isr_worked(
|
||||
char *s,
|
||||
int result
|
||||
)
|
||||
{
|
||||
switch (result) {
|
||||
case -1:
|
||||
printf( "isr_in_progress(%s) timer did not fire\n", s );
|
||||
break;
|
||||
case 1:
|
||||
printf( "isr_in_progress(%s) from ISR -- OK\n", s );
|
||||
break;
|
||||
case 2:
|
||||
printf( "isr_in_progress(%s) from ISR -- returned bad value\n");
|
||||
rtems_test_exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
volatile int blocked_task_status;
|
||||
rtems_id blocked_task_id;
|
||||
|
||||
rtems_task blocked_task(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
rtems_status_code status;
|
||||
|
||||
puts( "Blocking task... suspending self" );
|
||||
blocked_task_status = 1;
|
||||
status = rtems_task_suspend( RTEMS_SELF );
|
||||
directive_failed( status, "rtems_task_suspend" );
|
||||
|
||||
blocked_task_status = 3;
|
||||
status = rtems_task_delete( RTEMS_SELF );
|
||||
directive_failed( status, "rtems_task_delete" );
|
||||
}
|
||||
|
||||
/*
|
||||
* Timer Service Routine
|
||||
*
|
||||
* If we are in an ISR, then this is a normal clock tick.
|
||||
* If we are not, then it is the test case.
|
||||
*/
|
||||
rtems_timer_service_routine test_unblock_task(
|
||||
rtems_id timer,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
boolean in_isr;
|
||||
rtems_status_code status;
|
||||
|
||||
in_isr = rtems_interrupt_is_in_progress();
|
||||
status = rtems_task_is_suspended( blocked_task_id );
|
||||
if ( in_isr ) {
|
||||
status = rtems_timer_fire_after( timer, 1, test_unblock_task, NULL );
|
||||
directive_failed( status, "timer_fire_after failed" );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (status != RTEMS_ALREADY_SUSPENDED) ) {
|
||||
status = rtems_timer_fire_after( timer, 1, test_unblock_task, NULL );
|
||||
directive_failed( status, "timer_fire_after failed" );
|
||||
return;
|
||||
}
|
||||
|
||||
blocked_task_status = 2;
|
||||
_Thread_Disable_dispatch();
|
||||
status = rtems_task_resume( blocked_task_id );
|
||||
_Thread_Unnest_dispatch();
|
||||
directive_failed( status, "rtems_task_resume" );
|
||||
}
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
rtems_time_of_day time;
|
||||
rtems_status_code status;
|
||||
rtems_interrupt_level level;
|
||||
boolean in_isr;
|
||||
rtems_id timer;
|
||||
int i;
|
||||
|
||||
puts( "\n\n*** TEST 37 ***" );
|
||||
|
||||
build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
|
||||
status = rtems_clock_set( &time );
|
||||
directive_failed( status, "rtems_clock_set" );
|
||||
|
||||
/*
|
||||
* Timer used in multiple ways
|
||||
*/
|
||||
status = rtems_timer_create( 1, &timer );
|
||||
directive_failed( status, "rtems_timer_create" );
|
||||
|
||||
/*
|
||||
* Test clock tick from outside ISR
|
||||
*/
|
||||
status = rtems_clock_tick();
|
||||
directive_failed( status, "rtems_clock_tick" );
|
||||
puts( "clock_tick from task level" );
|
||||
|
||||
/*
|
||||
* Now do a dispatch directly out of a clock tick that is
|
||||
* called from a task. We need to create a task that will
|
||||
* block so we have one to unblock. Then we schedule a TSR
|
||||
* to run in the clock tick but it has to be careful to
|
||||
* make sure it is not called from an ISR and that the
|
||||
* dispatching critical section is managed properly to
|
||||
* make the dispatch happen.
|
||||
*/
|
||||
|
||||
blocked_task_status = -1;
|
||||
|
||||
status = rtems_task_create(
|
||||
rtems_build_name( 'T', 'A', '1', ' ' ),
|
||||
1,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&blocked_task_id
|
||||
);
|
||||
directive_failed( status, "rtems_task_create" );
|
||||
|
||||
status = rtems_task_start( blocked_task_id, blocked_task, 0 );
|
||||
directive_failed( status, "rtems_task_start" );
|
||||
|
||||
status = rtems_task_wake_after( 10 );
|
||||
directive_failed( status, "rtems_task_wake_after" );
|
||||
|
||||
status = rtems_timer_fire_after( timer, 1, test_unblock_task, NULL );
|
||||
directive_failed( status, "timer_fire_after failed" );
|
||||
|
||||
/* we expect to be preempted from this call */
|
||||
for ( i=0 ; i<100 && blocked_task_status != 3 ; i++ ) {
|
||||
status = rtems_clock_tick();
|
||||
directive_failed( status, "rtems_clock_tick" );
|
||||
}
|
||||
switch ( blocked_task_status ) {
|
||||
case -1:
|
||||
puts( "clock_tick with task preempt -- task blocked, timer did not fire" );
|
||||
rtems_test_exit(0);
|
||||
break;
|
||||
case 1:
|
||||
puts( "clock_tick with task preempt -- timer fired case 1" );
|
||||
rtems_test_exit(0);
|
||||
break;
|
||||
case 2:
|
||||
puts( "clock_tick with task preempt -- timer fired case 2" );
|
||||
rtems_test_exit(0);
|
||||
break;
|
||||
case 3:
|
||||
puts( "clock_tick from task level with preempt -- OK" );
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Test interrupt inline versions
|
||||
*/
|
||||
test_interrupt_inline();
|
||||
|
||||
/*
|
||||
* Test interrupt bodies
|
||||
*/
|
||||
puts( "interrupt is in progress (use body)" );
|
||||
in_isr = rtems_interrupt_is_in_progress();
|
||||
if ( in_isr ) {
|
||||
puts( "interrupt reported to be is in progress (body)" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
|
||||
puts( "interrupt disable (use body)" );
|
||||
rtems_interrupt_disable( level );
|
||||
|
||||
puts( "interrupt disable (use body)" );
|
||||
rtems_interrupt_disable( level );
|
||||
|
||||
puts( "interrupt flash (use body)" );
|
||||
rtems_interrupt_flash( level );
|
||||
|
||||
puts( "interrupt enable (use body)" );
|
||||
rtems_interrupt_enable( level );
|
||||
|
||||
/*
|
||||
* Test ISR in progress from actual ISR
|
||||
*/
|
||||
isr_in_progress_body = -1;
|
||||
isr_in_progress_inline = -1;
|
||||
|
||||
status = rtems_timer_fire_after( timer, 10, test_isr_in_progress, NULL );
|
||||
directive_failed( status, "timer_fire_after failed" );
|
||||
|
||||
status = rtems_task_wake_after( 100 );
|
||||
directive_failed( status, "wake_after failed" );
|
||||
|
||||
check_isr_worked( "inline", isr_in_progress_body );
|
||||
|
||||
check_isr_worked( "body", isr_in_progress_body );
|
||||
|
||||
|
||||
puts( "*** END OF TEST 37 ***" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
*** TEST 37 ***
|
||||
clock_tick from task level
|
||||
Blocking task... suspending self
|
||||
clock_tick from task level with preempt -- OK
|
||||
interrupt is in progress (use body)
|
||||
interrupt disable (use inline)
|
||||
interrupt flash (use inline)
|
||||
|
||||
@@ -27,8 +27,10 @@ rtems_task Init(
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
#define CONFIGURE_INIT_TASK_PRIORITY 2
|
||||
#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_PREEMPT
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 1
|
||||
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||
#define CONFIGURE_MAXIMUM_TIMERS 1
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
Reference in New Issue
Block a user