本发明涉及多核dsp处理芯片及嵌入式实时操作技术领域,尤其涉及一种多核dsp处理芯片核间通信系统及其方法。
背景技术:
随着互联网和计算机技术的飞速发展,对中央处理器的性能要求越来越高,体积要求越来越小。以前主要是通过提高处理能力,或增加硬件来提升性能,但随之而来的晶体管的数量也越来越多,体积也会越来越大,这显然不符合实际发展的需求。所以,另外一种提高性能的方式就是使用多核处理器。
在嵌入式开发领域,多核dsp处理器的使用越来越多。顾名思义,多核dsp处理器就是在一个dsp处理芯片上集成两个及以上的处理单元,每个处理单元独立的成为一个核。多核dsp处理器中的每个核可以单独处理独立的任务,而每个核之间也时常需要传递数据信息,这就涉及到核间通信的相关流程。
技术实现要素:
本发明的目的就在于提供一种多核dsp处理芯片核间通信系统及其方法。
本发明的目的是这样实现的:
通过核间转发,打包发送数据,实现核间通信;核间消息传递可以指定一个最大发送长度,然后分条消息逐级进行打包,写入在共享内存区规划好的地址区域,调用ipc中断,统一发送的方式进行;特别是在多核(2个及以上)处理时,该方法能大大简化核间通信的处理流程。
多核处理器中只有主核与上层应用程序进行通信,核与核之间通信时,核间消息采用打包组合,逐级通信的机制;当源核需要发送消息时,将需要发送给目标核的消息放在共享消息区内,然后源核通过中断告知目标核需要传递的任务,在目标核读取中断寄存器中的任务时,即可知道源核标识,从而从对应的共享内存区域中提取消息内容,用于目标核本核的通信处理流程;本发明针对多核处理器中的每一个核,相当于虚拟出两个收发端口,每一个收发端口都可独立的进行操作,且针对每一个收发行为具有统一的操作,遵循全双工模式,在利用多核dsp芯片处理器进行核间消息通信的相关设计时,会大大简化设计和编程的复杂度,具有实用性强,通用性高的特点。
一、多核dsp处理芯片核间通信系统(简称系统)
本系统包括上层应用程序模块,设置有多核处理器模块;
上层应用程序模块和多核处理器模块交互。
所述的多核处理器模块包括第1、2、3、4核;
在第1、2核之间设置有第1核到第2核的共享内存区和第2核到第1核的共享内存区;
在第2、3核之间设置有第2核到第3核的共享内存区和第3核到第2核的共享内存区;
在第3、4核之间设置有第3核到第4核的共享内存区和第4核到第3核的共享内存区;
上列核与核之间通过共享内存区进行消息交互,并遵循全双工和逐级通信原则。
二、多核dsp处理芯片核间通信方法(简称方法)
①在共享内存区域中,细划分出源核与目标核之间共享内存区的地址,长度,且方向唯一;
②在内存中,为每一个核虚拟出两个收发端口,port0与port1,两个端口的数据缓存区域分别msg_buf_port0,msg_buf_port1;
③在源核需要发送消息时,
a、如果是port0发送消息,先检测msg_buf_port0中是否存在需要发送的消息,如果有,则逐一提取并进行打包;然后将需要发送的消息写入指定的共享内存区,同时递减消息队列中数目;
b、如果是port1发送消息,先检测msg_buf_port1中是否存在需要发送的消息,如果有,则逐一提取并进行打包;然后将需要发送的消息写入指定的共享内存区,同时递减消息队列中数目;
④源核将需要传递的目标核标识,以及任务标识,通过ipc中断传递给目标核;
⑤目标核监控到属于自己的任务标识时,则去规划的共享内存区域中读取消息;
⑥目标核接收消息时,
a、如果是port0接收消息,先从对应源核发送的共享内存区域中获取消息,然后进行消息解析,解析完毕后将消息存放在msg_buf_port1消息缓存中,同时递增消息队列中数目;
b、如果是port1接收消息,先从对应源核发送的共享内存区域中获取消息,然后进行消息解析,解析完毕后将消息存放在msg_buf_port0消息缓存中,同时递增消息队列中数目。
本发明具有下列优点和积极效果:
①多核dsp处理器中的核间通信消息可多条一起,采用打包形式发送;
②多核处理中的每一个核只与前核和后一个核进行核间通信,采用逐级转发的形式,能较大简化设计和编程难度,通用性强;
③每一个核虚拟出了两个收发端口,采用消息队列的方式处理,实用性高。
④共享内存区被规划出多个子共享内存区,只供源核与目标核使用,且具有方向性,这样可遵循全双工的通信模式,效率高。
附图说明
图1是本系统的结构方框图(以4核进行释意说明);
图中:
0—上层应用程序模块0
1—多核处理器
10—第1核(主核),
101—第1核port0收发缓存区,
102—第1核ipc中断模块,
103—第1核内程序运行模块,
104—第1核port1收发缓存区;
20—第2核,
201—第2核port0收发缓存区,
202—第2核ipc中断模块,
203—第2核内程序运行模块,
204—第2核port1收发缓存区;
30—第3核,
301—第3核port0收发缓存区,
302—第3核ipc中断模块,
303—第3核内程序运行模块,
304—第3核port1收发缓存区;
40—第4核,
401—第4核port0收发缓存区,
402—第4核ipc中断模块,
403—第4核内程序运行模块,
404—第4核port1收发缓存区。
12—第1核到第2核的共享内存区;
21—第2核到第1核的共享内存区;
23—第2核到第3核的共享内存区;
32—第3核到第2核的共享内存区;
34—第3核到第4核的共享内存区;
43—第4核到第3核的共享内存区。
图2是某一个核进行核间消息发送时的流程图;
图3是某一个核进行核间消息接收时的流程图。
具体实施方式
下面结合附图和实施例详细说明:
一、系统(多核处理器一般为双核、4核或8核,本系统以4核为例进行说明)
1、总体
如图1,本系统包括上层应用程序模块0,设置有多核处理器模块1;
上层应用程序模块0和多核处理器模块1交互。
所述的多核处理器模块1包括第1、2、3、4核10、20、30、40;
在第1、2核10、20之间设置有第1核到第2核的共享内存区12和第2核到第1核的共享内存区21;
在第2、3核20、30之间设置有第2核到第3核的共享内存区23和第3核到第2核的共享内存区32;
在第3、4核30、40之间设置有第3核到第4核的共享内存区34和第4核到第3核的共享内存区43;
上列核与核之间通过共享内存区进行消息交互,并遵循全双工和逐级通信原则。
2、功能块
第1、2、3、4核10、20、30、40的结构相同。
1)第1核10
第1核10包括第1核port0收发缓存区101、第1核ipc中断模块102、第1核内程序运行模块103和第1核port1收发缓存区104;
2)第2核20
第2核20包括第2核port0收发缓存区201、第2核ipc中断模块202、第2核内程序运行模块203和第1核port1收发缓存区204;
3)第3核30
第3核30包括第3核port0收发缓存区301、第3核ipc中断模块302、第3核内程序运行模块303和第3核port1收发缓存区304;
4)第4核40
第4核40包括第4核port0收发缓存区401、第4核ipc中断模块402、第4核内程序运行模块403和第4核port1收发缓存区404。
3、工作机理:
多核处理中的某一个核虚拟出两个收发端口,一个是port0前向收发端口,负责与前一个核进行消息的收发,另外一个是port1后向收发端口,负责与后一个核进行消息的收发。
具体为第1核10的前向收发端口port0的收发缓存区101,与上层应用子程序0进行收发操作;第1核的port0收发缓存区101中的数据,在经过第1核内程序运行模块103处理后,将其分条放置在第1核port1收发缓存区104中,并记录消息缓存区中的数目。
①如果第1核10需要向第2核20发送消息,则会先检查第1核port1收发缓存区104消息队列中是否有消息可发送,如果有,则逐一提取并进行打包,然后将需要发送的消息写入第1核10到第2核20共享内存区12,同时递减消息队列中数目,且会通过ipc中断告知第2核20。
②如果第1核10接受第2核20的消息,第1核10会不断监控第1核ipc中断模块102,当检测到有属于自己的任务标识时,首先读取任务标识号,识别出第2核20,然后在第2核到第1核共享内存区21中获取核间消息,放置在第1核10的第1核port1收发缓存区104中,同时递增port1消息队列中的数目;
同样地,当核第2核20、第3核30、第1核40的port0或者是port1进行消息的收发时,都遵循同样的收发规则。
特别说明,当源核是主核时,其port0端口只负责与上层应用程序0进行通信;当目标核是最后一个核时,即第4核40,其port1不进行核间消息的收发操作。
二、方法
1、某一个核进行核间消息发送时的流程
如图2,某一个核进行核间消息发送时的流程如下:
a、在共享内存区域内,细划分出源核与目标核之间共享内存区的地址、长度,且方向唯一;其次需要根据设置核与核之间传递的任务标识,且源核与目标核具有方向性-s100;
b、源核需要发送消息-s102;
c、判断是port0端口发送还是port1端口发送-s105,
分为两路,第1路为:
a1、如果是port0发送,则判断源核是否为主核-s104,是则发送给上层应用程序-s101,否则进入步骤b1;
b1、判断源核的msg_buf_port0中是否有消息,即cnt0是否>0-s107,是则进入步骤c1,否则为无消息发送-s108;
c1、提取msg_buf_port0中的消息,打包填充到规划的共享消息内存区,并cnt0-1-s110;
d1、判断规划内存区域中所填消息是否达到最大发送长度-s112,是则进入步骤d,否则继续步骤c1;
第2路为:
a2、如果是port1发送,则判断源核是否为最后一个核-s106,是则不做处理-s103,否则进入步骤b2;
b2、判断源核的msg_buf_port1中是否有消息,即cnt1是否>0-s109,是则进入步骤c2,否则为无消息发送-s108;
c2、提取msg_buf_port1中的消息,打包填充到规划的共享消息内存区,并cnt1-1-s111;
d2、判断规划内存区域中所填消息是否达到最大发送长度-s113,是则进入步骤d,否则继续步骤c2;
d、通过ipc中断告知目标核任务标识-s114。
2、某一个核进行核间消息接收时的流程
如图3,某一个核进行核间消息接收时的流程如下
a、目标通过识别ipc中断,发现有属于自己的任务消息-s200;
b、识别源核的id号,目标核接收消息-s201;
c、判断是port0接收消息,还是port1接收消息-s202,
分为两路,第1路为:
a1、如果是port0接收,判断目标核是否为主核-s203,是则接收上层应用程序的消息-s204,再跳转到步骤c1,否则进入步骤b1;
b1、从源核指向目标核的共享内存区域中,提取消息-s205;
c1、进行消息的解码,将解码正确的消息流放置在虚拟的发送端口msg_buf_port1的缓存区中,并msg_cnt1+1;
第2路为:
a2、如果是port1接收,判断目标核是否为最后一个核-s207,是则不做处理-s208,否则进入步骤b2;
b2、从源核指向目标核的共享内存区域中,提取消息-s209;
c2、进行消息的解码,将解码正确的消息流放置在虚拟的发送端口msg_buf_port0的缓存区中,并msg_cnt0+1。