From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gary Thomas To: Wolfram Kattanek Cc: ecos-discuss@sourceware.cygnus.com Subject: Re: [ECOS] cyg_io_write & printf Date: Wed, 07 Feb 2001 06:38:00 -0000 Message-id: <3A815DE6.8D4BF0E6@cambridge.redhat.com> References: <981545501.3a81321da0c3e@imp.imms.de> X-SW-Source: 2001-02/msg00103.html Wolfram Kattanek wrote: > Hello, > > I'm playing a little bit with the serial driver functions and came across some > weird phenomena. Can anyone shed some light on the following questions? > > My platform is ARM AEB-1 revision C with one serial port. I'm working with CVS > sources on a linux host. I configured eCos in the following way: default aeb > template; enabled CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL, CYGPKG_IO_SERIAL_DEVICES > and CYGPKG_IO_SERIAL_TTY_TTY1; changed CYGHWR_HAL_ARM_AEB_REVISION to "C". > > My test program is: > > #include > #include > #include > #include > > void cyg_user_start(void) > { > cyg_uint32 length; > Cyg_ErrNo error; > char test_msg1[]="This is a test message!\n"; > cyg_io_handle_t serial_port_handle; > > error = cyg_io_lookup("/dev/ser1", &serial_port_handle); > if (error == ENOERR) { > length = strlen(&test_msg1[0]); > cyg_io_write(serial_port_handle, &test_msg1[0], &length); > } > printf("Hello eCos world!\n"); > } > > I compiled and linked it in the usual (eCos) way and downloaded it to > the AEB board using a terminal program (minicom; comm parameters: > 38400 8N1 no Hardware Flow Control and no Software Flow Control). > Then I started the downloaded program using the AEB monitor program > and watched the output inside minicom. > > In the above configuration of the example program I got the following > output: > > ARM Evaluation Board Boot Monitor 0.01 (19 APR 1998) > Press ENTER within 2 seconds to stop autoboot > Boot: download c000 > Ready to download. Use 'transmit' option on terminal emulator to download file. > Loaded file simple_io_sample.ram.bin at address 0000c000, size = 48028 > Boot: go > > AEB-1 eCos > Hello eCos world! > This is a test message! > > The interesting thing about that output is that the cyg_io_write and printf > statements seem to output their messages in the "wrong" order!? > > More interestingly, if I change cyg_user_start to main then the output > becomes really weird: > > AEB-1 eCos > This isHaetest lessalo! eCos world! > > Both outputs seem to be mixed! The output changes a little bit if I use tty1 > instead of ser1 or \r\n instead of \n but the mixing won't stop. > This is happening because 'printf()' uses the diagnostic routines, which use polling The 'cyg_io_write()' uses interrupts to drive the port. Thus, once the 'printf()' starts, all characters will be displayed at once. The 'cyg_io_write()' relies on interrupts to drive the process. Getting mixed output is certainly to be expected. > > So here are my questions: > > - Why is the behavior so different when using main or cyg_user_start? It depends on when interrupts get enabled. > > - Is it possible to use both cyg_io_write and printf when only one physical > serial port is available? Yes, there is an option to get diagnostic output to basically go through 'cyg_io' > > - Why the statement order does not reflect the output order in the given > example? Toss of a coin. > > - BTW: Is there a config option to turn off the output "AEB-1 eCos"? > I'm pretty sure that this has been removed. Are you using a "release" version or anonymous CVS? > > Any comments are appreciated! > > Thanks, > Wolfram > -- > Wolfram 'L.A.' Kattanek Institut fuer Mikroelektronik- und > Email: LA@imms.de Mechatronik-Systeme (IMMS) gGmbH > Tel: +49 3677 / 6783-55 Langewiesener Str. 22 > Fax: +49 3677 / 6783-38 98693 Ilmenau / Germany > > ------------------------------------------------- > This mail sent through IMP: imp.imms.de