File indexing completed on 2025-05-11 08:24:47
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 <bsp.h>
0034 #include <tmacros.h>
0035 #include <stdio.h>
0036 #include <sys/types.h>
0037 #include <sys/stat.h>
0038 #include <fcntl.h>
0039 #include <unistd.h>
0040 #include <errno.h>
0041
0042 #include <rtems.h>
0043 #include <rtems/libio.h>
0044
0045 const char rtems_test_name[] = "SPFIFO 3";
0046
0047
0048 rtems_task Init(rtems_task_argument argument);
0049 rtems_task read_task(rtems_task_argument not_used);
0050 void test_main(void);
0051
0052 #define SEND_RCV_BUFSIZ 12
0053 rtems_id Barrier;
0054
0055 rtems_task read_task(rtems_task_argument not_used)
0056 {
0057 int fd = 0;
0058 int status = -1;
0059
0060 char recvBuf_r1[SEND_RCV_BUFSIZ] = {0};
0061 char recvBuf_r2[SEND_RCV_BUFSIZ] = {0};
0062
0063 puts("\nRead task activated, waiting till writer opens");
0064
0065 status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0066 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0067
0068 sleep(1);
0069
0070 puts("\nNow, reader opening file(1)");
0071 fd = open("/tmp/fifo01", O_RDONLY);
0072 if(fd <= 0) {
0073 printf("Error opening file: (%d) :: %s", errno, strerror(errno));
0074 rtems_test_assert(0);
0075 }
0076
0077 status = read(fd, recvBuf_r1, sizeof(recvBuf_r1)-1);
0078 rtems_test_assert(status == sizeof(recvBuf_r1)-1);
0079
0080 printf("\n@ receiver (being a unblocked reader): Got %s", recvBuf_r1);
0081
0082 status = close(fd);
0083 rtems_test_assert(status == 0);
0084
0085 status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0086 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0087
0088 puts("\nReader opening file(2)");
0089 fd = open("/tmp/fifo01", O_RDONLY);
0090 if(fd <= 0) {
0091 printf("Error opening file: (%d) :: %s", errno, strerror(errno));
0092 rtems_test_assert(0);
0093 }
0094
0095 status = read(fd, recvBuf_r2, sizeof(recvBuf_r2)-1);
0096 rtems_test_assert(status == sizeof(recvBuf_r2)-1);
0097
0098 printf("\n@ receiver (being a blocked reader): Got %s", recvBuf_r2);
0099
0100 status = close(fd);
0101 rtems_test_assert(status == 0);
0102
0103
0104 puts("\nReader done!");
0105 status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0106 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0107 rtems_task_exit();
0108 }
0109
0110 void test_main(void)
0111 {
0112
0113 rtems_id readTaskID;
0114
0115 rtems_name readTaskName;
0116
0117 char sendBuf_r1[SEND_RCV_BUFSIZ] = {0};
0118 char sendBuf_r2[SEND_RCV_BUFSIZ] = {0};
0119 int status = -1;
0120 int fd = 0;
0121
0122
0123 strcpy( sendBuf_r1, "SendBuffer1" );
0124 strcpy( sendBuf_r2, "SendBuffer2" );
0125
0126 memset( &Barrier, 0, sizeof(Barrier) );
0127 status = rtems_barrier_create (
0128 rtems_build_name ( 'B', 'A', 'R', 't' ),
0129 RTEMS_BARRIER_AUTOMATIC_RELEASE,
0130 2,
0131 &Barrier
0132 );
0133
0134 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0135
0136 TEST_BEGIN();
0137
0138 puts("\nCreating a task name and a task");
0139 readTaskName = rtems_build_name('T','A','r',' ');
0140
0141 status = rtems_task_create(
0142 readTaskName,
0143 1,
0144 RTEMS_MINIMUM_STACK_SIZE * 2,
0145 RTEMS_DEFAULT_MODES,
0146 RTEMS_DEFAULT_ATTRIBUTES,
0147 &readTaskID
0148 );
0149
0150 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0151
0152 puts("\ncreating directory /tmp");
0153 status = mkdir("/tmp", 0777);
0154 rtems_test_assert(status == 0);
0155
0156 puts("\ncreating fifo file /tmp/fifo01");
0157 status = mkfifo("/tmp/fifo01", 0777);
0158 rtems_test_assert(status == 0);
0159
0160 puts("\nStarting the read task");
0161 status = rtems_task_start(readTaskID, read_task, 0);
0162 rtems_test_assert(status == 0);
0163
0164 status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0165 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0166
0167 puts("\nWriter opening file(1)");
0168 fd = open("/tmp/fifo01", O_WRONLY);
0169 if(fd <= 0) {
0170 printf("Error opening file: (%d) :: %s", errno, strerror(errno));
0171 rtems_test_assert(0);
0172 }
0173
0174
0175 printf("\n@ sender: %s", sendBuf_r1);
0176 status = write(fd, sendBuf_r1, sizeof(sendBuf_r1)-1);
0177 rtems_test_assert(status == sizeof(sendBuf_r1)-1);
0178
0179 status = close(fd);
0180 rtems_test_assert(status == 0);
0181
0182 status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0183 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0184
0185 sleep(1);
0186
0187
0188 puts("\nWriter opening file(2)");
0189 fd = open("/tmp/fifo01", O_WRONLY);
0190 if(fd <= 0) {
0191 printf("Error opening file: (%d) :: %s", errno, strerror(errno));
0192 rtems_test_assert(0);
0193 }
0194
0195 printf("\n@ sender: %s", sendBuf_r2);
0196 status = write(fd, sendBuf_r2, sizeof(sendBuf_r2)-1);
0197 rtems_test_assert(status == sizeof(sendBuf_r2)-1);
0198
0199 status = close(fd);
0200 rtems_test_assert(status == 0);
0201
0202 status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0203 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0204
0205 puts( "Removing the fifo" );
0206 status = unlink("/tmp/fifo01");
0207 rtems_test_assert(status == 0);
0208
0209 puts( "Removing /tmp" );
0210 status = rmdir("/tmp");
0211 rtems_test_assert(status == 0);
0212
0213 TEST_END();
0214 }
0215
0216 rtems_task Init(
0217 rtems_task_argument not_used
0218 )
0219 {
0220 test_main();
0221 rtems_test_exit(0);
0222 }
0223
0224 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0225 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0226
0227 #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 6
0228
0229 #define CONFIGURE_MAXIMUM_TASKS 3
0230
0231 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0232
0233 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0234
0235 #define CONFIGURE_MAXIMUM_BARRIERS 1
0236
0237 #define CONFIGURE_IMFS_ENABLE_MKFIFO
0238
0239 #define CONFIGURE_INIT
0240 #include <rtems/confdefs.h>
0241
0242