mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 01:37:56 +08:00
@@ -109,6 +109,7 @@ librtems_a_SOURCES += src/scheduleraddprocessor.c
|
||||
librtems_a_SOURCES += src/schedulergetprocessorset.c
|
||||
librtems_a_SOURCES += src/schedulerident.c
|
||||
librtems_a_SOURCES += src/scheduleridentbyprocessor.c
|
||||
librtems_a_SOURCES += src/scheduleridentbyprocessorset.c
|
||||
librtems_a_SOURCES += src/schedulerremoveprocessor.c
|
||||
|
||||
## RATEMON_C_FILES
|
||||
|
||||
@@ -576,6 +576,31 @@ rtems_status_code rtems_scheduler_ident_by_processor(
|
||||
rtems_id *id
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Identifies a scheduler by a processor set.
|
||||
*
|
||||
* The scheduler is selected according to the highest numbered online processor
|
||||
* in the specified processor set.
|
||||
*
|
||||
* @param[in] cpusetsize Size of the specified processor set buffer in
|
||||
* bytes. This value must be positive.
|
||||
* @param[out] cpuset The processor set to identify the scheduler.
|
||||
* @param[out] id The scheduler identifier associated with the processor set.
|
||||
*
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
* @retval RTEMS_INVALID_ADDRESS The @a id parameter is @c NULL.
|
||||
* @retval RTEMS_INVALID_SIZE Invalid processor set size.
|
||||
* @retval RTEMS_INVALID_NAME The processor set contains no online processor.
|
||||
* @retval RTEMS_INCORRECT_STATE The processor set is valid, however, the
|
||||
* highest numbered online processor in the specified processor set is not
|
||||
* owned by a scheduler.
|
||||
*/
|
||||
rtems_status_code rtems_scheduler_ident_by_processor_set(
|
||||
size_t cpusetsize,
|
||||
const cpu_set_t *cpuset,
|
||||
rtems_id *id
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Gets the set of processors owned by the specified scheduler instance.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (c) 2017 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Dornierstr. 4
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/rtems/tasks.h>
|
||||
#include <rtems/score/assert.h>
|
||||
#include <rtems/score/schedulerimpl.h>
|
||||
|
||||
rtems_status_code rtems_scheduler_ident_by_processor_set(
|
||||
size_t cpusetsize,
|
||||
const cpu_set_t *cpuset,
|
||||
rtems_id *id
|
||||
)
|
||||
{
|
||||
Processor_mask set;
|
||||
Processor_mask_Copy_status status;
|
||||
uint32_t cpu_index;
|
||||
const Scheduler_Control *scheduler;
|
||||
|
||||
if ( id == NULL ) {
|
||||
return RTEMS_INVALID_ADDRESS;
|
||||
}
|
||||
|
||||
status = _Processor_mask_From_cpu_set_t( &set, cpusetsize, cpuset );
|
||||
if ( status == PROCESSOR_MASK_COPY_INVALID_SIZE ) {
|
||||
return RTEMS_INVALID_SIZE;
|
||||
}
|
||||
|
||||
_Processor_mask_And( &set, &set, _SMP_Get_online_processors() );
|
||||
cpu_index = _Processor_mask_Find_last_set( &set );
|
||||
if ( cpu_index == 0 ) {
|
||||
return RTEMS_INVALID_NAME;
|
||||
}
|
||||
|
||||
scheduler = _Scheduler_Get_by_CPU( _Per_CPU_Get_by_index( cpu_index - 1) );
|
||||
#if defined(RTEMS_SMP)
|
||||
if ( scheduler == NULL ) {
|
||||
return RTEMS_INCORRECT_STATE;
|
||||
}
|
||||
#else
|
||||
_Assert( scheduler != NULL );
|
||||
#endif
|
||||
|
||||
*id = _Scheduler_Build_id( _Scheduler_Get_index( scheduler ) );
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
@@ -134,8 +134,10 @@ static void test_scheduler_add_remove_processors(void)
|
||||
rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
|
||||
|
||||
if (rtems_get_processor_count() > 1) {
|
||||
rtems_id scheduler_id;
|
||||
rtems_id scheduler_b_id;
|
||||
rtems_id task_id;
|
||||
cpu_set_t first_cpu;
|
||||
|
||||
sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id);
|
||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||
@@ -153,6 +155,15 @@ static void test_scheduler_add_remove_processors(void)
|
||||
|
||||
rtems_test_assert(rtems_get_current_processor() == 1);
|
||||
|
||||
CPU_ZERO(&first_cpu);
|
||||
CPU_SET(0, &first_cpu);
|
||||
sc = rtems_scheduler_ident_by_processor_set(
|
||||
sizeof(first_cpu),
|
||||
&first_cpu,
|
||||
&scheduler_id
|
||||
);
|
||||
rtems_test_assert(sc == RTEMS_INCORRECT_STATE);
|
||||
|
||||
sc = rtems_scheduler_add_processor(scheduler_a_id, 0);
|
||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||
|
||||
|
||||
@@ -343,6 +343,7 @@ static void test_scheduler_ident(void)
|
||||
rtems_id scheduler_id;
|
||||
rtems_name name = BLUE;
|
||||
rtems_name invalid_name = RED;
|
||||
cpu_set_t s;
|
||||
|
||||
sc = rtems_scheduler_ident(name, NULL);
|
||||
rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
|
||||
@@ -367,6 +368,24 @@ static void test_scheduler_ident(void)
|
||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||
|
||||
rtems_test_assert(scheduler_id == expected_id);
|
||||
|
||||
CPU_ZERO(&s);
|
||||
CPU_SET(1, &s);
|
||||
sc = rtems_scheduler_ident_by_processor_set(sizeof(s), &s, NULL);
|
||||
rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
|
||||
|
||||
sc = rtems_scheduler_ident_by_processor_set(1, &s, &scheduler_id);
|
||||
rtems_test_assert(sc == RTEMS_INVALID_SIZE);
|
||||
|
||||
sc = rtems_scheduler_ident_by_processor_set(sizeof(s), &s, &scheduler_id);
|
||||
rtems_test_assert(sc == RTEMS_INVALID_NAME);
|
||||
|
||||
CPU_SET(0, &s);
|
||||
scheduler_id = 0;
|
||||
sc = rtems_scheduler_ident_by_processor_set(sizeof(s), &s, &scheduler_id);
|
||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||
|
||||
rtems_test_assert(scheduler_id == expected_id);
|
||||
}
|
||||
|
||||
static void test_scheduler_get_processors(void)
|
||||
|
||||
Reference in New Issue
Block a user