It's a reasonable function partitioning. How about we define an interface like 
syslog_channel_s between note and driver? So we can plug in the different 
transport like syslog.

The correct way to redirect streams within the OS is to use NuttX stream interfaces.  Forget about systlog channels.  That is not relevant here.

NuttX stream interfaces are defined in include/nuttx/streams.h. you would need to create an oustream and "inherits" from struct lib_outstream_s.  There are several examples of custom outstreams in that header file, but you will create a custom one for the ram log.  You will need one that manages the circular ram buffer and whatever other special properties.  Please follow the examples in that header file.

This is the universal way of redirecting byte streams within the OS.  there are many examples since they are used in all cases.  A good example is libs/libc/stdio/lib_libvsprintf.c.  That implements all of the family of printf-like functions including printf, fprintf, dprintf, sprintf, snprintf, asprintf, etc.  It uses an outstream to send the formatted data to the correct recipient:

   int lib_vsprintf(FAR struct lib_outstream_s *stream,
                     FAR const IPTR char *fmt, va_list ap)

Functions like printf, fprintf, dprintf, sprintf, snprintf, asprintf, etc then just setup the outstream instance and call lib_vsprintf().

The architecture should consist of a encoder that converts the sched_note call data to a byte stream by serializing/marshaling a packed data structure.  It should then use a global outstream to send the data.  Each "client" of the encoder should provide the global outstream and handle the data sent to "client" byte-by-byte.  The syslog is only one of many possible "clients" for the encoded data so you should not focus on that.

The byte-by-byte transfer may be too inefficient.  You could come up with a similar interface that transfers multiple bytes of data at a time (the full packed data in one transfer) -- like write() vs fputc().  That will probably be necessary for performance reasons.



Reply via email to