gpt4 book ai didi

c - 如何在 C 中跨线程进行动态数据传输和内存管理?

转载 作者:太空宇宙 更新时间:2023-11-04 02:20:24 25 4
gpt4 key购买 nike

平台:ARM9

编程语言 C

要求 - 纯 C 语言,没有外部库,也没有提升。

操作系统 - REX RTOS

我有两个线程在嵌入式平台上运行 -

  1. 一个在驱动程序级别处理硬件的所有通信和数据传输。
  2. 第二个线程运行使用数据进出硬件的应用程序。

想法是将应用程序线程与驱动程序线程分离,这样我们就可以更改硬件驱动程序线程中的硬件和实现,但对应用程序线程的影响最小。

我的挑战是从硬件接收到的数据可能是动态的,即我们事先不知道应用程序线程应该为每个进出硬件的请求预留多少内存,因为这是在运行时确定的。

我在想驱动程序线程可以通知应用程序线程有太多数据要读取。应用程序线程然后分配内存并请求驱动程序线程读取数据。然后由应用程序线程相应地处理数据。这样,所有内存管理都在应用程序线程内。

最佳答案

我想到了几个选项:

1) malloc 驱动程序中的内存,在应用程序中释放它。但是......我们倾向于避免在任何接近实时要求的情况下使用 malloc。如果您可以访问 malloc/free,并且没有“实时”问题或内存碎片问题(即您的堆足够大),那么这是一个相当简单的方法。驱动程序只是通过消息队列将分配的指针发送到应用程序线程,应用程序在完成后释放内存。注意内存泄漏。

2) 环形或循环缓冲区。驱动程序完全管理一个固定大小的环形缓冲区,并在缓冲区准备就绪时简单地向应用程序发送消息。有关详细信息,请参见此处:Circular buffer .然后,应用程序通过驱动程序 API 再次将数据标记为“可用”,这有助于对应用程序线程隐藏环形缓冲区的详细信息。我们将这种方法用于我们的一个驱动程序,该驱动程序具有与您描述的非常相似的一组要求。在这种情况下,您需要关注确定环形缓冲区的“最佳”大小、驱动程序中的溢出处理等。

祝你好运!

关于c - 如何在 C 中跨线程进行动态数据传输和内存管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/689514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com