On Thu, Mar 17, 2022 at 6:24 PM Tim <t...@jti.uk.com.invalid> wrote:

> Just a "thumbs up" from me if you do this (or find something that exists
> that'll do it) - it's a perfect fit for my current project :)
>
>
So the update matches your expectation, please watch github PR
notification, we will upstream the patch after two/three weeks.


> >-----Original Message-----
> >From: Matthew Trescott <matthewtresc...@gmail.com>
> >Sent: 17 March 2022 05:55
> >To: dev@nuttx.apache.org
> >Subject: Abstract "channels" driver model
> >
> >Hi everyone,
> >
> >I was thinking about how to implement the software for my project (control
> >module for a Formula SAE car) and realized that the basic ADC driver
> model is
> >a bit inconvenient and creates a lot of extra overhead in userspace
> threads
> >when implementing advanced features. Some features I think would make
> >sense in an abstract “channels” driver model that would benefit many
> controls
> >applications:
> >
> >- Only wake up a thread when a value has changed "significantly."
> >
> >- Support channels generated from bilinear/bicubic interpolation using a
> table.
> >
> >- Share the same ADC values among multiple threads with different
> priorities,
> >like a high-priority safing algorithm, a medium priority control
> algorithm, and a
> >low-priority CAN broadcast thread.
> >
> >- Share the same ADC values among threads with different needs—the three
> >listed above only care about the latest value, while a datalogging thread
> that
> >saves to flash memory would want to save data in chunks.
> >
> >- Implement software filters and allow binding to userspace control
> algorithms
> >for Kalman filtering.
> >
> >- Allow different threads to subscribe to epoll events at different rates.
> >
> >- Allow data received via an offboard, runtime-configurable serial bus
> like CAN
> >or UART to be assigned a meaningful name and seamlessly used for userspace
> >control functions just like ADC measurements, with a userspace helper
> thread
> >de-serializing the messages as they arrive.
> >
> >- Allow the application to wait for two or more channels to be consistent.
> >
> >- Avoid unnecessary copies and support ADC DMA transfers.
> >
> >~~~~~~~~
> >The model I have in mind is something like this:
> >
> >- Channels are char-devices; e.g. /dev/channels/throttle-position-1
> >
> >- A userspace application that only cares about the latest measurement
> would
> >do something like this to get a pointer that always points to the latest
> channel
> >value and avoid the overhead of read():
> >
> >    uint32_t *throttle_position_1;
> >    int tps1_fd;
> >    tps1_fd = open("/dev/channels/throttle-position-1");
> >    ioctl(tps1_fd, CHANIOC_SUBSCRIBE, (unsigned
> long)&throttle_position_1);
> >    ioctl(tps1_fd, CHANIOC_SET_FILTER, ...);
> >    poll(...);
> >    // Do some calculations with *throttle_position_1
> >    // Drive some output
> >
> >- A periodic userspace task that works with bulk data would read() from
> the
> >ring buffer, or get a pointer to the ring buffer with an ioctl (not sure
> which
> >would be better)
> >
> >- New data is copied to the ring buffer in the low- or high-priority work
> queue.
> >
> >- Boardctl or board-init logic is responsible for setting up special ADC
> triggering
> >(e.g. from a PWM module) and telling the ADC backend driver to register
> itself
> >as a channel. DMA can be set up so that ADC measurements are directly
> >copied to the "latest value" location if no filtering or conversion is
> needed.
> >
> >- Software-generated channels are created with a syscall; the userspace
> >thread can write to the resulting char device and the data will be stored
> in the
> >ring buffer and wake up any threads waiting on the software-defined
> >channel.
> >
> >~~~~
> >
> >Looking for prior art, I noticed that there are the Common Sensor Register
> >Interace and Sensor Cluster Driver Interface (drivers/sensors/README.txt).
> >However, these don't cover ADCs or address the overhead of having a
> >multiple-input control thread needing to use both epoll() and read(). Nor
> do
> >they support filtering or multiple userspace threads accessing the same
> >sensor in a convenient way.
> >
> >However, something like this might already exist, just not in mainline
> NuttX. If
> >you know of such a thing or have feedback on this idea, please let me
> know.
> >Otherwise, I'll move ahead with working on it.
> >
> >Best regards,
> >Matt
>
>

Reply via email to