diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index f6e64259c..61b4d5e3a 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -567,4 +567,8 @@ * Add poll() and select() APIs (in the initial check-in, these work only with character devices) * Add poll() methods to /dev/null, /dev/zero, pipes, fifos, and serial drivers. * Add examples/poll for testing poll() and select() + * Fix hostile behavior of getc, fgetc, getchar, etc.: the serial driver was waiting for a + full buffer of read data before return. This means that getc would stall when it needed + to refill the input buffer. The old behavior (read full blocks) might be useful in other + contexts, so it is still available within the driver as a configuration option. diff --git a/nuttx/Documentation/NuttX.html b/nuttx/Documentation/NuttX.html index cf3e9603d..24c3a23a3 100644 --- a/nuttx/Documentation/NuttX.html +++ b/nuttx/Documentation/NuttX.html @@ -1203,6 +1203,10 @@ nuttx-0.3.19 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> * Add poll() and select() APIs (in the initial check-in, these work only with character devices) * Add poll() methods to /dev/null, /dev/zero, pipes, fifos, and serial drivers. * Add examples/poll for testing poll() and select() + * Fix hostile behavior of getc, fgetc, getchar, etc.: the serial driver was waiting for a + full buffer of read data before return. This means that getc would stall when it needed + to refill the input buffer. The old behavior (read full blocks) might be useful in other + contexts, so it is still available within the driver as a configuration option. pascal-0.1.3 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> diff --git a/nuttx/TODO b/nuttx/TODO index 3475174be..2f85472e2 100644 --- a/nuttx/TODO +++ b/nuttx/TODO @@ -9,13 +9,14 @@ NuttX TODO List (Last updated November 17, 2008) (1) C++ Support (12) Network (net/, netutils/) (1) USB (drivers/usbdev) - (3) Libraries (lib/) + (4) Libraries (lib/) (6) File system/Generic drivers (fs/, drivers/) (1) Pascal add-on (pcode/) (2) Documentation (Documentation/) (3) Build system (2) NuttShell (NSH) (examples/nsh) (1) Other Applications & Tests (examples/) + (2) Linux/Cywgin simulation (arch/sim) (2) ARM (arch/arm/) (1) ARM/C5471 (arch/arm/src/c5471/) (1) ARM/DM320 (arch/arm/src/dm320/) @@ -230,13 +231,19 @@ o Libraries (lib/) Status: Open Priority: Medium - Description: Buffered C, character-oriented I/O is not very useful when - dealing with a console. The behavior is to read a full buffer - of data then return the individual characters from the buffer. - But that is very hostile when working with a human interface. + Description: fgets implementation does not use C-buffered I/O, but rather + talks to serial driver directly via read(). It includes VT-100 + specific editting commands. This gets should be renamed readlin() + and a more generic fgets() should be implemented. Status: Open - Priority: Medium. Workarounds: Set CONFIG_STDIO_BUFFER_SIZE=0 in the - configuration file. + Priority: Low (unless you are using mixed C-buffered I/O with fgets and + fgetc, for example). + + Description: Need some minimal termios support... at a minimum, enough to + switch between raw and "normal" modes to support behavior like + that needed for readline(). + Status: Open + Priority: Low o File system / Generic drivers (fs/, drivers/) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -318,16 +325,21 @@ o Build system Priority: Low Description: Dependencies do not work correctly under configs//src - (same as arch//src/board). Seems to be worse using SDCC. + (same as arch//src/board). Status: Open Priority: Medium (maybe higher for z80 target) Description: It would be nice to de-couple some of the behaviors enabled by CONFIG_DEBUG. For example, CONFIG_DEBUG turns on debug output, but also disables optimization make the binary much bigger. - Status: Low. There workaround is easy.. just edit the configuration's + Status: Open + Priority: Low. There workaround is easy.. just edit the configuration's Make.def file to control the behavior that you want. - Priority: Very low. + + Description: Need a NuttX configuration tool. The number of configuration + settings has become quite large and difficult to manage manually. + Status: Open + Priority: Medium-low o NuttShell (NSH) (examples/nsh) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -351,6 +363,24 @@ o Other Applications & Tests (examples/) incorrectly on the Cywgin-based simulation platform (but works fine on the Linux-based simulation platform). +o Linux/Cywgin simulation (arch/sim) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Description: Need to implement timing. Use system timing resources to fake + a NuttX real time clock. At present, the timer is driven in + non-realtime (like 1000x realtime) and causes some behavior + differences from real platforms. + Status: Open + Priority: Low (because the simulator is only a test/development platform) + + Description: The simulated serial driver also has some odd behavior. It + will stall for a long time on reads when the C stdio buffers are + being refilled. This only effects the behavior of things like + fgetc(). Workaround: Set CONFIG_STDIO_BUFFER_SIZE=0, suppressing + all C buffered I/O. + Status: Open + Priority: Low (because the simulator is only a test/development platform) + o ARM (arch/arm/) ^^^^^^^^^^^^^^^ diff --git a/nuttx/drivers/serial.c b/nuttx/drivers/serial.c index 2939bf61f..533675886 100644 --- a/nuttx/drivers/serial.c +++ b/nuttx/drivers/serial.c @@ -318,8 +318,9 @@ static ssize_t uart_read(FAR struct file *filep, FAR char *buffer, size_t buflen } } +#ifdef CONFIG_DEV_SERIAL_FULLBLOCKS /* No... then we would have to wait to get receive more data. - * If the user has specified the O_NONBLOCK option, then do not + * If the user has specified the O_NONBLOCK option, then just * return what we have. */ @@ -333,15 +334,36 @@ static ssize_t uart_read(FAR struct file *filep, FAR char *buffer, size_t buflen { recvd = -EAGAIN; } + break; + } +#else + /* No... the circular buffer is empty. Have we returned anything + * to the caller? + */ - /* Break out of the loop and return the number of bytes + else if (recvd > 0) + { + /* Yes.. break out of the loop and return the number of bytes * received up to the wait condition. */ break; - } + } - /* Otherwise we are going to wait */ + /* No... then we would have to wait to get receive some data. + * If the user has specified the O_NONBLOCK option, then do not + * wait. + */ + + else if (filep->f_oflags & O_NONBLOCK) + { + /* Break out of the loop returning -EAGAIN */ + + recvd = -EAGAIN; + break; + } +#endif + /* Otherwise we are going to have to wait for data to arrive */ else { diff --git a/nuttx/examples/README.txt b/nuttx/examples/README.txt index 2d8ea8a2d..2d16b210f 100644 --- a/nuttx/examples/README.txt +++ b/nuttx/examples/README.txt @@ -124,8 +124,7 @@ examples/serloop * CONFIG_EXAMPLES_SERLOOP_BUFIO Use C buffered I/O (getchar/putchar) vs. raw console I/O - (read/read). The behavior of the NuttX getchar() call is - very hostile unless you also set CONFIG_STDIO_BUFFER_SIZE=0. + (read/read). examples/udp ^^^^^^^^^^^^