Compare commits

...

14 Commits

Author SHA1 Message Date
Chris Johns
0a46769ba4 waf: Handle no version label in VERSION when a release
Closes #5185
2025-01-22 13:55:03 +11:00
Kinsey Moore
f7de6d5425 spec/pkgconfig: Account for separate compilation and linking
When compilation and linking are performed separately, some platforms
(i.e. RISC-V) may require that ABI flags are provided during the linking
step as well as the compilation step.

Closes #5183
2025-01-16 19:02:56 -06:00
Sebastian Huber
34ba74f4f4 score: Fix RTEMS_DEBUG build
Close #5159.
2025-01-08 06:41:12 +01:00
Chris Johns
d61a739e41 waf: Update to waf-2.1.4
Closes #5167
2024-12-22 10:42:40 +11:00
Sebastian Huber
a357119bd6 build: Improve Makefile.inc
Support relocated BSP installations by letting the user provide
RTEMS_ROOT.

Close #5171.
2024-12-05 04:11:45 +01:00
Sebastian Huber
e79dc64c8e rtems: Remove pre-qualified constraints
The pre-qualified constraints are not applicable to mainline RTEMS.
2024-11-27 04:47:26 +01:00
Sebastian Huber
7f00921b07 score: Support scheduler change inhibitors
For example, the POSIX sporadic server adds a second priority to a
thread.  We cannot account for this priority in a scheduler change.

Update #5164.
2024-11-27 02:17:14 +00:00
Sebastian Huber
63c5d062c3 score: Fix _Thread_Priority_change()
The POSIX sporadic server may temporarily remove the real priority of a
thread.  Check that the priority node is active before the change is
propagated.

Update #5164.
2024-11-27 02:17:14 +00:00
Sebastian Huber
65e480312c posix: Use real priority for sporadic server state
This allows to other areas to use the real priority node state.

Update #5164.
2024-11-27 02:17:14 +00:00
Sebastian Huber
78e5e76572 psxtests/psx09: Change prio while at low prio
Update #5164.
2024-11-27 02:17:14 +00:00
Sebastian Huber
5eb938283d psxtests/psx09: Improve sporadic server tests
Drop thread parameter from get_current_prio().

Lock/unlock ceiling mutex while executing at low and high priority.

Update #5164.
2024-11-27 02:17:14 +00:00
Sebastian Huber
e565dbba65 psxtests/psx09: Use local variables
Update #5164.
2024-11-27 02:17:14 +00:00
Kinsey Moore
106d00537e posix/lio_listio: corrected addition of system event
Previously the system event used by lio_listio was manually added to
event.h and not using rtems-central. This patch corrects that and renames
the event to make it clearer.

Some related dead code has also been removed.


(cherry picked from commit cabc8c3a78)

Co-authored-by: alessandronardin <ale.daluch@gmail.com>
2024-11-26 19:42:12 +00:00
Chris Johns
c529694656 cpukit/jffs2/rtime: Fix off-by-one error in decompression check
Closes #5072


(cherry picked from commit abaea2b798)

Co-authored-by: Kinsey Moore <kinsey.moore@oarcorp.com>
2024-11-22 02:22:32 +00:00
18 changed files with 281 additions and 89 deletions

View File

@@ -315,12 +315,6 @@ rtems_aio_request *init_read_req( struct aiocb* aiocbp );
*/ */
void rtems_aio_completed_list_op( listcb *listcbp ); void rtems_aio_completed_list_op( listcb *listcbp );
/**
* @brief generates event at list completion to end wait in lio_listio().
*
*/
void lio_notify_end_wait( union sigval attr );
#ifdef RTEMS_DEBUG #ifdef RTEMS_DEBUG
#include <assert.h> #include <assert.h>

View File

@@ -435,6 +435,15 @@ extern "C" {
*/ */
typedef uint32_t rtems_event_set; typedef uint32_t rtems_event_set;
/* Generated from spec:/rtems/event/if/system-lio-list-completed */
/**
* @brief This event set constant represents the reserved system event
* internally used to notify list completion when lio_listio is called using
* LIO_WAIT.
*/
#define RTEMS_EVENT_SYSTEM_LIO_LIST_COMPLETED RTEMS_EVENT_28
/* Generated from spec:/rtems/event/if/system-network-close */ /* Generated from spec:/rtems/event/if/system-network-close */
/** /**
@@ -536,12 +545,6 @@ rtems_status_code rtems_event_system_send(
*/ */
#define RTEMS_EVENT_SYSTEM_SERVER RTEMS_EVENT_30 #define RTEMS_EVENT_SYSTEM_SERVER RTEMS_EVENT_30
/**
* @brief This event set constant represents the reserved system event for
* aio list completion, used when lio_listio is called using LIO_WAIT.
*/
#define RTEMS_EVENT_SYSTEM_AIO_LIST RTEMS_EVENT_28
/* Generated from spec:/rtems/event/if/system-server-resume */ /* Generated from spec:/rtems/event/if/system-server-resume */
/** /**

View File

@@ -335,7 +335,9 @@ static inline void _Priority_Set_action_node(
Priority_Node *node Priority_Node *node
) )
{ {
#if defined(RTEMS_SMP)
_Assert( aggregation->Action.next == NULL ); _Assert( aggregation->Action.next == NULL );
#endif
aggregation->Action.node = node; aggregation->Action.node = node;
} }
@@ -350,7 +352,9 @@ static inline void _Priority_Set_action_type(
Priority_Action_type type Priority_Action_type type
) )
{ {
#if defined(RTEMS_SMP)
_Assert( aggregation->Action.next == NULL ); _Assert( aggregation->Action.next == NULL );
#endif
aggregation->Action.type = type; aggregation->Action.type = type;
} }
@@ -368,7 +372,9 @@ static inline void _Priority_Set_action(
Priority_Action_type type Priority_Action_type type
) )
{ {
#if defined(RTEMS_SMP)
_Assert( aggregation->Action.next == NULL ); _Assert( aggregation->Action.next == NULL );
#endif
aggregation->Action.node = node; aggregation->Action.node = node;
aggregation->Action.type = type; aggregation->Action.type = type;
} }

View File

@@ -942,6 +942,12 @@ static inline Status_Control _Scheduler_Set(
#endif #endif
#if defined(RTEMS_SCORE_THREAD_HAS_SCHEDULER_CHANGE_INHIBITORS)
if ( the_thread->is_scheduler_change_inhibited ) {
return STATUS_RESOURCE_IN_USE;
}
#endif
if ( the_thread->Wait.queue != NULL ) { if ( the_thread->Wait.queue != NULL ) {
return STATUS_RESOURCE_IN_USE; return STATUS_RESOURCE_IN_USE;
} }

View File

@@ -96,9 +96,32 @@ extern "C" {
*/ */
#if defined(RTEMS_DEBUG) #if defined(RTEMS_DEBUG)
/**
* @brief This define enables the thread resource count support.
*/
#define RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT #define RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT
#endif #endif
#if defined(RTEMS_POSIX_API)
/**
* @brief This define enables support for an inactive real thread priority.
*
* For example, the POSIX sporadic server may temporarily remove the real
* priority of a thread while it is in low priority mode.
*/
#define RTEMS_SCORE_THREAD_REAL_PRIORITY_MAY_BE_INACTIVE
#endif
#if defined(RTEMS_POSIX_API) && defined(RTEMS_SMP)
/**
* @brief This define enables support to inhibit scheduler changes.
*
* For example, the POSIX sporadic server adds a second priority to a thread.
* We cannot account for this priority in a scheduler change.
*/
#define RTEMS_SCORE_THREAD_HAS_SCHEDULER_CHANGE_INHIBITORS
#endif
/** /**
* @brief Type of the numeric argument of a thread entry function with at * @brief Type of the numeric argument of a thread entry function with at
* least one numeric argument. * least one numeric argument.
@@ -898,6 +921,16 @@ struct _Thread_Control {
*/ */
bool was_created_with_inherited_scheduler; bool was_created_with_inherited_scheduler;
#if defined(RTEMS_SCORE_THREAD_HAS_SCHEDULER_CHANGE_INHIBITORS)
/**
* @brief This field is true, if scheduler changes are inhibited.
*
* Currently, the POSIX sporadic server is the only inhibitor. If more are
* added, then this needs to be changed to a counter or a bit field.
*/
bool is_scheduler_change_inhibited;
#endif
/** /**
* @brief This member contains the CPU budget control used to manage the CPU * @brief This member contains the CPU budget control used to manage the CPU
* budget of the thread. * budget of the thread.

View File

@@ -800,6 +800,14 @@ static inline void _Thread_Priority_change(
) )
{ {
_Priority_Node_set_priority( priority_node, new_priority ); _Priority_Node_set_priority( priority_node, new_priority );
#if defined(RTEMS_SCORE_THREAD_REAL_PRIORITY_MAY_BE_INACTIVE)
if ( !_Priority_Node_is_active( priority_node ) ) {
/* The priority change is picked up once the node is added */
return;
}
#endif
_Thread_Priority_changed( _Thread_Priority_changed(
the_thread, the_thread,
priority_node, priority_node,

View File

@@ -114,7 +114,7 @@ int rtems_jffs2_compressor_rtime_decompress(
positions[value]=outpos; positions[value]=outpos;
if (repeat) { if (repeat) {
#ifdef __rtems__ #ifdef __rtems__
if ((repeat + outpos) >= destlen) { if ((repeat + outpos) > destlen) {
return 1; return 1;
} }
#endif #endif

View File

@@ -271,7 +271,7 @@ void rtems_aio_completed_list_op( listcb *listcbp )
case AIO_LIO_EVENT: case AIO_LIO_EVENT:
rtems_event_system_send( rtems_event_system_send(
listcbp->lio_notification.task_id, listcbp->lio_notification.task_id,
RTEMS_EVENT_SYSTEM_AIO_LIST RTEMS_EVENT_SYSTEM_LIO_LIST_COMPLETED
); );
break; break;
} }
@@ -821,10 +821,3 @@ static void rtems_aio_handle_helper( rtems_aio_request *req )
} }
} }
void lio_notify_end_wait( union sigval attr ){
rtems_id id = attr.sival_int;
rtems_event_set event_in = RTEMS_EVENT_SYSTEM_AIO_LIST;
rtems_event_system_send( id, event_in );
}

View File

@@ -178,7 +178,7 @@ int lio_listio(
} else if ( mode == LIO_WAIT ) { } else if ( mode == LIO_WAIT ) {
rtems_event_set event_out; rtems_event_set event_out;
rtems_event_system_receive( rtems_event_system_receive(
RTEMS_EVENT_SYSTEM_AIO_LIST, RTEMS_EVENT_SYSTEM_LIO_LIST_COMPLETED,
RTEMS_DEFAULT_OPTIONS, RTEMS_DEFAULT_OPTIONS,
RTEMS_NO_TIMEOUT, RTEMS_NO_TIMEOUT,
&event_out &event_out

View File

@@ -301,6 +301,9 @@ int pthread_create(
the_attr->schedparam.sched_ss_max_repl; the_attr->schedparam.sched_ss_max_repl;
if ( schedpolicy == SCHED_SPORADIC ) { if ( schedpolicy == SCHED_SPORADIC ) {
#if defined(RTEMS_SCORE_THREAD_HAS_SCHEDULER_CHANGE_INHIBITORS)
the_thread->is_scheduler_change_inhibited = true;
#endif
_POSIX_Threads_Sporadic_timer( &api->Sporadic.Timer ); _POSIX_Threads_Sporadic_timer( &api->Sporadic.Timer );
} }
#endif #endif
@@ -348,7 +351,7 @@ void _POSIX_Threads_Sporadic_timer( Watchdog_Control *watchdog )
_Thread_queue_Context_clear_priority_updates( &queue_context ); _Thread_queue_Context_clear_priority_updates( &queue_context );
_Thread_Wait_acquire( the_thread, &queue_context ); _Thread_Wait_acquire( the_thread, &queue_context );
if ( _Priority_Node_is_active( &api->Sporadic.Low_priority ) ) { if ( !_Priority_Node_is_active( &the_thread->Real_priority ) ) {
_Thread_Priority_add( _Thread_Priority_add(
the_thread, the_thread,
&the_thread->Real_priority, &the_thread->Real_priority,
@@ -359,7 +362,6 @@ void _POSIX_Threads_Sporadic_timer( Watchdog_Control *watchdog )
&api->Sporadic.Low_priority, &api->Sporadic.Low_priority,
&queue_context &queue_context
); );
_Priority_Node_set_inactive( &api->Sporadic.Low_priority );
} }
_Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer ); _Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer );
@@ -388,7 +390,7 @@ static void _POSIX_Threads_Sporadic_budget_callout(
*/ */
the_thread->CPU_budget.available = UINT32_MAX; the_thread->CPU_budget.available = UINT32_MAX;
if ( !_Priority_Node_is_active( &api->Sporadic.Low_priority ) ) { if ( _Priority_Node_is_active( &the_thread->Real_priority ) ) {
_Thread_Priority_add( _Thread_Priority_add(
the_thread, the_thread,
&api->Sporadic.Low_priority, &api->Sporadic.Low_priority,
@@ -399,6 +401,7 @@ static void _POSIX_Threads_Sporadic_budget_callout(
&the_thread->Real_priority, &the_thread->Real_priority,
&queue_context &queue_context
); );
_Priority_Node_set_inactive( &the_thread->Real_priority );
} }
_Thread_Wait_release( the_thread, &queue_context ); _Thread_Wait_release( the_thread, &queue_context );

View File

@@ -78,6 +78,10 @@ static int _POSIX_Set_sched_param(
return EINVAL; return EINVAL;
} }
#if defined(RTEMS_SCORE_THREAD_HAS_SCHEDULER_CHANGE_INHIBITORS)
the_thread->is_scheduler_change_inhibited = ( policy == SCHED_SPORADIC );
#endif
#if defined(RTEMS_POSIX_API) #if defined(RTEMS_POSIX_API)
if ( policy == SCHED_SPORADIC ) { if ( policy == SCHED_SPORADIC ) {
low_prio = param->sched_ss_low_priority; low_prio = param->sched_ss_low_priority;
@@ -98,7 +102,7 @@ static int _POSIX_Set_sched_param(
_Priority_Node_set_priority( &the_thread->Real_priority, core_normal_prio ); _Priority_Node_set_priority( &the_thread->Real_priority, core_normal_prio );
#if defined(RTEMS_POSIX_API) #if defined(RTEMS_POSIX_API)
if ( _Priority_Node_is_active( &api->Sporadic.Low_priority ) ) { if ( !_Priority_Node_is_active( &the_thread->Real_priority ) ) {
_Thread_Priority_add( _Thread_Priority_add(
the_thread, the_thread,
&the_thread->Real_priority, &the_thread->Real_priority,
@@ -109,7 +113,6 @@ static int _POSIX_Set_sched_param(
&api->Sporadic.Low_priority, &api->Sporadic.Low_priority,
queue_context queue_context
); );
_Priority_Node_set_inactive( &api->Sporadic.Low_priority );
} else { } else {
#endif #endif
_Thread_Priority_changed( _Thread_Priority_changed(

View File

@@ -68,7 +68,7 @@ void _Thread_queue_Do_nothing_priority_actions(
Priority_Actions *priority_actions Priority_Actions *priority_actions
) )
{ {
#if defined(RTEMS_DEBUG) #if defined(RTEMS_DEBUG) && defined(RTEMS_SMP)
Priority_Aggregation *priority_aggregation; Priority_Aggregation *priority_aggregation;
priority_aggregation = _Priority_Actions_move( priority_actions ); priority_aggregation = _Priority_Actions_move( priority_actions );

View File

@@ -9,12 +9,12 @@ content: |
# #
RTEMS_API = ${__RTEMS_MAJOR__} RTEMS_API = ${__RTEMS_MAJOR__}
RTEMS_CPU = ${ARCH} RTEMS_CPU = ${ARCH}
RTEMS_BSP = ${BSP_NAME} RTEMS_BSP = ${BSP_NAME}
RTEMS_ROOT ?= ${PREFIX}
prefix = ${PREFIX} prefix = $$(RTEMS_ROOT)
exec_prefix = $${prefix}/${ARCH}-rtems${__RTEMS_MAJOR__} exec_prefix = $$(prefix)/$$(RTEMS_CPU)-rtems$$(RTEMS_API)
CC_FOR_TARGET = ${PROGRAM_PREFIX}gcc CC_FOR_TARGET = ${PROGRAM_PREFIX}gcc
CXX_FOR_TARGET = ${PROGRAM_PREFIX}g++ CXX_FOR_TARGET = ${PROGRAM_PREFIX}g++
@@ -43,7 +43,6 @@ content: |
export SIZE export SIZE
export OBJCOPY export OBJCOPY
RTEMS_ROOT ?= $$(prefix)
PROJECT_ROOT = $$(RTEMS_ROOT) PROJECT_ROOT = $$(RTEMS_ROOT)
RTEMS_CUSTOM = $$(RTEMS_ROOT)/make/custom/$$(RTEMS_BSP).cfg RTEMS_CUSTOM = $$(RTEMS_ROOT)/make/custom/$$(RTEMS_BSP).cfg
RTEMS_SHARE = $$(RTEMS_ROOT)/share/rtems$$(RTEMS_API) RTEMS_SHARE = $$(RTEMS_ROOT)/share/rtems$$(RTEMS_API)

View File

@@ -25,8 +25,8 @@ content: |
Version: ${RTEMS_VERSION} Version: ${RTEMS_VERSION}
Description: RTEMS BSP ${ARCH}/${BSP_NAME} Description: RTEMS BSP ${ARCH}/${BSP_NAME}
Cflags: $${ABI_FLAGS} -isystem$${includedir} Cflags: $${ABI_FLAGS} -isystem$${includedir}
Ldflags: -B$${libdir} ${PKGCONFIG_LDFLAGS} Ldflags: $${ABI_FLAGS} -B$${libdir} ${PKGCONFIG_LDFLAGS}
Libs: -B$${libdir} ${PKGCONFIG_LDFLAGS} Libs: $${ABI_FLAGS} -B$${libdir} ${PKGCONFIG_LDFLAGS}
copyrights: copyrights:
- Copyright (C) 2020 embedded brains GmbH & Co. KG - Copyright (C) 2020 embedded brains GmbH & Co. KG
enabled-by: true enabled-by: true

View File

@@ -39,17 +39,13 @@
const char rtems_test_name[] = "PSX 9"; const char rtems_test_name[] = "PSX 9";
static int CEILING_PRIORITY; static int get_current_prio( void )
static int HIGH_PRIORITY;
static int LOW_PRIORITY;
static int get_current_prio( pthread_t thread )
{ {
rtems_status_code sc; rtems_status_code sc;
rtems_task_priority prio; rtems_task_priority prio;
int max; int max;
sc = rtems_task_set_priority( thread, RTEMS_CURRENT_PRIORITY, &prio ); sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
rtems_test_assert( sc == RTEMS_SUCCESSFUL ); rtems_test_assert( sc == RTEMS_SUCCESSFUL );
max = sched_get_priority_max( SCHED_FIFO ); max = sched_get_priority_max( SCHED_FIFO );
@@ -113,13 +109,35 @@ void *POSIX_Init(
char buffer[ 80 ]; char buffer[ 80 ];
pthread_mutexattr_t attr; pthread_mutexattr_t attr;
time_t start; time_t start;
time_t now; int ceiling_priority;
int high_priority;
int low_priority;
rtems_id scheduler_id;
rtems_task_priority rtems_priority;
rtems_status_code sc;
if (argument != NULL ) {
/* We end up here due to the rtems_task_restart() below */
ceiling_priority = sched_get_priority_max( SCHED_SPORADIC );
low_priority = ceiling_priority - 2;
rtems_test_assert( get_current_prio() == low_priority );
while ( get_current_prio() == low_priority ) {
/* Be busy until sched_ss_repl_period elapses */
}
rtems_test_assert( get_current_prio() == 2 );
TEST_END();
rtems_test_exit( 0 );
}
TEST_BEGIN(); TEST_BEGIN();
CEILING_PRIORITY = sched_get_priority_max( SCHED_SPORADIC ); ceiling_priority = sched_get_priority_max( SCHED_SPORADIC );
HIGH_PRIORITY = sched_get_priority_max( SCHED_SPORADIC ) - 1; high_priority = ceiling_priority - 1;
LOW_PRIORITY = sched_get_priority_max( SCHED_SPORADIC ) - 2; low_priority = ceiling_priority - 2;
test_destroy_locked_mutex(); test_destroy_locked_mutex();
@@ -142,19 +160,19 @@ void *POSIX_Init(
sprintf( buffer, " - current priority = %d", priority ); sprintf( buffer, " - current priority = %d", priority );
print_current_time( "Init: ", buffer ); print_current_time( "Init: ", buffer );
schedparam.sched_ss_repl_period.tv_sec = 0; schedparam.sched_ss_repl_period.tv_sec = 2;
schedparam.sched_ss_repl_period.tv_nsec = 500000000; /* 1/2 second */ schedparam.sched_ss_repl_period.tv_nsec = 0;
schedparam.sched_ss_init_budget.tv_sec = 0; schedparam.sched_ss_init_budget.tv_sec = 1;
schedparam.sched_ss_init_budget.tv_nsec = 250000000; /* 1/4 second */ schedparam.sched_ss_init_budget.tv_nsec = 0;
schedparam.sched_priority = HIGH_PRIORITY; schedparam.sched_priority = high_priority;
schedparam.sched_ss_low_priority = LOW_PRIORITY; schedparam.sched_ss_low_priority = low_priority;
puts( "Init: pthread_setschedparam - SUCCESSFUL (sporadic server)" ); puts( "Init: pthread_setschedparam - SUCCESSFUL (sporadic server)" );
status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam ); status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
rtems_test_assert( !status ); rtems_test_assert( !status );
sprintf( buffer, " - new priority = %d", get_current_prio( pthread_self() ) ); sprintf( buffer, " - new priority = %d", get_current_prio() );
print_current_time( "Init: ", buffer ); print_current_time( "Init: ", buffer );
/* go into a loop consuming CPU time to watch our priority change */ /* go into a loop consuming CPU time to watch our priority change */
@@ -162,7 +180,7 @@ void *POSIX_Init(
for ( passes=0 ; passes <= 3 ; ) { for ( passes=0 ; passes <= 3 ; ) {
int current_priority; int current_priority;
current_priority = get_current_prio( pthread_self() ); current_priority = get_current_prio();
if ( priority != current_priority ) { if ( priority != current_priority ) {
priority = current_priority; priority = current_priority;
@@ -184,8 +202,8 @@ void *POSIX_Init(
schedparam.sched_ss_init_budget.tv_sec = 0; schedparam.sched_ss_init_budget.tv_sec = 0;
schedparam.sched_ss_init_budget.tv_nsec = 250000000; /* 1/4 second */ schedparam.sched_ss_init_budget.tv_nsec = 250000000; /* 1/4 second */
schedparam.sched_priority = HIGH_PRIORITY; schedparam.sched_priority = high_priority;
schedparam.sched_ss_low_priority = LOW_PRIORITY; schedparam.sched_ss_low_priority = low_priority;
puts( "Init: pthread_setschedparam - SUCCESSFUL (sporadic server)" ); puts( "Init: pthread_setschedparam - SUCCESSFUL (sporadic server)" );
status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam ); status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
@@ -198,7 +216,7 @@ void *POSIX_Init(
status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_PROTECT ); status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_PROTECT );
rtems_test_assert( !status ); rtems_test_assert( !status );
status = pthread_mutexattr_setprioceiling( &attr, CEILING_PRIORITY ); status = pthread_mutexattr_setprioceiling( &attr, ceiling_priority );
rtems_test_assert( !status ); rtems_test_assert( !status );
puts( "Init: Creating a mutex" ); puts( "Init: Creating a mutex" );
@@ -207,51 +225,155 @@ void *POSIX_Init(
printf( "status = %d\n", status ); printf( "status = %d\n", status );
rtems_test_assert( !status ); rtems_test_assert( !status );
sprintf( buffer, " - new priority = %d", get_current_prio( pthread_self() ) ); sprintf( buffer, " - new priority = %d", get_current_prio() );
print_current_time( "Init: ", buffer ); print_current_time( "Init: ", buffer );
/* go into a loop consuming CPU time to watch our priority NOT lower */
start = time( &start ); start = time( &start );
puts( "Init: pthread_mutex_lock acquire the lock" ); puts( "Init: Go into low priority and lock/unlock ceiling mutex" );
while ( get_current_prio() == low_priority ) {
/* Be busy until sched_ss_repl_period elapses */
}
rtems_test_assert( get_current_prio() == high_priority );
status = pthread_mutex_lock( &Mutex_id ); status = pthread_mutex_lock( &Mutex_id );
if ( status ) if ( status )
printf( "status = %d %s\n", status, strerror(status) ); printf( "status = %d %s\n", status, strerror(status) );
rtems_test_assert( !status ); rtems_test_assert( !status );
rtems_test_assert( get_current_prio() == ceiling_priority );
do { status = pthread_mutex_unlock( &Mutex_id );
priority = get_current_prio( pthread_self() ); if ( status )
printf( "status = %d %s\n", status, strerror(status) );
rtems_test_assert( !status );
rtems_test_assert( get_current_prio() == high_priority );
if ( priority != CEILING_PRIORITY ) { puts( "Init: Go into high priority and lock/unlock ceiling mutex" );
puts( "ERROR - Init's priority lowered while holding mutex" );
rtems_test_exit(0);
}
now = time( &now ); while ( get_current_prio() == high_priority ) {
} while ( now - start < 3 ); /* Be busy until sched_ss_init_budget elapses */
}
/* with this unlock we should be able to go to low priority */ rtems_test_assert( get_current_prio() == low_priority );
status = pthread_mutex_lock( &Mutex_id );
if ( status )
printf( "status = %d %s\n", status, strerror(status) );
rtems_test_assert( !status );
rtems_test_assert( get_current_prio() == ceiling_priority );
puts( "Init: unlock mutex" );
status = pthread_mutex_unlock( &Mutex_id ); status = pthread_mutex_unlock( &Mutex_id );
if ( status ) if ( status )
printf( "status = %d\n", status ); printf( "status = %d\n", status );
rtems_test_assert( !status ); rtems_test_assert( !status );
rtems_test_assert( get_current_prio() == low_priority );
sprintf( buffer, " - new priority = %d", get_current_prio( pthread_self() ) ); status = pthread_mutex_destroy( &Mutex_id );
print_current_time( "Init: ", buffer ); rtems_test_assert( status == 0 );
for ( ; ; ) { puts( "Init: Go into low priority and change scheduler parameters" );
if ( get_current_prio( pthread_self() ) == LOW_PRIORITY )
break; while ( get_current_prio() == high_priority ) {
/* Be busy until sched_ss_init_budget elapses */
} }
sprintf( buffer, " - new priority = %d", get_current_prio( pthread_self() ) ); rtems_test_assert( get_current_prio() == low_priority );
print_current_time( "Init: ", buffer ); schedparam.sched_priority = ceiling_priority;
status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
rtems_test_assert( status == 0 );
rtems_test_assert( get_current_prio() == ceiling_priority );
TEST_END(); puts( "Init: Go into low priority and set POSIX priority" );
rtems_test_exit( 0 );
schedparam.sched_priority = high_priority;
status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
rtems_test_assert( status == 0 );
rtems_test_assert( get_current_prio() == high_priority );
while ( get_current_prio() == high_priority ) {
/* Be busy until sched_ss_init_budget elapses */
}
rtems_test_assert( get_current_prio() == low_priority );
status = pthread_setschedprio( pthread_self(), ceiling_priority );
rtems_test_assert( status == 0 );
rtems_test_assert( get_current_prio() == low_priority );
while ( get_current_prio() == low_priority ) {
/* Be busy until sched_ss_repl_period elapses */
}
rtems_test_assert( get_current_prio() == ceiling_priority );
puts( "Init: Go into low priority and set RTEMS priority" );
sc = rtems_task_get_scheduler( RTEMS_SELF, &scheduler_id );
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
sc = rtems_scheduler_map_priority_from_posix(
scheduler_id,
ceiling_priority,
&rtems_priority
);
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
schedparam.sched_priority = high_priority;
status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
rtems_test_assert( status == 0 );
rtems_test_assert( get_current_prio() == high_priority );
while ( get_current_prio() == high_priority ) {
/* Be busy until sched_ss_init_budget elapses */
}
rtems_test_assert( get_current_prio() == low_priority );
sc = rtems_task_set_priority( RTEMS_SELF, rtems_priority, &rtems_priority );
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
rtems_test_assert( get_current_prio() == low_priority );
while ( get_current_prio() == low_priority ) {
/* Be busy until sched_ss_repl_period elapses */
}
rtems_test_assert( get_current_prio() == ceiling_priority );
puts( "Init: Go into low priority and set scheduler" );
sc = rtems_scheduler_ident_by_processor( 1, &scheduler_id );
rtems_test_assert( sc == RTEMS_SUCCESSFUL );
schedparam.sched_priority = high_priority;
status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
rtems_test_assert( status == 0 );
rtems_test_assert( get_current_prio() == high_priority );
while ( get_current_prio() == high_priority ) {
/* Be busy until sched_ss_init_budget elapses */
}
rtems_test_assert( get_current_prio() == low_priority );
sc = rtems_task_set_scheduler( RTEMS_SELF, scheduler_id, 1 );
rtems_test_assert( sc == RTEMS_RESOURCE_IN_USE );
rtems_test_assert( get_current_prio() == low_priority );
while ( get_current_prio() == low_priority ) {
/* Be busy until sched_ss_repl_period elapses */
}
rtems_test_assert( get_current_prio() == high_priority );
puts( "Init: Go into low priority and restart task" );
schedparam.sched_priority = high_priority;
status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
rtems_test_assert( status == 0 );
rtems_test_assert( get_current_prio() == high_priority );
while ( get_current_prio() == high_priority ) {
/* Be busy until sched_ss_init_budget elapses */
}
rtems_test_assert( get_current_prio() == low_priority );
(void) rtems_task_restart( RTEMS_SELF, 1 );
return NULL; /* just so the compiler thinks we returned something */ return NULL; /* just so the compiler thinks we returned something */
} }

View File

@@ -58,6 +58,28 @@ void *Task_2(
#define CONFIGURE_POSIX_INIT_THREAD_TABLE #define CONFIGURE_POSIX_INIT_THREAD_TABLE
#ifdef RTEMS_SMP
#define CONFIGURE_MAXIMUM_PROCESSORS 2
#define CONFIGURE_SCHEDULER_EDF_SMP
#include <rtems/scheduler.h>
RTEMS_SCHEDULER_EDF_SMP( a );
RTEMS_SCHEDULER_EDF_SMP( b );
#define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
RTEMS_SCHEDULER_TABLE_EDF_SMP( a, rtems_build_name( 'M', 'A', 'I', 'N' ) ), \
RTEMS_SCHEDULER_TABLE_EDF_SMP( b, rtems_build_name( 'O', 'T', 'H', 'R' ) )
#define CONFIGURE_SCHEDULER_ASSIGNMENTS \
RTEMS_SCHEDULER_ASSIGN( 0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY ), \
RTEMS_SCHEDULER_ASSIGN( 1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL )
#endif /* RTEMS_SMP */
#include <rtems/confdefs.h> #include <rtems/confdefs.h>
/* global variables */ /* global variables */

16
waf vendored

File diff suppressed because one or more lines are too long

View File

@@ -1436,10 +1436,10 @@ def load_version(ctx):
def configure_version(conf): def configure_version(conf):
version_label = load_version(conf) version_label = load_version(conf)
v_str = version["__RTEMS_MAJOR__"] + "." + version["__RTEMS_MINOR__"] v_str = version["__RTEMS_MAJOR__"] + "." + version["__RTEMS_MINOR__"]
if int(version["__RTEMS_REVISION__"]) != 0 and version_label != "": if int(version["__RTEMS_REVISION__"]) != 0:
v_str += "." + version["__RTEMS_REVISION__"] v_str += "." + version["__RTEMS_REVISION__"]
if version_label != "": if version_label is not None and version_label != "":
v_str += "." + version_label v_str += "." + version_label
conf.msg("Configure RTEMS version", v_str, color="YELLOW") conf.msg("Configure RTEMS version", v_str, color="YELLOW")