loop例程中数据流向:
loop.c是实现loop例程的文件。 在LOOP_Main()主函数中调用Loop_Create()、LOOP_Execute()、LOOP_Delete()三个函数来创建执行和删除。 LOOP_Create()中PROC_setup()初始化proc对象,PROC_attach()附加要使用的DSP,随后打开POOL PROC_load() 下载代码到DSP端 status = CHNL_create (processorId, CHNL_ID_OUTPUT, &chnlAttrOutput) ;创建到DSP的channel status = CHNL_create (processorId, CHNL_ID_INPUT, &chnlAttrInput) ; 创建来自DSP的channel
status = CHNL_allocateBuffer (processorId,
temp = LOOP_Buffers [0] ; status = LOOP_Execute (LOOP_NumIterations, processorId) ; 执行数据传输 ----------PROC_start()//让DSP开始运行 ----------status = CHNL_issue (processorId, CHNL_ID_OUTPUT, &LOOP_IOReq) ; //向DSP发送数据,把已经填充好的数据发送到channel
-----------status = CHNL_reclaim (processorId, //回收空缓冲 ………………………………………………DSP端…………………………………………… 在DSP端进行ISR初始化、DSPLINK初始化以后进入SWILOOP_create() SWILOOP_create() ------------DSPLINK_init() ------------status=POOL_open(0,&poolObj) ------------ status = DEV_createDevice("/dsplink", &ZCPYDATA_FXNS, (Fxn) &ZCPYDATA_init, &devAttrs) ; 这一步是动态建立IOM 驱动,这个IOM驱动是什么东西。DSP/BIOS提供了两种设备驱动来使能应用程序与DSP周边进行通信传输:IOM和SIO/DEV。 ---------- status = DEV_createDevice("/dio_dsplink", &DIO_tskDynamicFxns, NULL, &dioDevAttrs);//
上图是在使用DIO 驱动和mini-driver 各个模块的依赖关系。
-------------*infoPtr = MEM_calloc (DSPLINK_SEGID, //为SWILOOP传输信息结构体分配
-------------GIO_Attrs gioAttrs = GIO_ATTRS ; //这一步是创建channel handle 这个GIO又是什么东西呢?GIO模块是DSP/BIOS用于输入输出的模块,它是应用程序和mini-driver的通信基础。DEV模块负责维护系统设备驱动表,GIO模块通过使用函数来获得设备信息,比如说DEV_match。
G IO_create()是分配和初始化GIO对象。应用程序调用GIO_create 来建立GIO_Obj 对象和打开channel 通信。这个函数初始化I/Ochannel ,打开最底层的设备驱动channel。也创建了同步对象并存储在GIO_obj对象里。 ----------- swiAttrs.fxn = loopbackSWI ; //这一段为发送和接收数据创建SWI
swiAttrs.arg0 = (Arg) info ; ----------loopbackSWI()
--------- for (i = 0 ; i < info->readWords ; i++) {//处理数据
--------- iomStatus = GIO_submit (info->gioInputChan, //提交读请求
-------iomStatus = GIO_submit (info->gioOutputChan, GIO_submin()是向mini-driver提交 GIO数据包,成功返回IOM_COMPLETED,如果请求被排列则返回IOM_PENDING。 GIO_write()同步写命令,应用程序使用这个函数写数据到通信channel。
-------- status = POOL_alloc (SAMPLE_POOL_ID, 为输入和输出分配缓冲区 SWILOOP_execute()
----------iomStatus = GIO_submit (info->gioInputChan, 提交读请求 ----------SWI_andn (info->swi, WRITE_MAILBOX_MASK) ; 这是SWI模型中的一个函数,SWI模块是软件中断管理,SWI_andn()是清除软件中断邮箱位,如果值为0则提交,它用于提交一个软件中断, tskLoopTask = TSK_create(tskLoop, NULL, 0); //为TSKLOOP 应用程序创建任务 ----------DSPLINK_init(); ----------TSKLOOP_create() ----------POOL_open() ----------- status = DEV_createDevice("/dsplink", &ZCPYDATA_FXNS, (Fxn) &ZCPYDATA_init, &devAttrs) ; 动态创建IOM驱动 ----------status = DEV_createDevice("/dio_dsplink", &DIO_tskDynamicFxns, NULL, &dioDevAttrs); 动态创建DIO适配器
---------- *infoPtr = MEM_calloc (DSPLINK_SEGID, 分配TSKLOOP_TransferInfo,初始化并传递给其他应用程序参数
-----------
info->numTransfers = numTransfers ; - - - - -待续…… |
|