File indexing completed on 2025-05-11 08:24:45
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
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 }