DSPLINK DEMO解析之READWRITE

READWRITE 示例阐明了大缓冲区通过直接读写 DSP 内部 RAM 来进行传输的概念。它实现了在 GPP 端和使用 PROC_Read()和 PROC_Write() API 的 DSP 端以及两个 DSP 端之间的大尺寸数据缓冲器之间的数据与信息的传递和转换。DSP 端应用程序采用 MSGQ 实现了 TSK。

 

------------------------------------------------GPP端----------------------------------------------------

status = RDWR_Create (dspExecutable,strBufferSize,strNumIterations,processorId) 

    -------- status = PROC_setup (NULL) ;

    --------status = PROC_attach (processorId, NULL) ;

    --------status = POOL_open (POOL_makePoolId(processorId, SAMPLE_POOL_ID),&SamplePoolAttrs) ;

    --------status = MSGQ_open (SampleGppMsgqName, &SampleGppMsgq, NULL) ;  //打开GPP端消息队列

    --------status = PROC_load (processorId,(Char8 *) &imageInfo,NUM_ARGS,args) ;

    --------status = PROC_start (processorId) ;

    --------mqtAttrs.poolId = POOL_makePoolId(processorId, SAMPLE_POOL_ID) ;  //打开远程传输

        status = MSGQ_transportOpen (processorId, &mqtAttrs) ;

    --------status = MSGQ_locate (SampleDspMsgqName,&SampleDspMsgq,&syncLocateAttrs) ;  //定位DSP消息队列

status = RDWR_Execute (dspAddress,bufferSize,numIterations,processorId) ;

    --------status = RDWR_AllocateBuffer (bufferSize, (Pvoid *) &bufIn) ;

复制代码
RDWR_AllocateBuffer (IN Uint32 size, OUT Pvoid * buf)
{
    DSP_STATUS status = DSP_SOK ;

    *buf = malloc (size) ;
    if (*buf == NULL) {
        status = DSP_EMEMORY ;
    }

    return status ;
}
复制代码

    --------确定DSP内存区

  View Code

    --------status = PROC_write (processorId, dspAddr2, bufferSize, bufIn) ;

    --------初始化数据为1

  View Code

    --------status = PROC_write (processorId, dspAddr1, bufferSize, bufOut) ;  //写数据到DSP

    --------验证DSP侧数据缓冲是否被写

复制代码
if (DSP_SUCCEEDED (status)) {
            status = MSGQ_alloc (POOL_makePoolId(processorId, SAMPLE_POOL_ID),
                                 APP_MSG_SIZE,
                                 (MSGQ_Msg *) &msg) ;
            if (DSP_SUCCEEDED (status)) {
                /* Set the message id as the scaling factor */
#if (defined (OMAP) && defined (PCPY_LINK)) || defined (WORD_SWAP)
                msg->gppWriteAddr  = WORDSWAP_LONG ((dspAddr1  / DSP_MAUSIZE)) ;
                msg->dspWriteAddr  = WORDSWAP_LONG ((dspAddr2  / DSP_MAUSIZE)) ;
                msg->size          = WORDSWAP_LONG ((bufferSize/ DSP_MAUSIZE)) ;
                msg->scalingFactor = WORDSWAP_LONG (i) ;
#else /* if (defined (OMAP) && defined (PCPY_LINK)) || defined (WORD_SWAP) */
                msg->gppWriteAddr  = (dspAddr1   / DSP_MAUSIZE) ;
                msg->dspWriteAddr  = (dspAddr2   / DSP_MAUSIZE) ;
                msg->size          = (bufferSize / DSP_MAUSIZE) ;
                msg->scalingFactor = i ;
#endif /* if (defined (OMAP) && defined (PCPY_LINK)) || defined (WORD_SWAP) */

                /* Send the message */
                status = MSGQ_put (SampleDspMsgq, (MSGQ_Msg) msg) ;
                if (DSP_FAILED (status)) {
                    RDWR_1Print ("MSGQ_put failed. Status: [0x%x]\n",
                                      status) ;
                }
            }
            else {
                RDWR_1Print ("MSGQ_alloc failed. Status: [0x%x]\n",
                                  status) ;
            }
        
复制代码

    --------等待DSP回发确认数据被写入的消息

  View Code

    -------- status = PROC_read (processorId, dspAddr2, bufferSize, bufIn) ;  //从DSP内存中读取数据

    --------验证回读的数据

  verify the data read back

RDWR_Delete (processorId) ;

    --------status = MSGQ_release (SampleDspMsgq) ;

    --------status = MSGQ_transportClose (processorId) ;

    --------tmpStatus = PROC_stop (processorId) ;

    --------tmpStatus = MSGQ_close (SampleGppMsgq) ;

    -------- tmpStatus = POOL_close (POOL_makePoolId(processorId, SAMPLE_POOL_ID)) ;

    --------tmpStatus = PROC_detach  (processorId) ;

    --------tmpStatus = PROC_destroy () ;

    --------tmpStatus = RDWR_OS_exit () ;

           RDWR_OS_exit

 

------------------------------------------------GPP端----------------------------------------------------

DSPLINK_init()

status = TSKRDWR_create (&info);

    --------status = POOL_open (0, &poolObj) ;

    --------status = MSGQ_transportOpen (ID_GPP, &transport) ;

    --------*infoPtr = MEM_calloc (DSPLINK_SEGID,sizeof (TSKRDWR_TransferInfo),DSPLINK_BUF_ALIGN) ;

    --------GPP端等待DSP打开一个消息队列,DSP首次打开本地消息队列

  View Code

    --------定位GPP的消息队列

  View Code

status = TSKRDWR_execute (info);

    --------等待关于数据缓冲区信息的消息

  View Code

status = TSKRDWR_delete (info);

    -------- status = MSGQ_close (info->dspMsgqQueue) ;

    --------freeStatus = MEM_free(DSPLINK_SEGID, info, sizeof (TSKRDWR_TransferInfo));  //释放信息结构体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值