Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:45

0001 /*
0002  *  The license and distribution terms for this file may be
0003  *  found in the file LICENSE in this distribution or at
0004  *  http://www.rtems.org/license/LICENSE.
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    *  Since this task is holding this, this task will block and timeout.
0176    *  Then the timeout error will be returned.
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 }