Accessing the serial port with RTEMS

Joel Sherrill joel.sherrill at oarcorp.com
Fri Apr 20 13:23:14 UTC 2007


hwulf at et-inf.fho-emden.de wrote:
> When I print out an error message with perror(),
> it says "Too many open files in system"
>
> Why is this?
>
>   
Because there are too many open files in the system. :)

The default configuration is for 3 file descriptors -- stdin,
stdout, and stderr.  You need to change the value of this
configuration parameter.

#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 3

Discussed in the documentation here:

http://www.rtems.org/onlinedocs/releases/rtemsdocs-4.7.1/share/rtems/html/c_user/c_user00389.html

--joel
> 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
>>
>>     
>
>
>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.com
> http://rtems.rtems.org/mailman/listinfo/rtems-users
>   




More information about the users mailing list