我有以下C问题:
我有一个控制SPI总线的硬件模块(作为主设备),让我们称之为 SPI_control ,它是私有的(static
)读取&写和"公共" Init()
和WriteRead()
函数(对于那些不知道的人来说,SPI是全双工的,即写总是读取总线上的数据)。现在,我需要使用包含某些协议的更高级别的模块。让上层模块 TDM 和 AC 。它们在两个独立的线程中运行,一个可能不被另一个线程中断(当它在事务的中心时,它首先需要完成)。
我想到的一个可能性是在模块和 SPI_control 之间加入一个 SPI_ENG 来控制数据流,知道什么可以被中断,什么可以&#39 ; t - 然后它会相应地将数据转发到 spi_control 。但是,hwo可以独立完成任务 AC& ** TDM 与 spi_control 交谈,我可以让他们写一些ok信号量队列吗?应该怎么做?
答案 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);
}
确保在启用优先级继承的情况下初始化互斥锁,以便它可以在需要时执行优先级倒置。