source: rtems-docs/porting/priority_bitmap.rst @ 3a71759

4.115
Last change on this file since 3a71759 was 6733466, checked in by Amar Takhar <amar@…>, on 01/17/16 at 00:08:48

Split document into seperate files by section.

  • Property mode set to 100644
File size: 7.4 KB
Line 
1Priority Bitmap Manipulation
2############################
3
4Introduction
5============
6
7The RTEMS chain of ready tasks is implemented as an array of FIFOs with
8each priority having its own FIFO.  This makes it very efficient to
9determine the first and last ready task at each priority.  In addition,
10blocking a task only requires appending the task to the end of the FIFO
11for its priority rather than a lengthy search down a single chain of all
12ready tasks.  This works extremely well except for one problem.  When the
13currently executing task blocks, there may be no easy way to determine
14what is the next most important ready task.  If the blocking task was the
15only ready task at its priority, then RTEMS must search all of the FIFOs
16in the ready chain to determine the highest priority with a ready task.
17
18RTEMS uses a bitmap array to efficiently solve this problem.  The state of
19each bit in the priority map bit array indicates whether or not there is a
20ready task at that priority.  The bit array can be efficiently searched to
21determine the highest priority ready task.  This family of data type and
22routines is used to maintain and search the bit map array.
23
24When manipulating the bitmap array, RTEMS internally divides the
258 bits of the task priority into "major" and "minor" components.
26The most significant 4 bits are the major component, while the least
27significant are the minor component.  The major component of a priority
28value is used to determine which 16-bit wide entry in the``_Priority_Bit_map`` array is associated with this priority.
29Each element in the ``_Priority_Bit_map`` array has a bit
30in the ``_Priority_Major_bit_map`` associated with it.
31That bit is cleared when all of the bits in a particular``_Priority_Bit_map`` array entry are zero.
32
33The minor component of a priority is used to determine
34specifically which bit in ``_Priority_Bit_map[major]``
35indicates whether or not there is a ready to execute task
36at the priority.
37
38_Priority_bit_map_Control Type
39==============================
40
41The ``_Priority_Bit_map_Control`` type is the fundamental data type of the
42priority bit map array used to determine which priorities have ready
43tasks.  This type may be either 16 or 32 bits wide although only the 16
44least significant bits will be used.  The data type is based upon what is
45the most efficient type for this CPU to manipulate.  For example, some
46CPUs have bit scan instructions that only operate on a particular size of
47data.  In this case, this type will probably be defined to work with this
48instruction.
49
50Find First Bit Routine
51======================
52
53The _CPU_Bitfield_Find_first_bit routine sets _output to the bit number of
54the first bit set in ``_value``.  ``_value`` is of CPU dependent type``Priority_bit_map_Control``.  A stub version of this routine is as follows:
55.. code:: c
56
57    #define _CPU_Bitfield_Find_first_bit( _value, _output ) \\
58    { \\
59    (_output) = 0;   /* do something to prevent warnings \*/ \\
60    }
61
62There are a number of variables in using a "find first bit" type
63instruction.
64
65# What happens when run on a value of zero?
66
67# Bits may be numbered from MSB to LSB or vice-versa.
68
69# The numbering may be zero or one based.
70
71# The "find first bit" instruction may search from MSB or LSB.
72
73RTEMS guarantees that (1) will never happen so it is not a concern.
74Cases (2),(3), (4) are handled by the macros _CPU_Priority_mask() and
75_CPU_Priority_bits_index().  These three form a set of routines which must
76logically operate together.  Bits in the ``_value`` are set and cleared based
77on masks built by CPU_Priority_mask().  The basic major and minor values
78calculated by _Priority_Major() and _Priority_Minor() are "massaged" by
79_CPU_Priority_bits_index() to properly range between the values returned
80by the "find first bit" instruction.  This makes it possible for
81_Priority_Get_highest() to calculate the major and directly index into the
82minor table.  This mapping is necessary to ensure that 0 (a high priority
83major/minor) is the first bit found.
84
85This entire "find first bit" and mapping process depends heavily on the
86manner in which a priority is broken into a major and minor components
87with the major being the 4 MSB of a priority and minor the 4 LSB.  Thus (0
88<< 4) + 0 corresponds to priority 0 – the highest priority.  And (15 <<
894) + 14 corresponds to priority 254 – the next to the lowest priority.
90
91If your CPU does not have a "find first bit" instruction, then there are
92ways to make do without it.  Here are a handful of ways to implement this
93in software:
94
95- a series of 16 bit test instructions
96
97- a "binary search using if’s"
98
99- the following algorithm based upon a 16 entry lookup table.  In this pseudo-code, bit_set_table[16] has values which indicate the first bit set:
100
101  .. code:: c
102
103      _number = 0 if _value > 0x00ff
104      _value >>=8
105      _number = 8;
106      if _value > 0x0000f
107      _value >=8
108      _number += 4
109      _number += bit_set_table[ _value ]
110
111The following illustrates how the CPU_USE_GENERIC_BITFIELD_CODE macro may
112be so the port can use the generic implementation of this bitfield code.
113This can be used temporarily during the porting process to avoid writing
114these routines until the end.  This results in a functional although lower
115performance port.  This is perfectly acceptable during development and
116testing phases.
117.. code:: c
118
119    #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
120    #define CPU_USE_GENERIC_BITFIELD_DATA TRUE
121
122Eventually, CPU specific implementations of these routines are usually
123written since they dramatically impact the performance of blocking
124operations.  However they may take advantage of instructions which are not
125available on all models in the CPU family.  In this case, one might find
126something like this stub example did:
127.. code:: c
128
129    #if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
130    #define _CPU_Bitfield_Find_first_bit( _value, _output ) \\
131    { \\
132    (_output) = 0;   /* do something to prevent warnings \*/ \\
133    }
134    #endif
135
136Build Bit Field Mask
137====================
138
139The _CPU_Priority_Mask routine builds the mask that corresponds to the bit
140fields searched by _CPU_Bitfield_Find_first_bit().  See the discussion of
141that routine for more details.
142
143The following is a typical implementation when the
144_CPU_Bitfield_Find_first_bit searches for the most significant bit set:
145.. code:: c
146
147    #if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
148    #define _CPU_Priority_Mask( _bit_number ) \\
149    ( 1 << (_bit_number) )
150    #endif
151
152Bit Scan Support
153================
154
155The ``_CPU_Priority_bits_index`` routine translates the bit numbers
156returned by ``_CPU_Bitfield_Find_first_bit()`` into something
157suitable for use as a major or minor component of a priority.
158The find first bit routine may number the bits in a
159way that is difficult to map into the major and minor components
160of the priority.  For example, when finding the first bit set in
161the value 0x8000, a CPU may indicate that bit 15 or 16 is set
162based on whether the least significant bit is "zero" or "one".
163Similarly, a CPU may only scan 32-bit values and consider the
164most significant bit to be bit zero or one.  In this case, this
165would be bit 16 or 17.
166
167This routine allows that unwieldy form to be converted
168into a normalized form that is easier to process and use
169as an index.
170.. code:: c
171
172    #if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
173    #define _CPU_Priority_bits_index( _priority ) \\
174    (_priority)
175    #endif
176
177.. COMMENT: COPYRIGHT (c) 1988-2002.
178
179.. COMMENT: On-Line Applications Research Corporation (OAR).
180
181.. COMMENT: All rights reserved.
182
Note: See TracBrowser for help on using the repository browser.