Changeset c6522a65 in rtems
- Timestamp:
- 05/12/14 06:38:38 (10 years ago)
- Branches:
- 4.11, 5, master
- Children:
- e9ee2f0
- Parents:
- beab7329
- git-author:
- Sebastian Huber <sebastian.huber@…> (05/12/14 06:38:38)
- git-committer:
- Sebastian Huber <sebastian.huber@…> (05/14/14 12:46:20)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/score/include/rtems/score/schedulersmpimpl.h
rbeab7329 rc6522a65 35 35 /** 36 36 * @addtogroup ScoreSchedulerSMP 37 * 38 * The scheduler nodes can be in four states 39 * - @ref SCHEDULER_SMP_NODE_BLOCKED, 40 * - @ref SCHEDULER_SMP_NODE_SCHEDULED, 41 * - @ref SCHEDULER_SMP_NODE_READY, and 42 * - @ref SCHEDULER_SMP_NODE_IN_THE_AIR. 43 * 44 * State transitions are triggered via basic three operations 45 * - _Scheduler_SMP_Enqueue_ordered(), 46 * - _Scheduler_SMP_Extract(), and 47 * - _Scheduler_SMP_Schedule(). 48 * 49 * @dot 50 * digraph { 51 * node [style="filled"]; 52 * 53 * bs [label="BLOCKED"]; 54 * ss [label="SCHEDULED", fillcolor="green"]; 55 * rs [label="READY", fillcolor="red"]; 56 * as [label="IN THE AIR", fillcolor="orange"]; 57 * 58 * edge [label="enqueue"]; 59 * edge [fontcolor="darkgreen", color="darkgreen"]; 60 * 61 * bs -> ss; 62 * as -> ss; 63 * 64 * edge [label="enqueue"]; 65 * edge [fontcolor="red", color="red"]; 66 * 67 * bs -> rs; 68 * as -> rs; 69 * 70 * edge [label="enqueue other"]; 71 * 72 * ss -> rs; 73 * 74 * edge [label="schedule"]; 75 * edge [fontcolor="black", color="black"]; 76 * 77 * as -> bs; 78 * 79 * edge [label="extract"]; 80 * edge [fontcolor="brown", color="brown"]; 81 * 82 * ss -> as; 83 * 84 * edge [fontcolor="black", color="black"]; 85 * 86 * rs -> bs; 87 * 88 * edge [label="enqueue other\nschedule other"]; 89 * edge [fontcolor="darkgreen", color="darkgreen"]; 90 * 91 * rs -> ss; 92 * } 93 * @enddot 94 * 95 * During system initialization each processor of the scheduler instance starts 96 * with an idle thread assigned to it. Lets have a look at an example with two 97 * idle threads I and J with priority 5. We also have blocked threads A, B and 98 * C with priorities 1, 2 and 3 respectively. 99 * 100 * @dot 101 * digraph { 102 * node [style="filled"]; 103 * edge [dir="none"]; 104 * subgraph { 105 * rank = same; 106 * 107 * i [label="I (5)", fillcolor="green"]; 108 * j [label="J (5)", fillcolor="green"]; 109 * a [label="A (1)"]; 110 * b [label="B (2)"]; 111 * c [label="C (3)"]; 112 * i -> j; 113 * } 114 * 115 * subgraph { 116 * rank = same; 117 * 118 * p0 [label="PROCESSOR 0", shape="box"]; 119 * p1 [label="PROCESSOR 1", shape="box"]; 120 * } 121 * 122 * i -> p0; 123 * j -> p1; 124 * } 125 * @enddot 126 * 127 * Lets start A. For this an enqueue operation is performed. 128 * 129 * @dot 130 * digraph { 131 * node [style="filled"]; 132 * edge [dir="none"]; 133 * 134 * subgraph { 135 * rank = same; 136 * 137 * i [label="I (5)", fillcolor="green"]; 138 * j [label="J (5)", fillcolor="red"]; 139 * a [label="A (1)", fillcolor="green"]; 140 * b [label="B (2)"]; 141 * c [label="C (3)"]; 142 * a -> i; 143 * } 144 * 145 * subgraph { 146 * rank = same; 147 * 148 * p0 [label="PROCESSOR 0", shape="box"]; 149 * p1 [label="PROCESSOR 1", shape="box"]; 150 * } 151 * 152 * i -> p0; 153 * a -> p1; 154 * } 155 * @enddot 156 * 157 * Lets start C. 158 * 159 * @dot 160 * digraph { 161 * node [style="filled"]; 162 * edge [dir="none"]; 163 * 164 * subgraph { 165 * rank = same; 166 * 167 * a [label="A (1)", fillcolor="green"]; 168 * c [label="C (3)", fillcolor="green"]; 169 * i [label="I (5)", fillcolor="red"]; 170 * j [label="J (5)", fillcolor="red"]; 171 * b [label="B (2)"]; 172 * a -> c; 173 * i -> j; 174 * } 175 * 176 * subgraph { 177 * rank = same; 178 * 179 * p0 [label="PROCESSOR 0", shape="box"]; 180 * p1 [label="PROCESSOR 1", shape="box"]; 181 * } 182 * 183 * c -> p0; 184 * a -> p1; 185 * } 186 * @enddot 187 * 188 * Lets start B. 189 * 190 * @dot 191 * digraph { 192 * node [style="filled"]; 193 * edge [dir="none"]; 194 * 195 * subgraph { 196 * rank = same; 197 * 198 * a [label="A (1)", fillcolor="green"]; 199 * b [label="B (2)", fillcolor="green"]; 200 * c [label="C (3)", fillcolor="red"]; 201 * i [label="I (5)", fillcolor="red"]; 202 * j [label="J (5)", fillcolor="red"]; 203 * a -> b; 204 * c -> i -> j; 205 * } 206 * 207 * subgraph { 208 * rank = same; 209 * 210 * p0 [label="PROCESSOR 0", shape="box"]; 211 * p1 [label="PROCESSOR 1", shape="box"]; 212 * } 213 * 214 * b -> p0; 215 * a -> p1; 216 * } 217 * @enddot 218 * 219 * Lets do something with A. This can be a blocking operation or a priority 220 * change. For this an extract operation is performed first. 221 * 222 * @dot 223 * digraph { 224 * node [style="filled"]; 225 * edge [dir="none"]; 226 * 227 * subgraph { 228 * rank = same; 229 * 230 * b [label="B (2)", fillcolor="green"]; 231 * a [label="A (1)", fillcolor="orange"]; 232 * c [label="C (3)", fillcolor="red"]; 233 * i [label="I (5)", fillcolor="red"]; 234 * j [label="J (5)", fillcolor="red"]; 235 * c -> i -> j; 236 * } 237 * 238 * subgraph { 239 * rank = same; 240 * 241 * p0 [label="PROCESSOR 0", shape="box"]; 242 * p1 [label="PROCESSOR 1", shape="box"]; 243 * } 244 * 245 * b -> p0; 246 * a -> p1; 247 * } 248 * @enddot 249 * 250 * Lets change the priority of thread A to 4 and enqueue it. 251 * 252 * @dot 253 * digraph { 254 * node [style="filled"]; 255 * edge [dir="none"]; 256 * 257 * subgraph { 258 * rank = same; 259 * 260 * b [label="B (2)", fillcolor="green"]; 261 * c [label="C (3)", fillcolor="green"]; 262 * a [label="A (4)", fillcolor="red"]; 263 * i [label="I (5)", fillcolor="red"]; 264 * j [label="J (5)", fillcolor="red"]; 265 * b -> c; 266 * a -> i -> j; 267 * } 268 * 269 * subgraph { 270 * rank = same; 271 * 272 * p0 [label="PROCESSOR 0", shape="box"]; 273 * p1 [label="PROCESSOR 1", shape="box"]; 274 * } 275 * 276 * b -> p0; 277 * c -> p1; 278 * } 279 * @enddot 280 * 281 * Alternatively we can also do a blocking operation with thread A. In this 282 * case schedule will be called. 283 * 284 * @dot 285 * digraph { 286 * node [style="filled"]; 287 * edge [dir="none"]; 288 * 289 * subgraph { 290 * rank = same; 291 * 292 * b [label="B (2)", fillcolor="green"]; 293 * c [label="C (3)", fillcolor="green"]; 294 * i [label="I (5)", fillcolor="red"]; 295 * j [label="J (5)", fillcolor="red"]; 296 * a [label="A (1)"]; 297 * b -> c; 298 * i -> j; 299 * } 300 * 301 * subgraph { 302 * rank = same; 303 * 304 * p0 [label="PROCESSOR 0", shape="box"]; 305 * p1 [label="PROCESSOR 1", shape="box"]; 306 * } 307 * 308 * b -> p0; 309 * c -> p1; 310 * } 311 * @enddot 37 312 * 38 313 * @{ … … 181 456 } 182 457 458 /** 459 * @brief Enqueues a thread according to the specified order function. 460 * 461 * @param[in] context The scheduler instance context. 462 * @param[in] thread The thread to enqueue. 463 * @param[in] order The order function. 464 * @param[in] get_highest_ready Function to get the highest ready node. 465 * @param[in] insert_ready Function to insert a node into the set of ready 466 * nodes. 467 * @param[in] insert_scheduled Function to insert a node into the set of 468 * scheduled nodes. 469 * @param[in] move_from_ready_to_scheduled Function to move a node from the set 470 * of ready nodes to the set of scheduled nodes. 471 * @param[in] move_from_scheduled_to_ready Function to move a node from the set 472 * of scheduled nodes to the set of ready nodes. 473 */ 183 474 static inline void _Scheduler_SMP_Enqueue_ordered( 184 475 Scheduler_SMP_Context *self, … … 257 548 } 258 549 550 /** 551 * @brief Finalize a scheduling operation. 552 * 553 * @param[in] context The scheduler instance context. 554 * @param[in] thread The thread of the scheduling operation. 555 * @param[in] get_highest_ready Function to get the highest ready node. 556 * @param[in] move_from_ready_to_scheduled Function to move a node from the set 557 * of ready nodes to the set of scheduled nodes. 558 */ 259 559 static inline void _Scheduler_SMP_Schedule( 260 560 Scheduler_SMP_Context *self, … … 296 596 } 297 597 598 /** 599 * @brief Extracts a thread from the set of scheduled or ready nodes. 600 * 601 * @param[in] context The scheduler instance context. 602 * @param[in] thread The thread to extract. 603 * @param[in] extract Function to extract a node from the set of scheduled or 604 * ready nodes. 605 */ 298 606 static inline void _Scheduler_SMP_Extract( 299 607 Scheduler_SMP_Context *self,
Note: See TracChangeset
for help on using the changeset viewer.