Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  COPYRIGHT (c) 1989-2011.
0005  *  On-Line Applications Research Corporation (OAR).
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032 
0033 #include <stdio.h>
0034 #include <rtems.h>
0035 #include <rtems/error.h>
0036 
0037 static rtems_id taskId1;
0038 static rtems_id taskId2;
0039 rtems_interval ticksPerSecond;
0040 
0041 #include "system.h"
0042 
0043 static int
0044 isSuspended (rtems_id tid)
0045 {
0046   rtems_status_code sc;
0047 
0048   sc = rtems_task_is_suspended (tid);
0049   if (sc == RTEMS_ALREADY_SUSPENDED)
0050     return 1;
0051   if (sc != RTEMS_SUCCESSFUL)
0052     printf ("rtems_task_is_suspended: %s\n", rtems_status_text (sc));
0053   return 0;
0054 }
0055 
0056 static void
0057 subTask1 (rtems_task_argument arg)
0058 {
0059   rtems_status_code sc;
0060 
0061   rtems_task_wake_after (ticksPerSecond * 3);
0062   sc = rtems_event_send (taskId2, 1);
0063   if (sc != RTEMS_SUCCESSFUL) {
0064     printf ("subTask1 - Can't send event (%d)\n", sc);
0065     rtems_task_suspend (RTEMS_SELF);
0066   }
0067   rtems_task_wake_after (ticksPerSecond * 3);
0068   printf ("subTask1 - Event sent\n");
0069   rtems_task_suspend (RTEMS_SELF);
0070   printf ("subTask1 - Back to task 1\n");
0071   rtems_task_wake_after (ticksPerSecond * 3);
0072   rtems_task_suspend (RTEMS_SELF);
0073 }
0074 
0075 static void
0076 subTask2 (rtems_task_argument arg)
0077 {
0078   rtems_status_code sc;
0079   rtems_event_set ev;
0080 
0081   rtems_task_wake_after (ticksPerSecond * 1);
0082   sc = rtems_event_receive(
0083     1,
0084     RTEMS_WAIT|RTEMS_EVENT_ANY,
0085     RTEMS_NO_TIMEOUT,
0086     &ev
0087   );
0088   if (sc != RTEMS_SUCCESSFUL) {
0089     printf ("subTask2 - Can't receive event (%d)\n", sc);
0090     rtems_task_suspend (RTEMS_SELF);
0091   }
0092   printf ("subTask2 - Task 1 suspended? - should be 0: %d\n",
0093      isSuspended (taskId1));
0094   rtems_task_wake_after (ticksPerSecond * 4);
0095   printf ("subTask2 - Task 1 suspended? - should be 1: %d\n",
0096      isSuspended (taskId1));
0097   rtems_task_resume (taskId1);
0098   printf ("subTask2 - Task 1 suspended? - should be 0: %d\n",
0099      isSuspended (taskId1));
0100   rtems_task_wake_after (ticksPerSecond * 4);
0101   printf ("subTask2 - Task 1 suspended? - should be 1: %d\n",
0102      isSuspended (taskId1));
0103 
0104   TEST_END();
0105   rtems_test_exit( 0 );
0106 }
0107 
0108 static void
0109 createTask (char c, rtems_id *tid)
0110 {
0111   rtems_status_code sc;
0112 
0113   sc = rtems_task_create (rtems_build_name('S','u','b',c),
0114     RTEMS_MAXIMUM_PRIORITY - 1u,
0115     RTEMS_MINIMUM_STACK_SIZE * 4,
0116     RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
0117     RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
0118     tid);
0119   if (sc != RTEMS_SUCCESSFUL) {
0120     printf ("Can't create task (%d)\n", sc);
0121     rtems_task_suspend (RTEMS_SELF);
0122   }
0123 }
0124 
0125 static void
0126 startTask (rtems_id tid, rtems_task_entry entry_point)
0127 {
0128   rtems_status_code sc;
0129 
0130   sc = rtems_task_start (tid, entry_point, 0);
0131   if (sc != RTEMS_SUCCESSFUL) {
0132     printf ("Can't start task (%d)\n", sc);
0133     rtems_task_suspend (RTEMS_SELF);
0134   }
0135 }
0136 
0137 void
0138 task1 (void)
0139 {
0140   ticksPerSecond = rtems_clock_get_ticks_per_second();
0141   createTask ('1', &taskId1);
0142   createTask ('2', &taskId2);
0143   startTask (taskId1, subTask1);
0144   startTask (taskId2, subTask2);
0145   rtems_task_suspend (RTEMS_SELF);
0146 }