[6d4e604b] | 1 | -- |
---|
| 2 | -- TMTEST / BODY |
---|
| 3 | -- |
---|
| 4 | -- DESCRIPTION: |
---|
| 5 | -- |
---|
| 6 | -- This package is the implementation of Test 13 of the RTEMS |
---|
| 7 | -- Timing Test Suite. |
---|
| 8 | -- |
---|
| 9 | -- DEPENDENCIES: |
---|
| 10 | -- |
---|
| 11 | -- |
---|
| 12 | -- |
---|
[3c4d8cd1] | 13 | -- COPYRIGHT (c) 1989-2011. |
---|
[6d4e604b] | 14 | -- On-Line Applications Research Corporation (OAR). |
---|
| 15 | -- |
---|
[bf9ae83] | 16 | -- The license and distribution terms for this file may in |
---|
| 17 | -- the file LICENSE in this distribution or at |
---|
[c499856] | 18 | -- http://www.rtems.org/license/LICENSE. |
---|
[6d4e604b] | 19 | -- |
---|
| 20 | |
---|
| 21 | with INTERFACES; use INTERFACES; |
---|
| 22 | with RTEMS_CALLING_OVERHEAD; |
---|
| 23 | with TEST_SUPPORT; |
---|
| 24 | with TEXT_IO; |
---|
| 25 | with TIME_TEST_SUPPORT; |
---|
[110e1f1] | 26 | with TIMER_DRIVER; |
---|
[3c4d8cd1] | 27 | with RTEMS.MESSAGE_QUEUE; |
---|
[6d4e604b] | 28 | |
---|
| 29 | package body TMTEST is |
---|
| 30 | |
---|
| 31 | -- |
---|
| 32 | -- INIT |
---|
| 33 | -- |
---|
| 34 | |
---|
| 35 | procedure INIT ( |
---|
[3c4d8cd1] | 36 | ARGUMENT : in RTEMS.TASKS.ARGUMENT |
---|
[6d4e604b] | 37 | ) is |
---|
[110e1f1] | 38 | pragma Unreferenced(ARGUMENT); |
---|
[6d4e604b] | 39 | TASK_ID : RTEMS.ID; |
---|
| 40 | STATUS : RTEMS.STATUS_CODES; |
---|
| 41 | begin |
---|
| 42 | |
---|
| 43 | TEXT_IO.NEW_LINE( 2 ); |
---|
[f6c9334d] | 44 | TEST_SUPPORT.ADA_TEST_BEGIN; |
---|
[6d4e604b] | 45 | |
---|
[3c4d8cd1] | 46 | RTEMS.TASKS.CREATE( |
---|
[6d4e604b] | 47 | 1, |
---|
| 48 | 251, |
---|
| 49 | 1024, |
---|
| 50 | RTEMS.DEFAULT_MODES, |
---|
| 51 | RTEMS.DEFAULT_ATTRIBUTES, |
---|
| 52 | TASK_ID, |
---|
| 53 | STATUS |
---|
| 54 | ); |
---|
| 55 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" ); |
---|
| 56 | |
---|
[3c4d8cd1] | 57 | RTEMS.TASKS.START( |
---|
[6d4e604b] | 58 | TASK_ID, |
---|
| 59 | TMTEST.TEST_INIT'ACCESS, |
---|
| 60 | 0, |
---|
| 61 | STATUS |
---|
| 62 | ); |
---|
| 63 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" ); |
---|
| 64 | |
---|
[3c4d8cd1] | 65 | RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS ); |
---|
[6d4e604b] | 66 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" ); |
---|
| 67 | |
---|
| 68 | end INIT; |
---|
| 69 | |
---|
| 70 | -- |
---|
| 71 | -- TEST_INIT |
---|
| 72 | -- |
---|
| 73 | |
---|
| 74 | procedure TEST_INIT ( |
---|
[3c4d8cd1] | 75 | ARGUMENT : in RTEMS.TASKS.ARGUMENT |
---|
[6d4e604b] | 76 | ) is |
---|
[110e1f1] | 77 | pragma Unreferenced(ARGUMENT); |
---|
[3c4d8cd1] | 78 | TASK_ENTRY : RTEMS.TASKS.ENTRY_POINT; |
---|
| 79 | PRIORITY : RTEMS.TASKS.PRIORITY; |
---|
[6d4e604b] | 80 | TASK_ID : RTEMS.ID; |
---|
[e17ffea] | 81 | BUFFER : TMTEST.BUFFER; |
---|
| 82 | BUFFER_POINTER : RTEMS.ADDRESS; |
---|
[6d4e604b] | 83 | STATUS : RTEMS.STATUS_CODES; |
---|
| 84 | begin |
---|
| 85 | |
---|
[e17ffea] | 86 | BUFFER_POINTER := BUFFER'ADDRESS; |
---|
[6d4e604b] | 87 | |
---|
| 88 | -- As each task is started, it preempts this task and performs a blocking |
---|
| 89 | -- MESSAGE_QUEUE_RECEIVE. Upon completion of this loop all created tasks |
---|
| 90 | -- are blocked. |
---|
| 91 | |
---|
[3c4d8cd1] | 92 | RTEMS.MESSAGE_QUEUE.CREATE( |
---|
[6d4e604b] | 93 | RTEMS.BUILD_NAME( 'M', 'Q', '1', ' ' ), |
---|
| 94 | TIME_TEST_SUPPORT.OPERATION_COUNT, |
---|
[688ecaa0] | 95 | 16, |
---|
[6d4e604b] | 96 | RTEMS.DEFAULT_OPTIONS, |
---|
| 97 | TMTEST.QUEUE_ID, |
---|
| 98 | STATUS |
---|
| 99 | ); |
---|
| 100 | |
---|
| 101 | PRIORITY := 250; |
---|
| 102 | |
---|
| 103 | for INDEX in 0 .. TIME_TEST_SUPPORT.OPERATION_COUNT - 1 |
---|
| 104 | loop |
---|
| 105 | |
---|
[3c4d8cd1] | 106 | RTEMS.TASKS.CREATE( |
---|
[6d4e604b] | 107 | RTEMS.BUILD_NAME( 'T', 'I', 'M', 'E' ), |
---|
| 108 | PRIORITY, |
---|
| 109 | 1024, |
---|
| 110 | RTEMS.DEFAULT_MODES, |
---|
| 111 | RTEMS.DEFAULT_ATTRIBUTES, |
---|
| 112 | TASK_ID, |
---|
| 113 | STATUS |
---|
| 114 | ); |
---|
| 115 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" ); |
---|
| 116 | |
---|
| 117 | PRIORITY := PRIORITY - 1; |
---|
| 118 | |
---|
| 119 | if INDEX = TIME_TEST_SUPPORT.OPERATION_COUNT - 1 then |
---|
| 120 | TASK_ENTRY := TMTEST.HIGH_TASK'ACCESS; |
---|
| 121 | else |
---|
| 122 | TASK_ENTRY := TMTEST.MIDDLE_TASKS'ACCESS; |
---|
| 123 | end if; |
---|
| 124 | |
---|
[3c4d8cd1] | 125 | RTEMS.TASKS.START( TASK_ID, TASK_ENTRY, 0, STATUS ); |
---|
[6d4e604b] | 126 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" ); |
---|
| 127 | |
---|
| 128 | end loop; |
---|
| 129 | |
---|
| 130 | TIMER_DRIVER.INITIALIZE; |
---|
[3c4d8cd1] | 131 | RTEMS.MESSAGE_QUEUE.URGENT( |
---|
[6d4e604b] | 132 | TMTEST.QUEUE_ID, |
---|
| 133 | BUFFER_POINTER, |
---|
[e17ffea] | 134 | 16, |
---|
[6d4e604b] | 135 | STATUS |
---|
| 136 | ); |
---|
[3c4d8cd1] | 137 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" ); |
---|
[6d4e604b] | 138 | |
---|
| 139 | end TEST_INIT; |
---|
| 140 | |
---|
| 141 | -- |
---|
| 142 | -- HIGH_TASK |
---|
| 143 | -- |
---|
| 144 | |
---|
| 145 | procedure HIGH_TASK ( |
---|
[3c4d8cd1] | 146 | ARGUMENT : in RTEMS.TASKS.ARGUMENT |
---|
[6d4e604b] | 147 | ) is |
---|
[110e1f1] | 148 | pragma Unreferenced(ARGUMENT); |
---|
[e17ffea] | 149 | BUFFER : TMTEST.BUFFER; |
---|
| 150 | BUFFER_POINTER : RTEMS.ADDRESS; |
---|
[110e1f1] | 151 | MESSAGE_SIZE : RTEMS.UNSIGNED32 := 0; |
---|
[6d4e604b] | 152 | STATUS : RTEMS.STATUS_CODES; |
---|
| 153 | begin |
---|
| 154 | |
---|
[e17ffea] | 155 | BUFFER_POINTER := BUFFER'ADDRESS; |
---|
[6d4e604b] | 156 | |
---|
[3c4d8cd1] | 157 | RTEMS.MESSAGE_QUEUE.RECEIVE( |
---|
[6d4e604b] | 158 | TMTEST.QUEUE_ID, |
---|
| 159 | BUFFER_POINTER, |
---|
| 160 | RTEMS.DEFAULT_OPTIONS, |
---|
| 161 | RTEMS.NO_TIMEOUT, |
---|
[e17ffea] | 162 | MESSAGE_SIZE, |
---|
[6d4e604b] | 163 | STATUS |
---|
| 164 | ); |
---|
| 165 | |
---|
| 166 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
---|
| 167 | TIME_TEST_SUPPORT.PUT_TIME( |
---|
| 168 | "MESSAGE_QUEUE_URGENT (preemptive)", |
---|
| 169 | TMTEST.END_TIME, |
---|
| 170 | TIME_TEST_SUPPORT.OPERATION_COUNT, |
---|
| 171 | 0, |
---|
| 172 | RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_URGENT |
---|
| 173 | ); |
---|
| 174 | |
---|
[f6c9334d] | 175 | TEST_SUPPORT.ADA_TEST_END; |
---|
[6d4e604b] | 176 | RTEMS.SHUTDOWN_EXECUTIVE( 0 ); |
---|
| 177 | |
---|
| 178 | end HIGH_TASK; |
---|
| 179 | |
---|
| 180 | -- |
---|
| 181 | -- MIDDLE_TASKS |
---|
| 182 | -- |
---|
| 183 | |
---|
| 184 | procedure MIDDLE_TASKS ( |
---|
[3c4d8cd1] | 185 | ARGUMENT : in RTEMS.TASKS.ARGUMENT |
---|
[6d4e604b] | 186 | ) is |
---|
[110e1f1] | 187 | pragma Unreferenced(ARGUMENT); |
---|
[e17ffea] | 188 | BUFFER : TMTEST.BUFFER; |
---|
| 189 | BUFFER_POINTER : RTEMS.ADDRESS; |
---|
[110e1f1] | 190 | MESSAGE_SIZE : RTEMS.UNSIGNED32 := 0; |
---|
[6d4e604b] | 191 | STATUS : RTEMS.STATUS_CODES; |
---|
| 192 | begin |
---|
| 193 | |
---|
[e17ffea] | 194 | BUFFER_POINTER := BUFFER'ADDRESS; |
---|
[6d4e604b] | 195 | |
---|
[3c4d8cd1] | 196 | RTEMS.MESSAGE_QUEUE.RECEIVE( |
---|
[6d4e604b] | 197 | TMTEST.QUEUE_ID, |
---|
| 198 | BUFFER_POINTER, |
---|
| 199 | RTEMS.DEFAULT_OPTIONS, |
---|
| 200 | RTEMS.NO_TIMEOUT, |
---|
[e17ffea] | 201 | MESSAGE_SIZE, |
---|
[6d4e604b] | 202 | STATUS |
---|
| 203 | ); |
---|
[3c4d8cd1] | 204 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); |
---|
[6d4e604b] | 205 | |
---|
[3c4d8cd1] | 206 | RTEMS.MESSAGE_QUEUE.URGENT( |
---|
[6d4e604b] | 207 | TMTEST.QUEUE_ID, |
---|
| 208 | BUFFER_POINTER, |
---|
[e17ffea] | 209 | 16, |
---|
[6d4e604b] | 210 | STATUS |
---|
| 211 | ); |
---|
[3c4d8cd1] | 212 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" ); |
---|
[6d4e604b] | 213 | |
---|
| 214 | end MIDDLE_TASKS; |
---|
| 215 | |
---|
| 216 | end TMTEST; |
---|