两个CPU之间的复杂队列使用

两个CPU之间的复杂队列使用,c,queue,embedded,message-queue,C,Queue,Embedded,Message Queue,悬崖笔记版本 TI F28377S有两个CPU,一个主CPU和一个辅助CPU(CLA,一次只能执行一个任务,任务不间断)-它们共享RAM的消息区域。当快速向CLA将要发送的大约15个字节(最大32个队列长度)的队列馈送数据时,有时一些字节将永远不会被传输。我认为CPU中断存在一些问题,导致单字节在将它们交给缓冲区时偶尔“丢失” 完整版本 (这是使用TI F28377S,它有一个时钟频率为200 MHz的主CPU和一个以相同速度运行的辅助独立CLA,但一次只能执行一个任务。它们可以共享单向可写变量

悬崖笔记版本 TI F28377S有两个CPU,一个主CPU和一个辅助CPU(CLA,一次只能执行一个任务,任务不间断)-它们共享RAM的消息区域。当快速向CLA将要发送的大约15个字节(最大32个队列长度)的队列馈送数据时,有时一些字节将永远不会被传输。我认为CPU中断存在一些问题,导致单字节在将它们交给缓冲区时偶尔“丢失”

完整版本 (这是使用TI F28377S,它有一个时钟频率为200 MHz的主CPU和一个以相同速度运行的辅助独立CLA,但一次只能执行一个任务。它们可以共享单向可写变量)

我有点困惑于如何完成这个更复杂的任务,包括CLA和队列

一些简单的背景:我有两个主要的CLA任务,第一个(任务1)由ADC转换端触发(它本身由100 kHz的Timer0触发),第二个(任务2)由Timer0本身触发(这是经过多次实验和调整后得出的,因为每当我让Task2比ADC任务运行得更频繁时,ADC任务就永远不会启动——因此我将它们设置为使用相同的间隔,只是交错).Task1工作正常,将ADC结果存储在一个简单的环形缓冲区中,并在完成ISR后在Task1中执行一个简单的计算。第二个主要工作正常

Task2用于切换一些GPIO引脚以与外部设备通信。由于代码的总长度约为100微秒,因此我在每个触发器上使用一个简单的大小写结构来确定是否应该:不执行任何操作、打开代码引脚、打开选通引脚、关闭选通引脚、关闭关闭代码插脚。这样,每次调用任务时,它几乎会在瞬间完成,输出代码是外部设备的适当长度。任务每次使用一个代码,一旦完成,就会尝试从队列中获取另一个代码。如果没有,它只会继续直接通过

现在是棘手的部分。我有两个要求:1)我可以以比任务消耗字节更快的速度向队列末尾添加字节(理论和实践上都非常简单),2)我可以向队列前面添加字节(不替换当前正在传输的字节,只替换队列前面)。第一种功能是发送中短消息(2-20个字符)。这第二种能力是必要的,发送一个字节的任何外部中断进来,尽可能快,甚至在发送消息的中间。我将其设置为,任务每500微秒(约300“开”和约200“关)发送1个字节。这样,如果出现中断消息,将保证在发生后不到1毫秒内收到

目前的工作是:CPU上的一个函数,它接收传入的字节(一次一个字节)并将它们添加到CPU2CLA缓冲区,并增加CPU2CLA长度计数器。每次运行Task2时,它都会检查此队列并从CLAonly缓冲区的前端获取一个字节,增加其自身的缓冲区长度,并标记某个字节已被消耗。当Task2在task ISR之后运行时,它将检查是否消耗了某个字节,并通过从CPU2CLA缓冲区中删除te。目前这个双缓冲区系统没有用于添加到前端的标志,因此它不考虑中断情况

我之前尝试过的是让Task3接收一个字节,该字节被传递给CPU2CLA,并通过Task3和Wait从CPU运行。虽然这种方法在理论上应该同时满足这两个要求,但大约有一半的时间消息的一个或两个字节永远不会被传输(一个字节总是被发送)


CLA任务永远不能被中断,但CPU任务可以。这就是为什么我试图让队列的所有修改只发生在CLA中,这样就不会有不确定的状态可以中断队列修改。

听起来,将高优先级和正常优先级项拆分为单独的缓冲区将是一个非常简单的过程-这里是最优解

它还将确保,如果高优先级项目、正常优先级项目和另一个高优先级项目在消费之前生产,则高优先级项目将在正常优先级项目之前消费

(使用单个缓冲区,这种情况会导致正常优先级项目在第二个高优先级项目之前被消耗。我怀疑这是非常不可取的。)

如果高优先级缓冲区中有一个项目,则下一个将使用该项目。否则,将使用正常优先级缓冲区中的一个项目

两个缓冲区都有一个生产者和一个消费者(因此,SPSC类型),并以简单的先进先出方式进行处理;因此,无锁循环缓冲区实现(对于每个缓冲区)在这里应该可以正常工作


(如果两个缓冲区只有32个字节可用,请考虑先尝试8:24拆分)。“您需要阻止输入。如果这是一个基本问题,需要您将字节发布到队列的前面,那么您肯定是在对传入的字节进行值判断:因此,您的函数正在进行比它们应该做的更多的处理,因此出现了瓶颈。队列现在只有32字节长(已修复)。我的传入函数做一个简单的检查,如果length==max_length,exit(即删除字节),那么在什么前提下将字节发布到队列的前面?数据的必要性如何?你能承受得起失去它吗?如果是这样,当您无法足够快地处理传入数据时,只需重置缓冲区。相同的函数(前面/后面带有布尔标志)。如果已满,则忽略。如果不是,则将所有字节向后移1位,并将新字节移到前面。我应该补充一点