summaryrefslogtreecommitdiffstats
path: root/c_user/constant_bandwidth_server.rst
diff options
context:
space:
mode:
Diffstat (limited to 'c_user/constant_bandwidth_server.rst')
-rw-r--r--c_user/constant_bandwidth_server.rst686
1 files changed, 0 insertions, 686 deletions
diff --git a/c_user/constant_bandwidth_server.rst b/c_user/constant_bandwidth_server.rst
deleted file mode 100644
index 135dfdb..0000000
--- a/c_user/constant_bandwidth_server.rst
+++ /dev/null
@@ -1,686 +0,0 @@
-.. comment SPDX-License-Identifier: CC-BY-SA-4.0
-
-.. COMMENT: COPYRIGHT (c) 1989-2011.
-.. COMMENT: On-Line Applications Research Corporation (OAR).
-.. COMMENT: All rights reserved.
-
-Constant Bandwidth Server Scheduler API
-#######################################
-
-.. index:: cbs
-
-Introduction
-============
-
-Unlike simple schedulers, the Constant Bandwidth Server (CBS) requires a
-special API for tasks to indicate their scheduling parameters. The directives
-provided by the CBS API are:
-
-- rtems_cbs_initialize_ - Initialize the CBS library
-
-- rtems_cbs_cleanup_ - Cleanup the CBS library
-
-- rtems_cbs_create_server_ - Create a new bandwidth server
-
-- rtems_cbs_attach_thread_ - Attach a thread to server
-
-- rtems_cbs_detach_thread_ - Detach a thread from server
-
-- rtems_cbs_destroy_server_ - Destroy a bandwidth server
-
-- rtems_cbs_get_server_id_ - Get an ID of a server
-
-- rtems_cbs_get_parameters_ - Get scheduling parameters of a server
-
-- rtems_cbs_set_parameters_ - Set scheduling parameters of a server
-
-- rtems_cbs_get_execution_time_ - Get elapsed execution time
-
-- rtems_cbs_get_remaining_budget_ - Get remainig execution time
-
-- rtems_cbs_get_approved_budget_ - Get scheduler approved execution time
-
-Background
-==========
-
-Constant Bandwidth Server Definitions
--------------------------------------
-.. index:: CBS parameters
-
-.. index:: rtems_cbs_parameters
-
-The Constant Bandwidth Server API enables tasks to communicate with the
-scheduler and indicate its scheduling parameters. The scheduler has to be set
-up first (by defining ``CONFIGURE_SCHEDULER_CBS`` macro).
-
-The difference to a plain EDF is the presence of servers. It is a budget aware
-extention of the EDF scheduler, therefore, tasks attached to servers behave in
-a similar way as with EDF unless they exceed their budget.
-
-The intention of servers is reservation of a certain computation time (budget)
-of the processor for all subsequent periods. The structure
-``rtems_cbs_parameters`` determines the behavior of a server. It contains
-``deadline`` which is equal to period, and ``budget`` which is the time the
-server is allowed to spend on CPU per each period. The ratio between those two
-parameters yields the maximum percentage of the CPU the server can use
-(bandwidth). Moreover, thanks to this limitation the overall utilization of CPU
-is under control, and the sum of bandwidths of all servers in the system yields
-the overall reserved portion of processor. The rest is still available for
-ordinary tasks that are not attached to any server.
-
-In order to make the server effective to the executing tasks, tasks have to be
-attached to the servers. The ``rtems_cbs_server_id`` is a type denoting an id
-of a server and ``rtems_id`` a type for id of tasks.
-
-Handling Periodic Tasks
------------------------
-.. index:: CBS periodic tasks
-
-Each task's execution begins with a default background priority (see the
-chapter Scheduling Concepts to understand the concept of priorities in
-EDF). Once you decide the tasks should start periodic execution, you have two
-possibilities. Either you use only the Rate Monotonic manager which takes care
-of periodic behavior, or you declare deadline and budget using the CBS API in
-which case these properties are constant for all subsequent periods, unless you
-change them using the CBS API again. Task now only has to indicate and end of
-each period using ``rtems_rate_monotonic_period``.
-
-Registering a Callback Function
--------------------------------
-.. index:: CBS overrun handler
-
-In case tasks attached to servers are not aware of their execution time and
-happen to exceed it, the scheduler does not guarantee execution any more and
-pulls the priority of the task to background, which would possibly lead to
-immediate preemption (if there is at least one ready task with a higher
-pirority). However, the task is not blocked but a callback function is
-invoked. The callback function (``rtems_cbs_budget_overrun``) might be
-optionally registered upon a server creation (``rtems_cbs_create_server``).
-
-This enables the user to define what should happen in case of budget
-overrun. There is obviously no space for huge operations because the priority
-is down and not real time any more, however, you still can at least in release
-resources for other tasks, restart the task or log an error information. Since
-the routine is called directly from kernel, use ``printk()`` instead of
-``printf()``.
-
-The calling convention of the callback function is:
-
-.. index:: rtems_asr
-
-.. code-block:: c
-
- void overrun_handler(
- rtems_cbs_server_id server_id
- );
-
-Limitations
------------
-.. index:: CBS limitations
-
-When using this scheduler you have to keep in mind several things:
-
-- it_limitations
-
-- In the current implementation it is possible to attach only a single task to
- each server.
-
-- If you have a task attached to a server and you voluntatily block it in the
- beginning of its execution, its priority will be probably pulled to
- background upon unblock, thus not guaranteed deadline any more. This is
- because you are effectively raising computation time of the task. When
- unbocking, you should be always sure that the ratio between remaining
- computation time and remaining deadline is not higher that the utilization
- you have agreed with the scheduler.
-
-Operations
-==========
-
-Setting up a server
--------------------
-
-The directive ``rtems_cbs_create_server`` is used to create a new server that
-is characterized by ``rtems_cbs_parameters``. You also might want to register
-the ``rtems_cbs_budget_overrun`` callback routine. After this step tasks can be
-attached to the server. The directive ``rtems_cbs_set_parameters`` can change
-the scheduling parameters to avoid destroying and creating a new server again.
-
-Attaching Task to a Server
---------------------------
-
-If a task is attached to a server using ``rtems_cbs_attach_thread``, the task's
-computation time per period is limited by the server and the deadline (period)
-of task is equal to deadline of the server which means if you conclude a period
-using ``rate_monotonic_period``, the length of next period is always determined
-by the server's property.
-
-The task has a guaranteed bandwidth given by the server but should not exceed
-it, otherwise the priority is pulled to background until the start of next
-period and the ``rtems_cbs_budget_overrun`` callback function is invoked.
-
-When attaching a task to server, the preemptability flag of the task is raised,
-otherwise it would not be possible to control the execution of the task.
-
-Detaching Task from a Server
-----------------------------
-
-The directive ``rtems_cbs_detach_thread`` is just an inverse operation to the
-previous one, the task continues its execution with the initial priority.
-
-Preemptability of the task is restored to the initial value.
-
-Examples
---------
-
-The following example presents a simple common use of the API.
-
-You can see the initialization and cleanup call here, if there are multiple
-tasks in the system, it is obvious that the initialization should be called
-before creating the task.
-
-Notice also that in this case we decided to register an overrun handler,
-instead of which there could be ``NULL``. This handler just prints a message to
-terminal, what else may be done here depends on a specific application.
-
-During the periodic execution, remaining budget should be watched to avoid
-overrun.
-
-.. code-block:: c
-
- void overrun_handler (
- rtems_cbs_server_id server_id
- )
- {
- printk( "Budget overrun, fixing the task\\n" );
- return;
- }
-
- rtems_task Tasks_Periodic(
- rtems_task_argument argument
- )
- {
- rtems_id rmid;
- rtems_cbs_server_id server_id;
- rtems_cbs_parameters params;
-
- params.deadline = 10;
- params.budget = 4;
-
- rtems_cbs_initialize();
- rtems_cbs_create_server( &params, &overrun_handler, &server_id )
- rtems_cbs_attach_thread( server_id, SELF );
- rtems_rate_monotonic_create( argument, &rmid );
-
- while ( 1 ) {
- if (rtems_rate_monotonic_period(rmid, params.deadline) == RTEMS_TIMEOUT)
- break;
- /* Perform some periodic action */
- }
-
- rtems_rate_monotonic_delete( rmid );
- rtems_cbs_cleanup();
- exit( 1 );
- }
-
-Directives
-==========
-
-This section details the Constant Bandwidth Server's directives. A subsection
-is dedicated to each of this manager's directives and describes the calling
-sequence, related constants, usage, and status codes.
-
-.. _rtems_cbs_initialize:
-
-CBS_INITIALIZE - Initialize the CBS library
--------------------------------------------
-.. index:: initialize the CBS library
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_initialize
-
-.. code-block:: c
-
- int rtems_cbs_initialize( void );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successful initialization
- * - ``RTEMS_CBS_ERROR_NO_MEMORY``
- - not enough memory for data
-
-**DESCRIPTION:**
-
-This routine initializes the library in terms of allocating necessary memory
-for the servers. In case not enough memory is available in the system,
-``RTEMS_CBS_ERROR_NO_MEMORY`` is returned, otherwise ``RTEMS_CBS_OK``.
-
-**NOTES:**
-
-Additional memory per each server is allocated upon invocation of
-``rtems_cbs_create_server``.
-
-Tasks in the system are not influenced, they still keep executing with their
-initial parameters.
-
-.. _rtems_cbs_cleanup:
-
-CBS_CLEANUP - Cleanup the CBS library
--------------------------------------
-.. index:: cleanup the CBS library
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_cleanup
-
-.. code-block:: c
-
- int rtems_cbs_cleanup( void );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - always successful
-
-**DESCRIPTION:**
-
-This routine detaches all tasks from their servers, destroys all servers and
-returns memory back to the system.
-
-**NOTES:**
-
-All tasks continue executing with their initial priorities.
-
-.. _rtems_cbs_create_server:
-
-CBS_CREATE_SERVER - Create a new bandwidth server
--------------------------------------------------
-.. index:: create a new bandwidth server
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_create_server
-
-.. code-block:: c
-
- int rtems_cbs_create_server (
- rtems_cbs_parameters *params,
- rtems_cbs_budget_overrun budget_overrun_callback,
- rtems_cbs_server_id *server_id
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successfully created
- * - ``RTEMS_CBS_ERROR_NO_MEMORY``
- - not enough memory for data
- * - ``RTEMS_CBS_ERROR_FULL``
- - maximum servers exceeded
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
-
-**DESCRIPTION:**
-
-This routine prepares an instance of a constant bandwidth server. The input
-parameter ``rtems_cbs_parameters`` specifies scheduling parameters of the
-server (period and budget). If these are not valid,
-``RTEMS_CBS_ERROR_INVALID_PARAMETER`` is returned. The
-``budget_overrun_callback`` is an optional callback function, which is invoked
-in case the server's budget within one period is exceeded. Output parameter
-``server_id`` becomes an id of the newly created server. If there is not
-enough memory, the ``RTEMS_CBS_ERROR_NO_MEMORY`` is returned. If the maximum
-server count in the system is exceeded, ``RTEMS_CBS_ERROR_FULL`` is returned.
-
-**NOTES:**
-
-No task execution is being influenced so far.
-
-.. _rtems_cbs_attach_thread:
-
-CBS_ATTACH_THREAD - Attach a thread to server
----------------------------------------------
-.. index:: attach a thread to server
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_attach_thread
-
-.. code-block:: c
-
- int rtems_cbs_attach_thread (
- rtems_cbs_server_id server_id,
- rtems_id task_id
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successfully attached
- * - ``RTEMS_CBS_ERROR_FULL``
- - server maximum tasks exceeded
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-Attaches a task (``task_id``) to a server (``server_id``). The server has to
-be previously created. Now, the task starts to be scheduled according to the
-server parameters and not using initial priority. This implementation allows
-only one task per server, if the user tries to bind another task to the same
-server, ``RTEMS_CBS_ERROR_FULL`` is returned.
-
-**NOTES:**
-
-Tasks attached to servers become preemptible.
-
-.. _rtems_cbs_detach_thread:
-
-CBS_DETACH_THREAD - Detach a thread from server
------------------------------------------------
-.. index:: detach a thread from server
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_detach_thread
-
-.. code-block:: c
-
- int rtems_cbs_detach_thread (
- rtems_cbs_server_id server_id,
- rtems_id task_id
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successfully detached
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-This directive detaches a thread from server. The task continues its execution
-with initial priority.
-
-**NOTES:**
-
-The server can be reused for any other task.
-
-.. _rtems_cbs_destroy_server:
-
-CBS_DESTROY_SERVER - Destroy a bandwidth server
------------------------------------------------
-.. index:: destroy a bandwidth server
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_destroy_server
-
-.. code-block:: c
-
- int rtems_cbs_destroy_server (
- rtems_cbs_server_id server_id
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successfully destroyed
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-This directive destroys a server. If any task was attached to the server, the
-task is detached and continues its execution according to EDF rules with
-initial properties.
-
-**NOTES:**
-
-This again enables one more task to be created.
-
-.. _rtems_cbs_get_server_id:
-
-CBS_GET_SERVER_ID - Get an ID of a server
------------------------------------------
-.. index:: get an ID of a server
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_get_server_id
-
-.. code-block:: c
-
- int rtems_cbs_get_server_id (
- rtems_id task_id,
- rtems_cbs_server_id *server_id
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successful
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-This directive returns an id of server belonging to a given task.
-
-.. _rtems_cbs_get_parameters:
-
-CBS_GET_PARAMETERS - Get scheduling parameters of a server
-----------------------------------------------------------
-.. index:: get scheduling parameters of a server
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_get_parameters
-
-.. code-block:: c
-
- rtems_cbs_get_parameters (
- rtems_cbs_server_id server_id,
- rtems_cbs_parameters *params
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successful
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-This directive returns a structure with current scheduling parameters
-of a given server (period and execution time).
-
-**NOTES:**
-
-It makes no difference if any task is assigned or not.
-
-.. _rtems_cbs_set_parameters:
-
-CBS_SET_PARAMETERS - Set scheduling parameters
-----------------------------------------------
-.. index:: set scheduling parameters
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_set_parameters
-
-.. code-block:: c
-
- int rtems_cbs_set_parameters (
- rtems_cbs_server_id server_id,
- rtems_cbs_parameters *params
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successful
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-This directive sets new scheduling parameters to the server. This operation can
-be performed regardless of whether a task is assigned or not. If a task is
-assigned, the parameters become effective imediately, therefore it is
-recommended to apply the change between two subsequent periods.
-
-**NOTES:**
-
-There is an upper limit on both period and budget equal to (2^31)-1 ticks.
-
-.. _rtems_cbs_get_execution_time:
-
-CBS_GET_EXECUTION_TIME - Get elapsed execution time
----------------------------------------------------
-.. index:: get elapsed execution time
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_get_execution_time
-
-.. code-block:: c
-
- int rtems_cbs_get_execution_time (
- rtems_cbs_server_id server_id,
- time_t *exec_time,
- time_t *abs_time
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successful
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-This routine returns consumed execution time (``exec_time``) of a server during
-the current period.
-
-**NOTES:**
-
-Absolute time (``abs_time``) not supported now.
-
-.. _rtems_cbs_get_remaining_budget:
-
-CBS_GET_REMAINING_BUDGET - Get remaining execution time
--------------------------------------------------------
-.. index:: get remaining execution time
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_get_remaining_budget
-
-.. code-block:: c
-
- int rtems_cbs_get_remaining_budget (
- rtems_cbs_server_id server_id,
- time_t *remaining_budget
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successful
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-This directive returns remaining execution time of a given server for current
-period.
-
-**NOTES:**
-
-If the execution time approaches zero, the assigned task should finish
-computations of the current period.
-
-.. _rtems_cbs_get_approved_budget:
-
-CBS_GET_APPROVED_BUDGET - Get scheduler approved execution time
----------------------------------------------------------------
-.. index:: get scheduler approved execution time
-
-**CALLING SEQUENCE:**
-
-.. index:: rtems_cbs_get_approved_budget
-
-.. code-block:: c
-
- int rtems_cbs_get_approved_budget (
- rtems_cbs_server_id server_id,
- time_t *appr_budget
- );
-
-**DIRECTIVE STATUS CODES:**
-
-.. list-table::
- :class: rtems-table
-
- * - ``RTEMS_CBS_OK``
- - successful
- * - ``RTEMS_CBS_ERROR_INVALID_PARAMETER``
- - invalid input argument
- * - ``RTEMS_CBS_ERROR_NOSERVER``
- - server is not valid
-
-**DESCRIPTION:**
-
-This directive returns server's approved budget for subsequent periods.