2014-01-10 25 views
1

我有下面的C问题: 我有控制SPI总线(作为主站)的硬件模块,让我们把它SPI_control,它有私人(static)读&写入和“公共” Init()WriteRead()功能(对于那些不知道的人,SPI是全双工的,即写总是读总线上的数据)。现在我需要让更高级的levekl模块可以访问某些协议。让我们来看看上层模块TDMAC。它们运行在两个独立的线程中,一个可能不会被另一个线程中断(当它处于事务的中间时,它首先需要完成)。队列中的信号量 - 甚至可能吗?

所以一种可能性我想的,是将一个SPI_ENG inbween模块和SPI_control控制数据流量,知道什么可以被打断,哪些不能 - 它会再转发数据相应地spi_control。但是,可以独立的任务AC & ** TDM谈到spi_control,我可以让他们写信和从某种好看信号量队列?这应该怎么做?

回答

2

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

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

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

1

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

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


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

确保您初始化优先级继承互斥启用,以便在需要时可以进行优先级反转。

+0

互斥锁(及其优先级反转功能)来自哪里? –

+0

@barak manos谢谢,但这不会处理协议中的交易,不得中断以允许完美的转账完成。 – cerr

+0

为什么不呢?任何尝试访问SPI的线程都将被互斥锁阻止,直到拥有互斥锁的当前线程完成。 –

相关问题