DSPLINK DEMO解析之SCALE【转】

来源:互联网 发布:淘宝假冒品牌申诉 编辑:程序博客网 时间:2024/06/05 08:27

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));

0 0
原创粉丝点击