信号量队列 - 甚至可能吗?

时间:2014-01-10 23:57:18

标签: c multiprocessing message-queue semaphore vxworks

我有以下C问题: 我有一个控制SPI总线的硬件模块(作为主设备),让我们称之为 SPI_control ,它是私有的(static)读取&写和"公共" Init()WriteRead()函数(对于那些不知道的人来说,SPI是全双工的,即写总是读取总线上的数据)。现在,我需要使用包含某些协议的更高级别的模块。让上层模块 TDM AC 。它们在两个独立的线程中运行,一个可能不被另一个线程中断(当它在事务的中心时,它首先需要完成)。

我想到的一个可能性是在模块和 SPI_control 之间加入一个 SPI_ENG 来控制数据流,知道什么可以被中断,什么可以&#39 ; t - 然后它会相应地将数据转发到 spi_control 。但是,hwo可以独立完成任务 AC& ** TDM spi_control 交谈,我可以让他们写一些ok信号量队列吗?应该怎么做?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

我只是在每个SPI操作上使用Mutex:

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


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

确保在启用优先级继承的情况下初始化互斥锁,以便它可以在需要时执行优先级倒置。