This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 09ab135d2f sensor: Fixed the problem of user information lag in
cross-core communication "stublist".
09ab135d2f is described below
commit 09ab135d2ffd867fbb7a1473a9cabca1f5c16580
Author: likun17 <[email protected]>
AuthorDate: Thu Jan 11 18:29:32 2024 +0800
sensor: Fixed the problem of user information lag in cross-core
communication "stublist".
When its remote core publishes a message, all subscribed cores will receive
the message,
but the local core "stublist" does not update the user's "generation" and
"bufferpos" parameters.
Signed-off-by: likun17 <[email protected]>
---
drivers/sensors/sensor.c | 50 ++++++++++++++++++++++++++++++++----------
drivers/sensors/sensor_rpmsg.c | 18 +++++++++++++++
2 files changed, 57 insertions(+), 11 deletions(-)
diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c
index 999064fab6..5b812a88f3 100644
--- a/drivers/sensors/sensor.c
+++ b/drivers/sensors/sensor.c
@@ -456,9 +456,17 @@ static ssize_t sensor_do_samples(FAR struct
sensor_upperhalf_s *upper,
if (user->state.interval == UINT32_MAX)
{
- ret = circbuf_peekat(&upper->buffer,
- user->bufferpos * upper->state.esize,
- buffer, len);
+ if (buffer != NULL)
+ {
+ ret = circbuf_peekat(&upper->buffer,
+ user->bufferpos * upper->state.esize,
+ buffer, len);
+ }
+ else
+ {
+ ret = len;
+ }
+
user->bufferpos += nums;
circbuf_peekat(&upper->timing,
(user->bufferpos - 1) * TIMING_BUF_ESIZE,
@@ -506,9 +514,17 @@ static ssize_t sensor_do_samples(FAR struct
sensor_upperhalf_s *upper,
((user->state.generation + user->state.interval) << 1);
if (delta >= 0)
{
- ret += circbuf_peekat(&upper->buffer,
- (pos - 1) * upper->state.esize,
- buffer + ret, upper->state.esize);
+ if (buffer != NULL)
+ {
+ ret += circbuf_peekat(&upper->buffer,
+ (pos - 1) * upper->state.esize,
+ buffer + ret, upper->state.esize);
+ }
+ else
+ {
+ ret += upper->state.esize;
+ }
+
user->bufferpos = pos;
user->state.generation += user->state.interval;
if (ret >= len)
@@ -701,7 +717,7 @@ static ssize_t sensor_read(FAR struct file *filep, FAR char
*buffer,
FAR struct sensor_user_s *user = filep->f_priv;
ssize_t ret;
- if (!buffer || !len)
+ if (!len)
{
return -EINVAL;
}
@@ -709,6 +725,11 @@ static ssize_t sensor_read(FAR struct file *filep, FAR
char *buffer,
nxrmutex_lock(&upper->lock);
if (lower->ops->fetch)
{
+ if (buffer == NULL)
+ {
+ return -EINVAL;
+ }
+
if (!(filep->f_oflags & O_NONBLOCK))
{
nxrmutex_unlock(&upper->lock);
@@ -738,11 +759,18 @@ static ssize_t sensor_read(FAR struct file *filep, FAR
char *buffer,
}
else if (lower->persist)
{
- /* Persistent device can get latest old data if not updated. */
+ if (buffer == NULL)
+ {
+ ret = upper->state.esize;
+ }
+ else
+ {
+ /* Persistent device can get latest old data if not updated. */
- ret = circbuf_peekat(&upper->buffer,
- (user->bufferpos - 1) * upper->state.esize,
- buffer, upper->state.esize);
+ ret = circbuf_peekat(&upper->buffer,
+ (user->bufferpos - 1) * upper->state.esize,
+ buffer, upper->state.esize);
+ }
}
else
{
diff --git a/drivers/sensors/sensor_rpmsg.c b/drivers/sensors/sensor_rpmsg.c
index 232c2be122..6cf1476f15 100644
--- a/drivers/sensors/sensor_rpmsg.c
+++ b/drivers/sensors/sensor_rpmsg.c
@@ -1132,6 +1132,8 @@ static int sensor_rpmsg_publish_handler(FAR struct
rpmsg_endpoint *ept,
{
FAR struct sensor_rpmsg_data_s *msg = data;
FAR struct sensor_rpmsg_cell_s *cell;
+ FAR struct sensor_rpmsg_stub_s *stub;
+ FAR struct sensor_rpmsg_stub_s *stmp;
FAR struct sensor_rpmsg_dev_s *dev;
size_t written = sizeof(*msg);
@@ -1154,6 +1156,22 @@ static int sensor_rpmsg_publish_handler(FAR struct
rpmsg_endpoint *ept,
}
dev->push_event(dev->upper, cell->data, cell->len);
+
+ /* When the remote core publishes a message, the subscribed cores will
+ * receive the message. When the subscribed core publishes a new
+ * message, it will take away the message published by the remote core,
+ * so all stublist information needs to be updated.
+ */
+
+ sensor_rpmsg_lock(dev);
+ list_for_every_entry_safe(&dev->stublist, stub, stmp,
+ struct sensor_rpmsg_stub_s, node)
+ {
+ file_read(&stub->file, NULL, cell->len);
+ }
+
+ sensor_rpmsg_unlock(dev);
+
written += sizeof(*cell) + cell->len + 0x7;
written &= ~0x7;
}