File indexing completed on 2025-05-11 08:24:45
0001
0002
0003
0004
0005
0006
0007 #ifdef HAVE_CONFIG_H
0008 #include "config.h"
0009 #endif
0010
0011 #include <tmacros.h>
0012 #include <bsp.h>
0013
0014 const char rtems_test_name[] = "SP 29";
0015
0016 rtems_task Init (rtems_task_argument argument);
0017
0018 #define CONFIGURE_EXTRA_TASK_STACKS RTEMS_MINIMUM_STACK_SIZE
0019
0020 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0021
0022 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0023
0024 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0025 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0026 #define CONFIGURE_MAXIMUM_TASKS 2
0027 #define CONFIGURE_MAXIMUM_SEMAPHORES 2
0028
0029 #define CONFIGURE_INIT
0030
0031 #include <rtems/confdefs.h>
0032
0033 #include <rtems/error.h>
0034 #include <stdio.h>
0035 #include <stdlib.h>
0036
0037 #include "tmacros.h"
0038
0039 rtems_interval ticksPerSecond;
0040 rtems_task subtask(rtems_task_argument arg);
0041 void startTask(rtems_id arg);
0042
0043 rtems_task
0044 subtask (rtems_task_argument arg)
0045 {
0046 rtems_status_code sc;
0047 rtems_id sem = (rtems_id)arg;
0048
0049 for (;;) {
0050 rtems_task_wake_after (ticksPerSecond * 2);
0051
0052 sc = rtems_semaphore_release (sem);
0053 if (sc != RTEMS_SUCCESSFUL) {
0054 printf(
0055 "%d: Can't release semaphore: %s\n", __LINE__,
0056 rtems_status_text (sc)
0057 );
0058 }
0059 }
0060 }
0061
0062 void
0063 startTask (rtems_id arg)
0064 {
0065 rtems_id tid;
0066 rtems_status_code sc;
0067
0068 sc = rtems_task_create (rtems_build_name ('S', 'R', 'V', 'A'),
0069 RTEMS_MAXIMUM_PRIORITY - 1u,
0070 RTEMS_MINIMUM_STACK_SIZE * 2,
0071 RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
0072 RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
0073 &tid
0074 );
0075 if (sc != RTEMS_SUCCESSFUL) {
0076 printf ("Can't create task: %s\n", rtems_status_text (sc));
0077 rtems_task_suspend (RTEMS_SELF);
0078 }
0079 sc = rtems_task_start (tid, subtask, arg);
0080 if (sc != RTEMS_SUCCESSFUL) {
0081 printf ("Can't start task: %s\n", rtems_status_text (sc));
0082 rtems_task_suspend (RTEMS_SELF);
0083 }
0084 }
0085
0086 rtems_task Init (rtems_task_argument ignored)
0087 {
0088 int i;
0089 rtems_id semrec, semnorec;
0090 rtems_status_code sc;
0091 rtems_interval then, now;
0092
0093 TEST_BEGIN();
0094 puts( "This test only prints on errors." );
0095
0096 ticksPerSecond = rtems_clock_get_ticks_per_second();
0097 if (ticksPerSecond <= 0) {
0098 printf(
0099 "Invalid ticks per second: %" PRIdrtems_interval "\n",
0100 ticksPerSecond
0101 );
0102 exit (1);
0103 }
0104 sc = rtems_semaphore_create (rtems_build_name ('S', 'M', 'r', 'c'),
0105 1,
0106 RTEMS_PRIORITY|RTEMS_BINARY_SEMAPHORE|RTEMS_INHERIT_PRIORITY| \
0107 RTEMS_NO_PRIORITY_CEILING|RTEMS_LOCAL,
0108 0,
0109 &semrec
0110 );
0111 directive_failed( sc, "create recursive lock" );
0112
0113 sc = rtems_semaphore_create (rtems_build_name ('S', 'M', 'n', 'c'),
0114 1,
0115 RTEMS_PRIORITY|RTEMS_SIMPLE_BINARY_SEMAPHORE|RTEMS_NO_INHERIT_PRIORITY| \
0116 RTEMS_NO_PRIORITY_CEILING|RTEMS_LOCAL,
0117 0,
0118 &semnorec
0119 );
0120 directive_failed( sc, "create non-recursive lock" );
0121
0122 sc = rtems_semaphore_obtain (semrec, RTEMS_NO_WAIT, 0);
0123 directive_failed( sc, "obtain recursive lock" );
0124
0125 sc = rtems_semaphore_obtain (semrec, RTEMS_NO_WAIT, 0);
0126 directive_failed( sc, "reobtain recursive lock" );
0127
0128 sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
0129 directive_failed( sc, "reobtain recursive lock" );
0130
0131 sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
0132 if (sc == RTEMS_SUCCESSFUL) {
0133 printf(
0134 "%d: Reobtain non-recursive-lock semaphore -- and should not have.\n",
0135 __LINE__
0136 );
0137 rtems_test_exit(1);
0138 }
0139
0140 sc = rtems_semaphore_release (semnorec);
0141 directive_failed( sc, "release non-recursive lock" );
0142
0143 sc = rtems_semaphore_release (semnorec);
0144 directive_failed( sc, "re-release non-recursive lock" );
0145
0146 sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
0147 directive_failed( sc, "obtain non-recursive lock" );
0148
0149 sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
0150 if (sc == RTEMS_SUCCESSFUL) {
0151 printf(
0152 "%d: Reobtain non-recursive-lock semaphore -- and should not have.\n",
0153 __LINE__
0154 );
0155 } else if (sc != RTEMS_UNSATISFIED) {
0156 printf(
0157 "%d: Reobtain non-recursive-lock semaphore failed, but error is "
0158 "%d (%s), not RTEMS_UNSATISFIED.\n",
0159 __LINE__,
0160 sc,
0161 rtems_status_text (sc)
0162 );
0163 }
0164
0165 sc = rtems_semaphore_release (semnorec);
0166 directive_failed( sc, "release non-recursive lock" );
0167
0168 sc = rtems_semaphore_release (semnorec);
0169 directive_failed( sc, "rerelease non-recursive lock" );
0170
0171 sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
0172 directive_failed( sc, "obtain non-recursive lock" );
0173
0174
0175
0176
0177
0178 then = rtems_clock_get_ticks_since_boot();
0179 sc = rtems_semaphore_obtain (semnorec, RTEMS_WAIT, 5);
0180 now = rtems_clock_get_ticks_since_boot();
0181 if (sc == RTEMS_SUCCESSFUL) {
0182 printf(
0183 "%d: Reobtain non-recursive-lock semaphore -- and should not have.\n",
0184 __LINE__
0185 );
0186 } else if (sc != RTEMS_TIMEOUT) {
0187 printf(
0188 "%d: Reobtain non-recursive-lock semaphore failed, but error is "
0189 "%d (%s), not RTEMS_TIMEOUT.\n",
0190 __LINE__,
0191 sc,
0192 rtems_status_text (sc)
0193 );
0194 }
0195 if ((then - now) < 4) {
0196 printf(
0197 "%d: Reobtain non-recursive-lock semaphore failed without timeout.\n",
0198 __LINE__
0199 );
0200 }
0201
0202 startTask (semnorec);
0203 then = rtems_clock_get_ticks_since_boot();
0204 for (i = 0 ; i < 5 ; i++) {
0205 rtems_interval diff;
0206
0207 sc = rtems_semaphore_obtain(
0208 semnorec,
0209 RTEMS_WAIT,
0210 RTEMS_NO_TIMEOUT
0211 );
0212 now = rtems_clock_get_ticks_since_boot();
0213 diff = (now - then);
0214 then = now;
0215 if (sc != RTEMS_SUCCESSFUL) {
0216 printf(
0217 "%d: Failed to obtain non-recursive-lock semaphore: %s\n",
0218 __LINE__,
0219 rtems_status_text (sc)
0220 );
0221 } else if (diff < (int) (2 * ticksPerSecond)) {
0222 printf(
0223 "%d: Obtained obtain non-recursive-lock semaphore too quickly -- %"
0224 PRIdrtems_interval " ticks not %" PRIdrtems_interval " ticks\n",
0225 __LINE__,
0226 diff,
0227 (2 * ticksPerSecond)
0228 );
0229 }
0230 }
0231
0232 TEST_END();
0233 rtems_test_exit (0);
0234 }