【问题标题】:Queue in Semaphores - even possible?在信号量中排队 - 甚至可能吗?
【发布时间】:2014-01-10 23:57:17
【问题描述】:

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

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

【问题讨论】:

    标签: c multiprocessing message-queue semaphore vxworks


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我会在每个 SPI 操作上简单地使用互斥锁:

      SPI_Read()
      {
          MutexGet(&spiMutex);
          ...
          MutexPut(&spiMutex);
      }
      
      
      SPI_Write()
      {
          MutexGet(&spiMutex);
          ...
          MutexPut(&spiMutex);
      }
      

      确保在启用优先级继承的情况下初始化 Mutex,以便它可以在需要时执行优先级反转。

      【讨论】:

      • 互斥体(及其优先级反转功能)从何而来?
      • @barak manos 谢谢,但这不会处理协议中的事务,这些事务不能被中断以允许正常传输完成。
      • 为什么不呢?任何试图访问 SPI 的线程都将被互斥锁阻塞,直到拥有该互斥锁的当前线程完成。
      • @Robert Harvey:互斥锁是一种操作系统资源。在上面的例子中,一个 VxWorks 操作系统资源。它应该与操作系统(任何操作系统)库一起提供。
      • @barak manos 是的,很好,但是读写可能需要一次性完成,因此我想出了WriteRead() 函数,write 总是执行 阅读。我想我需要阅读有关“优先级反转”以及如何在启用互斥锁的情况下初始化互斥锁的信息,您有方便的链接或示例吗?
      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多