DSPLINK DEMO解析之SCALE【转】

SCALE 示例阐明了在DSP/BIOS LINK 的数据流和信息的组合,实现了GPP端和DSP端任务间的数据传递,还从GPP端发送信息到DSP端。

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

SCALE_BufferSize = DSPLINK_ALIGN (SCALE_Atoi (strBufferSize),DSPLINK_BUF_ALIGN) ;  //验证数据缓冲区大小

status = SCALE_Create (dspExecutable,strBufferSize,strNumIterations,processorId) ;

    --------PROC_setup()

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

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

      --------status = PROC_load (processorId, dspExecutable, numArgs, args) ;

    -------- status = CHNL_create (processorId, CHNL_ID_OUTPUT, &chnlAttrOutput) ;  //创建一个到DSP的channel

    -------- status = CHNL_create (processorId, CHNL_ID_INPUT, &chnlAttrInput) ;    //创建一个来自DSP的channel

    --------status = CHNL_allocateBuffer (processorId,CHNL_ID_OUTPUT,SCALE_Buffers,SCALE_BufferSize , 1) ;  //为发送数据到DSP端分配缓冲区

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

    --------status = MSGQ_transportOpen (processorId, &mqtAttrs) ;    //打开远程传输

status = SCALE_Execute (SCALE_NumIterations, processorId) ;

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

    --------SCALE_IOReq.buffer = SCALE_Buffers [0] ;    //填充 IO 请求结构

        SCALE_IOReq.size = SCALE_BufferSize ;

    --------用有效数据初始化缓冲:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if  (DSP_SUCCEEDED (status)) {
            ptr8  = (Uint8 *)  (SCALE_IOReq.buffer) ;
            ptr16 = (Uint16 *) (SCALE_IOReq.buffer) ;
            for  (   (j = 0) ;
                    (DSP_SUCCEEDED (status))
                 && (j < SCALE_BufferSize / DSP_MAUSIZE) ;
                     j++ ) {
                if  (DSP_MAUSIZE == 1) {
                    *ptr8 = XFER_CHAR ;
                    ptr8++ ;
                }
                else  if  (DSP_MAUSIZE == 2) {
                    *ptr16 = XFER_CHAR ;
                    ptr16++ ;
                }
            }
        }

    --------status = CHNL_issue (processorId, CHNL_ID_OUTPUT, &SCALE_IOReq) ;    //向DSP发送数据

    --------status = CHNL_reclaim (processorId,CHNL_ID_OUTPUT,WAIT_FOREVER,&SCALE_IOReq) ; //从channel回收空缓冲

      --------status = CHNL_issue (processorId, CHNL_ID_INPUT, &SCALE_IOReq) ;  //从DSP端接收数据

    --------status = CHNL_reclaim (processorId,CHNL_ID_INPUT,WAIT_FOREVER,&SCALE_IOReq) ; //从channel回收填充缓冲

    --------status = SCALE_VerifyData (SCALE_IOReq.buffer) ;

    --------SCALE_XferValue++ ;      //改变换算系数

        status = MSGQ_alloc (POOL_makePoolId(processorId, SAMPLE_POOL_ID),APP_MSG_SIZE,(MSGQ_Msg *) &msg) ;

    --------MSGQ_setMsgId ((MSGQ_Msg) msg, SCALE_REQUEST_MSGID) ;    //发送已经定位的消息

        status = MSGQ_put (SampleDspMsgq, (MSGQ_Msg) msg) ;

    --------- status = MSGQ_release (SampleDspMsgq) ;    //释放消息队列

SCALE_Delete (processorId) ;

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

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

    --------tmpStatus = CHNL_freeBuffer (processorId,CHNL_ID_OUTPUT,SCALE_Buffers,1) ;

    --------tmpStatus = CHNL_delete  (processorId, CHNL_ID_INPUT) ;

    --------tmpStatus = CHNL_delete  (processorId, CHNL_ID_OUTPUT) ;

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

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

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

 

-------------------------------------------DSP端------------------------------------------------

SWI MODE

DSPLINK_init()

status = SWISCALE_create (&info) ;

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

    --------status = DEV_createDevice("/dsplink",&ZCPYDATA_FXNS,(Fxn) &ZCPYDATA_init,&devAttrs) ;  //动态建立IOM驱动

    --------status = DEV_createDevice("/dio_dsplink",&DIO_tskDynamicFxns,NULL,&dioDevAttrs);  //动态建立DIO适配器

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

    --------*infoPtr = MEM_calloc (DSPLINK_SEGID,sizeof (SWISCALE_TransferInfo),DSPLINK_BUF_ALIGN) ;  //分配结构体

    --------初始化 SWICALE 传输信息结构

1
2
3
4
5
6
7
8
if  (status == SYS_OK) {
     info->bufferSize        = xferBufSize ;
     (info->appReadCb).fxn   = readFinishCb ;
     (info->appReadCb).arg   =(Ptr) info ;
      (info->appWriteCb).fxn  = writeFinishCb ;
     (info->appWriteCb).arg  = (Ptr) info ;
     info->scalingFactor     = 1 ;
   }

    --------建立channel 句柄

1
2
3
4
5
6
7
8
9
10
11
GIO_Attrs gioAttrs = GIO_ATTRS ;
   info->gioInputChan = <strong><span style= "color: #006600;" >GIO_create</span></strong> (INPUT_CHANNEL,
                                 IOM_INPUT,
                                 NULL,
                                 NULL,
                                 &gioAttrs) ;
   info->gioOutputChan = <strong><span style= "color: #006600;" >GIO_create</span></strong> (OUTPUT_CHANNEL,
                                  IOM_OUTPUT,
                                  NULL,
                                  NULL,
                                  &gioAttrs) ;

    ------为发送和接收数据新建 SWI

1
2
3
4
5
6
7
8
9
10
if  (status == SYS_OK) {
         swiAttrs.fxn        = dataSWI ;
         swiAttrs.arg0       = (Arg) info ;
         swiAttrs.mailbox    = INITIAL_DATA_MAILBOX_VAL ;
         info->swiData = <span style= "color: #006600;" >SWI_create</span> (&swiAttrs) ;
         if  (info->swiData == NULL) {
             status = SYS_EALLOC ;
             SET_FAILURE_REASON (status) ;
         }
     }

        --------调用dataSWI()

        --------处理数据

1
2
3
for  (i = 0 ; i < numMAUs; i++) {
         info->outputBuffer [i] = info->inputBuffer [i] * info->scalingFactor ;
     }

        --------iomStatus = GIO_submit (info->gioInputChan,IOM_READ,info->inputBuffer,&bufSize,&(info->appReadCb)) ;

            //提交一个读取数据请求

        --------iomStatus = GIO_submit (info->gioOutputChan,IOM_WRITE,info->outputBuffer,&numMAUs,&(info>appWriteCb)) ;

            //提交一个写数据请求

    --------为接收消息新建SWI:

1
2
3
4
5
6
7
8
9
10
f (status == SYS_OK) {
         swiAttrs.fxn        = msgSWI ;
         swiAttrs.arg0       = (Arg) info ;
         swiAttrs.mailbox    = INITIAL_MSG_MAILBOX_VAL ;
         info->swiMsg = <span style= "color: #006600;" >SWI_create</span> (&swiAttrs) ;
         if  (info->swiMsg == NULL) {
             status = SYS_EALLOC ;
             SET_FAILURE_REASON (status) ;
         }
     }

        --------调用msgSWI:

        --------status = MSGQ_get (info->msgqQueue, &msg, 0) ;

        --------if (MSGQ_getMsgId (msg) == SCALE_REQUEST_MSGID) {

            info->scalingFactor = ((SCALE_ScaleMsg *) msg)->scalingFactor ;

        --------MSGQ_free (msg) ;

    --------status = POOL_alloc (SAMPLE_POOL_ID,(Ptr *) &(info->inputBuffer),info->bufferSize) ;  //分配输入缓冲

    --------status = POOL_alloc (SAMPLE_POOL_ID,(Ptr *) &(info->outputBuffer),info->bufferSize) ;  //分配输出缓冲

    --------msgqAttrs.notifyHandle = info->swiMsg;

        msgqAttrs.post = (MSGQ_Post) SWI_post ;

        msgqAttrs.pend = NULL ;

    --------status = MSGQ_open (DSP_MSGQNAME, &info->msgqQueue, &msgqAttrs) ;  //建立消息队列

status = SWISCALE_execute (info) ;

    --------iomStatus = GIO_submit (info->gioInputChan,IOM_READ,info->inputBuffer,&bufSize,&(info->appReadCb)) ;//提交读请求

    --------SWI_andn (info->swiData, WRITE_MAILBOX_MASK) ;  //因为没有首次填写所以清除软件中断(SWI)邮箱写位

因为SWI 应用程序会一直运行,所以没有进行SWISCALE_delete()

TSK MODE

DSPLINK_init()

status = TSKSCALE_create (&info);

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

    --------status = DEV_createDevice("/dsplink",&ZCPYDATA_FXNS,(Fxn) &ZCPYDATA_init,&devAttrs) ;  //f动态创建IOM驱动

    --------status = DEV_createDevice("/dio_dsplink",&DIO_tskDynamicFxns,NULL,&dioDevAttrs);  //动态创建DIO适配器

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

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

    --------填充传输信息结构体:

1
2
3
4
info->numTransfers  = numTransfers ;
         info->bufferSize    = xferBufSize ;
         info->numBuffers    = 1 ;
         info->scalingFactor = 1 ;

    --------用于创建数据流的属性

1
2
3
4
5
6
attrs.nbufs   = info->numBuffers ;
         attrs.segid   = DSPLINK_SEGID ;
         attrs.align   = DSPLINK_BUF_ALIGN ;
         attrs.flush   = TRUE ;
         attrs.model   = SIO_ISSUERECLAIM ;
         attrs.timeout = SYS_FOREVER ;

    --------info->inputStream = SIO_create (INPUT_CHANNEL,SIO_INPUT,info->bufferSize,&attrs);  //创建输入输出流

    --------info->outputStream = SIO_create (OUTPUT_CHANNEL,SIO_OUTPUT,info->bufferSize,&attrs) ;

    --------status = POOL_alloc (SAMPLE_POOL_ID,(Ptr *) &(info->buffer),info->bufferSize) ; //为将会用到的传输分配一个缓冲

    --------SEM_new (&(info->notifySemObj), 0) ;    //设置信号量

    --------为这个消息队列填充属性值:

1
2
3
msgqAttrs.notifyHandle = &(info->notifySemObj) ;
         msgqAttrs.pend         = (MSGQ_Pend) SEM_pendBinary ;
         msgqAttrs.post         = (MSGQ_Post) SEM_postBinary ;

    --------status = MSGQ_open (DSP_MSGQNAME, &info->msgqQueue, &msgqAttrs) ;  //创建消息队列

status = TSKSCALE_execute (info);

    --------status = SIO_issue (info->inputStream,buffer,info->bufferSize,arg) ;  //从GPP端接收数据  

    --------nmadus = SIO_reclaim (info->inputStream,(Ptr *) &buffer,&arg) ;

    -------- status = MSGQ_get (info->msgqQueue, &msg, 0) ;

    --------if (MSGQ_getMsgId (msg) == SCALE_REQUEST_MSGID) {

        info->scalingFactor = ((SCALE_ScaleMsg *)msg)->scalingFactor ;
        }

    --------MSGQ_free (msg) ;

    --------if (status == SYS_OK) {      //处理缓冲数据

        for (j = 0 ; (j < info->receivedSize) && (status == SYS_OK); j++) {

        buffer [j] *= info->scalingFactor ;
        }
        }

    --------status = SIO_issue (info->outputStream,buffer,info->receivedSize,arg) ;  //把处理后的数据返回给GPP

    --------nmadus = SIO_reclaim (info->outputStream,(Ptr *)&(buffer),&arg) ;

status = TSKSCALE_delete (info);

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

    --------funcStatus = SIO_delete(info->inputStream);

    --------funcStatus = SIO_delete(info->outputStream);

    -------- POOL_free (SAMPLE_POOL_ID, info->buffer, info->bufferSize) ;

    -------- freeStatus = MEM_free(DSPLINK_SEGID, info, sizeof (TSKSCALE_TransferInfo));

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值