c - 在信号量中排队 - 甚至可能吗?

标签 c multiprocessing message-queue semaphore vxworks

我有以下 C 问题: 我有一个控制 SPI 总线的硬件模块(作为主控),我们称它为 SPI_control,它具有私有(private)(static)读写和“公共(public)”Init()WriteRead() 函数(对于那些不知道的人,SPI 是全双工的,即 Write 总是读取总线上的数据)。现在我需要让包含某些协议(protocol)的更高级别的模块可以访问它。让我们调用上面的模块TDMAC。它们在两个独立的线程中运行,并且一个线程可能不会被另一个线程中断(当它处于事务中间时,它首先需要完成)。

所以我想到的一种可能性是在模块和控制数据流的 SPI_control 中加入一个 SPI_ENG 并知道什么可以中断,什么不能- 然后它将数据相应地转发到 spi_control。但是独立任务AC & **TDM 可以与spi_control 通信吗,我可以让它们写入和读取某种ok 信号量队列吗?这应该如何完成?

最佳答案

它不完全清楚你正在尝试做什么,但一个通用的解决方案是你的两个进程(AC 和 TDM)可以在它们自己单独的输出队列中写入数据。第三个进程可以充当调度程序并从这些队列中交替读取并写入 HW (SPI_control)。这可能是您正在寻找的,因为队列还将充当弹性缓冲区来处理突发事务。 这样您就不必担心 AC 会抢占 TDM,Mutex 不需要同步对 SPI_Control 的访问。

内核中的队列是使用内核信号量实现的。队列是由内核信号量保护的内存数组。

我要做的是为调度程序任务创建一个控制消息队列。所以现在系统将有 3 个队列。 2 个用于 AC、TDM 进程的数据输出队列和一个用于调度程序任务的控制队列。在系统启动期间,调度程序任务将在 AC 和 TDM 之前启动,并在其控制队列中挂起。 AC 和 TDM 进程应该在它们的队列变为非空 (msgQNumMsgs()) 时通过控制队列向调度程序任务发送“数据可用”消息。收到此消息后,调度程序任务应开始从特定队列读取数据,直到它为空并再次挂起在控制队列上。我上次使用 vxworks(2004) 时,它有一个平面内存模型,其中所有任务都可以访问所有全局变量。是这样吗?如果是,那么您可以使用全局变量在任务之间传递队列 ID。

关于c - 在信号量中排队 - 甚至可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21056672/

相关文章:

Python 多处理,需要给出额外的参数

c - msgget() 和 ftok() 出错

c++ - 在 C 和 C++ 中通过 index[array] 访问数组

c - 是否有用于 C 程序的静态不变发现工具?

python - 使用不同数量的核心进行多处理时,将结果保存到磁盘会导致不同大小的对象

python - 提高 python dblquad 和多处理的速度

objective-c - 编译 zeroMQ (0MQ) 在 iPhone 上使用

c - 消息队列 : Bug with receiving

c - 如何使用数组的元素?

c - 如何转义字符串中的字符并显示转义的字符?