通知线程传入数据并允许它们访问数据的机制?

Mechanism to notify threads of incoming data and allow them to access it?

提问人:Illya Kuzmych 提问时间:11/18/2023 更新时间:11/18/2023 访问量:21

问:

在Zephyr RTOS上为嵌入式平台编写代码。

为了描绘我试图解决的情况: 我有通过 UART 传入的数据,并且我有一个传入数据的处理程序。我想:

一个。通知所有线程有新数据传入

b.有一种机制,使所有线程都有机会访问此数据。为简单起见,数据存储在全局结构中。

我正在尝试找出一种解决方案,其中线程可以“订阅”或“注册”到特定事件或信号,然后一旦它们意识到新数据进入,它们就可以继续调用一些函数来访问它,其中互斥锁将用于一次将访问的数据锁定到一个线程,并且可能执行 memcpy() 将数据从全局结构复制到线程希望使用的一个。

我尝试了多种解决方案,但似乎坚持这样一个事实,即每次触发事件处理程序时,最多只有一个线程才有机会访问数据。

例如,我使用k_poll和信号提升来表示新数据何时出现。我有多个线程初始化一个使用共享信号的事件。一个线程(可能具有更高的优先级)将始终首先获得访问权限,然后重置信号,从而导致其他线程丢失数据。

我还尝试使用计数信号量。但是,具有最高优先级的线程始终获取数据,而其他线程无法读取数据。

我考虑过制作一个轮询信号的链接列表,然后在新数据出现时迭代它并单独提出每个信号。这样,每个线程都可以依赖于唯一的信号,并能够访问数据。但我担心,在线程有机会读取数据之前,数据可能会被覆盖。

我的问题是,什么是适用于此的实现?

UART 实时操作系统 Zephyr-RTOS

评论

0赞 sawdust 11/18/2023
让多个线程处理从外围设备接收的原始数据是没有意义的。此外,与其争夺对数据/资源的访问权,不如考虑合作方案。例如,将数据/资源从一个线程传递或移交给下一个线程。
0赞 Illya Kuzmych 11/18/2023
我同意。我认为有一个线程负责执行与该特定数据相关的所有进程是有意义的,即使这些进程可能不相关

答: 暂无答案