6678DSP核间通信

据我了解应该有3种方式,IPC中断,notify,MessageQ。

1、IPC中断

1)IPC中断事件号91

2)选择中断向量

#define IPC_VECTID          8

3)中断配置

    Hwi_Params hwiParams;

    /* 中断配置 */
    Hwi_Params_init(&hwiParams);
    hwiParams.arg = (UArg)IPC_VECTID;
    hwiParams.eventId = 91;
    hwiParams.enableInt = TRUE;
    Hwi_create(IPC_VECTID, (Hwi_FuncPtr)IsrMultiIpc, &hwiParams, NULL);

中断处理函数可以post信号量为后续处理

4)触发IPC中断

IPCGRx寄存器bit0置位触发IPC中断,高28位可以携带信息

/* IPCGR Info */
static volatile UINT iIPCGRInfo[8] =
{
    IPCGR0,
    IPCGR1,
    IPCGR2,
    IPCGR3,
    IPCGR4,
    IPCGR5,
    IPCGR6,
    IPCGR7
};

ERR IpcSendEvent(UINT coreId, UINT payLoad)
{
    *(volatile UINT *)(iIPCGRInfo[coreId]) = (payLoad & 0xfffffff0);

    *(volatile UINT *)(iIPCGRInfo[coreId]) |= 1;

    RET_OK;
}

5)携带信息从IPCARx读取

/* IPCAR Info */
static volatile UINT iIPCARInfo[8] =
{
    IPCAR0,
    IPCAR1,
    IPCAR2,
    IPCAR3,
    IPCAR4,
    IPCAR5,
    IPCAR6,
    IPCAR7
};

UINT IpcGetEvent(UINT coreId)
{
	volatile UINT payLoad;

    payLoad = *(volatile UINT *)(iIPCARInfo[coreId]);

    payLoad = payLoad & 0xfffffff0;

    return payLoad;
}

2、notify

多核通信采用主从方式,core0主,其余从核

1)注册notify事件,主核注册从核notify事件,从核注册主核notify事件

	#define INTERRUPT_LINE      0
    #define EVENTID             10

    if (coreId == DSP_CORE_0)
	{
		for (idx = 1; idx < DSP_CORE_NUM; idx++)
		{
			Notify_registerEvent(idx, INTERRUPT_LINE, EVENTID, (Notify_FnNotifyCbck)IsrMultiNotify, NULL);
		}
	}
	else
	{
		Notify_registerEvent(DSP_CORE_0, INTERRUPT_LINE, EVENTID, (Notify_FnNotifyCbck)IsrMultiNotify, NULL);
	}

注册回调可以post信号量为后续处理

2)notify事件发送

ERR NotifySendEvent(UINT coreId, UINT payLoad)
{
    Notify_sendEvent(coreId, INTERRUPT_LINE, EVENTID, payLoad, TRUE);

    RET_OK;
}

3、IPC or notify 数据发送

IPC 和 notify能发送的数据有限,只能作为核间事件通知。发送数据可以自定义共享队列。

基本思路是通过IPC中断或者notify事件,post信号量通知核间通信事件,读取共享队列获取核间通信数据。

#define SHARE_QUEUE_DEFAULE_LEN		(256)

typedef struct
{
    volatile UINT arg0;
    volatile UINT arg1;
    volatile UINT arg2;
    volatile void *ptr;
}QUEUE_ELE;

typedef struct
{
    volatile UINT wIdx;
    volatile UINT rIdx;
    volatile UINT queueLen;
    volatile QUEUE_ELE ele[SHARE_QUEUE_DEFAULE_LEN];
}SHARE_QUEUE;

共享队列放在4M共享内存,DDR也可以。以上的数据结构只是个范例,arg可以作为cmd控制字,ptr指向核间通信的数据,少量数据可以放在共享内存,大数据放在DDR。

封装共享队列读写接口

BOOL ShareQueuePut(SHARE_QUEUE *pSQ, QUEUE_ELE *ele)
{
    UINT r, w, irq;
    UINT len;
    BOOL bFound = FALSE;

    if(pSQ == NULL || ele == NULL)
    {
        PRT("ShareQueuePut: ERR! pSQ:%x, ele:%x\n",pSQ, ele);
        return FALSE;
    }

    len = pSQ->queueLen ? pSQ->queueLen : SHARE_QUEUE_DEFAULE_LEN;

    r = pSQ->rIdx;
    w = pSQ->wIdx;

    if(FORWARD(w, len) != r)
    {
        memcpy((void *)&pSQ->ele[w], ele, sizeof(QUEUE_ELE));
        pSQ->wIdx = FORWARD(w, len);
        bFound = TRUE;
    }

    return bFound;
}

BOOL ShareQueueGet(SHARE_QUEUE *pSQ, QUEUE_ELE *ele)
{
    UINT r, w, irq;
    UINT len;
    BOOL bFound = FALSE;

    if(pSQ == NULL || ele == NULL)
    {
		PRT("ShareQueueGet: ERR! pSQ:%x, ele:%x\n",pSQ, ele);
        return FALSE;
    }

    len = pSQ->queueLen ? pSQ->queueLen : SHARE_QUEUE_DEFAULE_LEN;

    r = pSQ->rIdx;
    w = pSQ->wIdx;

    if(r != w)
    {
        memcpy(ele, (void *)&pSQ->ele[r], sizeof(QUEUE_ELE));
        pSQ->rIdx = FORWARD(r, len);
        bFound = TRUE;
    }

    return bFound;
}

4、MessageQ

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
光电经纬仪是最早、最广泛应用于飞行器测控领域的光电跟踪测量设备,它 的组成部分包括大地测量光学经纬仪、激光跟踪测量系统、微机控制系统与图像 处理系统组成。光电经纬仪通过记录飞行过程中的目标图像,并测量传动机架的 角度,从而获得目标飞行参数,它在飞行实况记录中发挥重要的作用 [1] 。此外, 它还可以实现迅速定位目标位置和自动跟踪高速目标,已被广泛地应用于诸如航 天发射、飞行器测控等光电测量领域 [1] 。 随着数字图像处理等技术的发展,光电经纬仪由胶片式成像向数字式成像转 变。此外,高帧速率、高分辨率成像传感器技术已被广泛应用于光电经纬仪。这 些给光电经纬仪实时图像处理平台的发展带来新的挑战:复杂图像处理算法的实 现和数据吞吐量的巨大需求 [1-2] 。 DSP 作为一种密集型数据运算与实时信号处理的微处理器,能够很好的满足 复杂图像处理算法、实时性处理的需求。DSP 技术经过多年的发展,被广泛应用 在信号、图像、通信等技术领域,尤其是高性能计算、高速实时图像处理、超大 数据量处理的军用电子领域 [2] 。现今的图像处理平台由于芯片单片运算能力受到 限制,绝大部分使用了多个 DSP + FPGA 的架构,才能勉强实现实时图像处理任 务 [3] 。但是这样的平台带来的困难是显而易见的: 1. 系统结构复杂。采用多片 DSP+FPGA 的架构,系统的整体处理性能受片 DSP 与 FPGA 之DSPDSP通信带宽瓶颈而下降。 2. 系统功耗大。多片 DSP 在单块电路板上的集成度越高,带来了单板整体 功耗的增加和散热的问题,导致单板多片 DSP 整体处理性能的可靠性和稳定性。 3. 系统调试困难。由于系统结构的复杂,导致系统的调试异常的困难。芯 片之的任务分配、数据传输、并行处理非常复杂,使得产品在设计、调试、生 产阶段的难度加大。 本文研究的课题来源于光电经纬仪图像处理平台由多片 DSP 架构升级到多 DSP 架构而提出的系统应用需求。结合实验室的项目情况,本文将重点放在 多 DSP 并行的以下相关技术: 1. DSP+FPGA 架构下图像数据流的设计。光电经纬仪的图像处理系统需要 兼容前端的多种图像输入格式,包括 CameraLink、SDI 以及光纤接口,DSP+FPGA载板搭配不同的子板就可以实现输入的灵活性;此外,DSP+FPGA 图像处理系 统中的高速 SRIO 接口用于图像数据通信。本文在 CameraLink 和 SRIO 这两个关 键接口做了一定的研究工作。 2. 多环境下并行访问共享/外部存储器的性能研究和设计原则分析。多 DSP 中存在多个主设备,包括多个 DSP、多个 EDMA 设备等,它们并行访 问存储器的数据带宽,对于应用程序存储资源的安排、软件结构的设计是至关重 要的。 3. 多 DSP 并行调度方案的研究。多 DSP 图像处理平台,一方面要实 现复杂的图像处理算法,另一方面要满足超大运算量对实时性处理的需求。基于 多的系统应用开发关键的一步,就是选择合适的处理模型实现任务并行调度。 本文将介绍多 DSP 并行调度的几种方案,并以算法实例对主从模型进行分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值