2010-11-24 Gedare Bloom <giddyup44@yahoo.com>

PR 1647/cpukit
	* posix/src/nanosleep.c, posix/src/sched_yield.c,
	rtems/src/taskwakeafter.c, sapi/include/confdefs.h,
	sapi/include/rtems/config.h, sapi/src/exinit.c, score/Makefile.am,
	score/preinstall.am, score/include/rtems/score/prioritybitmap.h,
	score/include/rtems/score/thread.h,
	score/inline/rtems/score/thread.inl, score/src/thread.c,
	score/src/threadchangepriority.c, score/src/threadclearstate.c,
	score/src/threadclose.c, score/src/threadinitialize.c,
	score/src/threadready.c, score/src/threadresume.c,
	score/src/threadsetpriority.c, score/src/threadsetstate.c,
	score/src/threadsettransient.c,	score/src/threadsuspend.c,
	score/src/threadtickletimeslice.c: Refactor scheduler out of thread
	handler to facilitate alternate scheduler implementations.
	* score/src/threadyieldprocessor.c: Removed.
	* score/src/schedulerprioritythreadschedulerupdate.c,
	score/src/schedulerprioritythreadschedulerfree.c,
	score/src/schedulerpriorityblock.c, score/src/scheduler.c,
	score/src/schedulerprioritythreadschedulerallocate.c,
	score/src/schedulerpriorityunblock.c,
	score/src/schedulerpriority.c, score/src/schedulerpriorityyield.c,
	score/include/rtems/score/schedulerpriority.h,
	score/include/rtems/score/scheduler.h,
	score/inline/rtems/score/scheduler.inl,
	score/inline/rtems/score/schedulerpriority.inl: New files.
This commit is contained in:
Joel Sherrill
2010-11-24 15:51:28 +00:00
parent 505866a0d8
commit 0faa9dad07
37 changed files with 1434 additions and 164 deletions
+114 -9
View File
@@ -534,6 +534,116 @@ rtems_fs_init_functions_t rtems_fs_init_helper =
#define CONFIGURE_MAXIMUM_PRIORITY PRIORITY_DEFAULT_MAXIMUM
#endif
/*
* Scheduler configuration.
*
* The scheduler configuration allows an application to select the
* scheduling policy to use. The supported configurations are:
* CONFIGURE_SCHEDULER_USER
* CONFIGURE_SCHEDULER_PRIORITY
*
* If no configuration is specified by the application, then
* CONFIGURE_SCHEDULER_PRIORITY is assumed to be the default.
*
* An application can define its own scheduling policy by defining
* CONFIGURE_SCHEDULER_USER and CONFIGURE_SCHEDULER_ENTRY_USER to point
* to an initialization routine. Note: CONFIGURE_SCHEDULER_USER is not
* fully supported, since it has no per-thread field.
*
* To add a new scheduler:
*/
#include <rtems/score/scheduler.h>
#if defined(CONFIGURE_SCHEDULER_USER) && \
!defined(CONFIGURE_SCHEDULER_ENTRY_USER)
#error "CONFIGURE_ERROR: CONFIGURE_SCHEDULER_USER without CONFIGURE_SCHEDULER_ENTRY_USER"
#endif
/* enable all RTEMS-provided schedulers */
#if defined(CONFIGURE_SCHEDULER_ALL)
#define CONFIGURE_SCHEDULER_PRIORITY
#endif
/* If no scheduler is specified, the priority scheduler is default. */
#if !defined(CONFIGURE_SCHEDULER_USER) && \
!defined(CONFIGURE_SCHEDULER_PRIORITY)
#define CONFIGURE_SCHEDULER_PRIORITY
#define CONFIGURE_SCHEDULER_POLICY _Scheduler_PRIORITY
#endif
/*
* If a user scheduler is specified and no policy is set,
* the user scheduler is the default policy.
*/
#if defined(CONFIGURE_SCHEDULER_USER) && \
!defined(CONFIGURE_SCHEDULER_POLICY)
#define CONFIGURE_SCHEDULER_POLICY _Scheduler_USER
#endif
/*
* Check for priority scheduler next, as it is the default policy if there
* is no CONFIGURE_SCHEDULER_POLICY set and no USER scheduler provided.
*/
#if defined(CONFIGURE_SCHEDULER_PRIORITY)
#include <rtems/score/schedulerpriority.h>
#define CONFIGURE_SCHEDULER_ENTRY_PRIORITY { _Scheduler_priority_Initialize }
#if !defined(CONFIGURE_SCHEDULER_POLICY)
#define CONFIGURE_SCHEDULER_POLICY _Scheduler_PRIORITY
#endif
/**
* define the memory used by the priority scheduler
*/
#define CONFIGURE_MEMORY_SCHEDULER_PRIORITY ( \
_Configure_From_workspace( \
((CONFIGURE_MAXIMUM_PRIORITY+1) * sizeof(Chain_Control)) ) \
)
#define CONFIGURE_MEMORY_PER_TASK_SCHEDULER_PRIORITY ( \
_Configure_From_workspace(sizeof(Scheduler_priority_Per_thread)) )
#endif
/*
* Set up the scheduler table. The scheduling code indexes this table to
* invoke the correct scheduling implementation. The scheduler to use is
* determined by the Configuration.scheduler_policy field, which is set
* by CONFIGURE_SCHEDULER_POLICY. If a particular scheduler is not enabled,
* an empty entry is included in its entry in the scheduler table.
*/
/**
* An empty scheduler entry
*/
#define CONFIGURE_SCHEDULER_NULL { NULL }
#ifdef CONFIGURE_INIT
/* the table of available schedulers. */
const Scheduler_Table_t _Scheduler_Table[] = {
#if defined(CONFIGURE_SCHEDULER_USER) && \
defined(CONFIGURE_SCHEDULER_ENTRY_USER)
CONFIGURE_SCHEDULER_ENTRY_USER,
#else
CONFIGURE_SCHEDULER_NULL,
#endif
#if defined(CONFIGURE_SCHEDULER_PRIORITY) && \
defined(CONFIGURE_SCHEDULER_ENTRY_PRIORITY)
CONFIGURE_SCHEDULER_ENTRY_PRIORITY,
#else
CONFIGURE_SCHEDULER_NULL,
#endif
};
#endif
/**
* Define the memory overhead for the scheduler
*/
#define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
CONFIGURE_MEMORY_SCHEDULER_PRIORITY \
)
#define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
CONFIGURE_MEMORY_PER_TASK_SCHEDULER_PRIORITY \
)
/*
* If you said the IDLE task was going to do application initialization
* and didn't override the IDLE body, then something is amiss.
@@ -1607,7 +1717,8 @@ rtems_fs_init_functions_t rtems_fs_init_helper =
(_Configure_From_workspace(CONFIGURE_MINIMUM_TASK_STACK_SIZE) + \
CONFIGURE_MEMORY_PER_TASK_FOR_CLASSIC_API + \
CONFIGURE_MEMORY_PER_TASK_FOR_NEWLIB + \
CONFIGURE_MEMORY_PER_TASK_FOR_POSIX_API)) + \
CONFIGURE_MEMORY_PER_TASK_FOR_POSIX_API + \
CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER)) + \
_Configure_From_workspace( \
_Configure_Max_Objects(_number_FP_tasks) * CONTEXT_FP_SIZE) + \
_Configure_From_workspace( \
@@ -1704,13 +1815,6 @@ rtems_fs_init_functions_t rtems_fs_init_helper =
#define CONFIGURE_API_MUTEX_MEMORY \
_Configure_Object_RAM(1, sizeof(API_Mutex_Control))
/**
* This defines the memory used by the thread ready chains. There is
* one chain per priority.
*/
#define CONFIGURE_MEMORY_FOR_THREAD_READY_CHAINS \
_Configure_From_workspace( \
((CONFIGURE_MAXIMUM_PRIORITY+1) * sizeof(Chain_Control)) )
/**
* This defines the amount of memory reserved for the IDLE task
* control structures and stack.
@@ -1724,7 +1828,7 @@ rtems_fs_init_functions_t rtems_fs_init_helper =
*/
#define CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD \
( CONFIGURE_MEMORY_FOR_IDLE_TASK + /* IDLE and stack */ \
CONFIGURE_MEMORY_FOR_THREAD_READY_CHAINS + /* Ready chains */ \
CONFIGURE_MEMORY_FOR_SCHEDULER + /* Scheduler */ \
CONFIGURE_INTERRUPT_VECTOR_TABLE + /* interrupt vectors */ \
CONFIGURE_INTERRUPT_STACK_MEMORY + /* interrupt stack */ \
CONFIGURE_API_MUTEX_MEMORY /* allocation mutex */ \
@@ -2005,6 +2109,7 @@ rtems_fs_init_functions_t rtems_fs_init_helper =
CONFIGURE_MAXIMUM_USER_EXTENSIONS, /* maximum dynamic extensions */
CONFIGURE_MICROSECONDS_PER_TICK, /* microseconds per clock tick */
CONFIGURE_TICKS_PER_TIMESLICE, /* ticks per timeslice quantum */
CONFIGURE_SCHEDULER_POLICY, /* scheduling policy */
CONFIGURE_IDLE_TASK_BODY, /* user's IDLE task */
CONFIGURE_IDLE_TASK_STACK_SIZE, /* IDLE task stack size */
CONFIGURE_INTERRUPT_STACK_SIZE, /* interrupt stack size */
+4
View File
@@ -118,6 +118,10 @@ typedef struct {
*/
uint32_t ticks_per_timeslice;
/** This field specifies the scheduling policy to use.
*/
uint32_t scheduler_policy;
/** This element points to the BSP's optional idle task which may override
* the default one provided with RTEMS.
*/