Accessing the serial port with RTEMS

hwulf at et-inf.fho-emden.de hwulf at et-inf.fho-emden.de
Fri Apr 20 12:54:28 UTC 2007


When I print out an error message with perror(),
it says "Too many open files in system"

Why is this?

Thank you very much and kind regards,
  Hank

Quoting hwulf at et-inf.fho-emden.de:

> Hi,
>
> I wanted to access the serial port with RTEMS.
> As RTEMS is compliant to the POSIX standard,
> I thought of using the POSIX functions for it.
>
> But I can't open the serial port with the open()
> function. Does anyone have an advice of what's
> wrong with the code?
>
> Or is there another way to access the serial port?
>
> Thank you very much in advance and kind regards,
>   Hank
>
>
>
> /******************************************************************************
>   *
>   * INCLUDES
>   *
>   *
> ****************************************************************************/
> #include <rtems.h>
> #include <stdio.h>
> #include <string.h>
> #include <unistd.h>
> #include <fcntl.h>
> #include <errno.h>
> #include <termios.h>
>
> /******************************************************************************
>   *
>   * FUNCTION PROTOTYPES
>   *
>   *
> ****************************************************************************/
>
> rtems_task Init(rtems_task_argument argument);
>
> /******************************************************************************
>   *
>   * GLOBAL VARIABLES
>   *
>   *
> ****************************************************************************/
>
> /*
>   *  Keep the names and IDs in global variables so another task can use them.
>   */
>
> /******************************************************************************
>   *
>   * CONFIGURATION INFORMATION
>   *
>   *
> ****************************************************************************/
> #include <bsp.h> /* for device driver prototypes */
>
> #define CONFIGURE_INIT
> #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>
> #define CONFIGURE_MAXIMUM_TASKS             3
> #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES	2
> #define CONFIGURE_MAXIMUM_SEMAPHORES		5
>
> #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>
> #define CONFIGURE_EXTRA_TASK_STACKS         (2 * RTEMS_MINIMUM_STACK_SIZE)
> #define CONFIGURE_MICROSECONDS_PER_TICK	10000
> //#define CONFIGURE_TICKS_PER_TIMESLICE   5
> //#define CONFIGURE_MEMORY_OVERHEAD			1000
> //#define CONFIGURE_EXECUTIVE_RAM_WORK_AREA	1000
> #define CONFIGURE_INIT_TASK_INITIAL_MODES (RTEMS_PREEMPT | \
>                                             RTEMS_NO_TIMESLICE | \
>                                             RTEMS_NO_ASR | \
>                                             RTEMS_INTERRUPT_LEVEL(0))
> #define MAX_ITERATIONS						20
>
> #define _DEBUG_
>
> #include <confdefs.h>
>
> /******************************************************************************
>   *
>   * MACROS
>   *
>   *
> ****************************************************************************/
> /*
>   *  Macro to print an task name that is composed of ASCII characters.
>   *
>   */
>
> #define put_name( _name, _crlf ) \
> 	do { \
> 		rtems_unsigned32 c0, c1, c2, c3; \
> 		\
> 		c0 = ((_name) >> 24) & 0xff; \
> 		c1 = ((_name) >> 16) & 0xff; \
> 		c2 = ((_name) >> 8) & 0xff; \
> 		c3 = (_name) & 0xff; \
> 		putchar( (char)c0 ); \
> 		if ( c1 ) putchar( (char)c1 ); \
> 		if ( c2 ) putchar( (char)c2 ); \
> 		if ( c3 ) putchar( (char)c3 ); \
> 		if ( (_crlf) ) \
> 			putchar( '\n' ); \
> 	} while (0)
>
> /*
>   *  This allows us to view the "Test_task" instantiations as a set
>   *  of numbered tasks by eliminating the number of application
>   *  tasks created.
>   *
>   *  In reality, this is too complex for the purposes of this
>   *  example.  It would have been easier to pass a task argument. :)
>   *  But it shows how rtems_id's can sometimes be used.
>   */
>
> #define task_number( tid ) \
> 	( rtems_get_index( tid ) - \
> 		rtems_configuration_get_rtems_api_configuration()->number_of_initialization_tasks
> )
>
>
> #include <stdio.h>
>
> /*
>   *  Keep the names and IDs in global variables so another task can use them.
>   */
>
> /******************************************************************************
>   * Shared data. Use them with semaphores only!
>   * Task1_postbox is protected by semaphore with ID 0,
>   * Task2_postbox is protected by semaphore with ID 1.
>   *
> ****************************************************************************/
>
>
>
> /******************************************************************************
>   *
>   * INIT
>   *
>   *
> ****************************************************************************/
> rtems_task Init(rtems_task_argument argument)
> {
> 	rtems_status_code status;
> 	int fd = 0;
> 	struct termios options;
>
> 	/* open the serial port */
> 	fd = open("\\\\.\\CNCA0", O_RDWR | O_NOCTTY | O_NONBLOCK);
> 	if(fd == -1)
> 		printf("Could not open serial port \\.\CNCA0.\n");
> 	else
> 		fcntl(fd, F_SETFL, 0);
>
> 	/* get the current options */
> 	tcgetattr(fd, &options);
>
> 	/* setting the baud rate */
> 	cfsetispeed(&options, B19200);
> 	cfsetospeed(&options, B19200);
>
> 	/* set raw input, 1 second timeout */
> 	options.c_cflag |= (CLOCAL | CREAD);
>
> 	/* 8N1, no parity */
> 	options.c_cflag &= ~PARENB;
> 	options.c_cflag &= ~CSTOPB;
> 	options.c_cflag &= ~CSIZE;
> 	options.c_cflag |= CS8;
>
> 	options.c_cflag &= ~(CRTSCTS);			/* no hardware flow control */
> 	options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
> 	options.c_oflag &= ~(OPOST);
> 	options.c_cc[VMIN] = 0;
> 	options.c_cc[VTIME] = 10;
>
> 	/* set the options */
> 	tcsetattr(fd, TCSANOW, &options);
>
> 	if(write(fd, "ATZ\r", 4) < 0)
> 		printf("write() of 4 bytes failed!\n");
>
> 	exit(0);
> }
>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.com
> http://rtems.rtems.org/mailman/listinfo/rtems-users
>






More information about the users mailing list