(七)序列控制

SeqControl:

1提供序列流控制信息

  SeqControl =
command       [string]   Command to control seq. operation (see text).
condition     [string]   Condition for enabling command.
argument      [double]   Command argument
  • 在Event中指定其索引值列表,单个事件最多指定3个SeqControl命令。
  • 以下命令会在事件开始前执行:
  TriggerOut		外部触发
  pause&triggerin		硬件定序器暂停,等待触发输入信号,然后再进行信号发送或接收。
  setRcvProfile		放置在发射/接收间隔的事件中,在该事件开始之前完成到新RcvProfile状态的转换。
  setTPCProfile		TPC转换会在传输结束后开始(next),传输开始前(immediate)

2一些用过的seq命令

  timeToNextAcq 	指定到下一个事件的时间(msec),10-4190000msec,
  setTPCProfile		转换到对应的TPC高压配置序列号,1-4,5为高功率。TPC转换会在传输结束后开始(next),传输开始前(immediate)。
  setRcvProfile		转换到新的RcvProfile
  jump		跳转命令,回到对应事件处
  transferToHost		将采集到的数据传输到主机RcvBuffer中
  returnToMatlab	处理函数暂停执行,返回Matlab环境,
  noop 					进行无操作延时(值*200nsec)
  sync     			同步软件和硬件,可以设置软件等待硬件的时间

3软硬件同步

异步工作

一般系统都处在异步工作状态:

  • 硬件和软件是两个进程。系统有两个序列器,一个在VDAS模块的硬件中实现,另一个在runAcq.cmex的软件中实现,二者独立运行。
  • 硬件定序器负责TX/RCV/部分seqControl等
  • 软件定序器负责recon/process/seqControl等

同步工作

对于需要同步序列操作的情况,硬件在获取额外帧之前需要等待软件等待处理完成

相关指令:

   transferToHost		                  将采集到的数据传输到主机RcvBuffer中。
  										  可以使用'waitForProcessing'做为condition,需要一个argument,
  										  指向前一个transfertoHost命令的SeqControl号。超时等待时间由Resource.VDAS.dmaTimeout 设置
   markTransferProcessed  				  用于将硬件定序器从DMA关联的'waitForProcessing'条件释放出来
   sync                                   同步硬件和软件序列器(最多超时2.14s),可以设置软件等待硬件的时间
   waitForTransferComplete         		  用于暂停软件序列器,直到传输完成。需要一个argument, 指向前一个transfertoHost命令的SeqControl号。超时等待时间由Resource.VDAS.dmaTimeout 设置

同步操作需要解决两个问题:
1.软件只处理完整采集帧
2.防止DMA覆盖正在处理的帧中数据

数据可以处于三种并行状态:采集了没传输,传输了没处理,正在处理,所以在TBNP基础上又加了hDMA
实现方法:
DMA的两个标志符:TBNP和holdDMA

  1. TBNP: 当传输和处理完成时设置,软件可以读取该标志,等待‘waitForTransferComplete’进行TBNP位的置位操作。‘waitForTransferComplete’会等待agrument对应的‘transfertohost’操作完成。(防止数据覆盖)。通过’markTransferProcessed’可以进行TBNP复位。agrument标记复位的‘transfertohost’编号。(注:recon操作后会自动复位)。
  2. hDMA:当TBNP标志置位时,同时置位了hDMA标志,新的’transfertohost’停止,等待软件清除两个标志位。‘waitForProcessing’ 会导致‘hDMA’置位,agrument对应我们想要设置的对应‘transfertohost’标志。(所设置的argrument的transfertohost没有command命令就会发生错误)。
  3. 应用:当硬件序列中有’transfertohost’,并且是’waitforprocessing’指令,会检查argument对应的’TBNP’标志,如果是置位状态‘hDMA’也会置位,没置位就无操作。‘hDMA’置位会导致硬件暂停在该下一个’transfertohost’命令前(采集完但不传输),直到软件给出’marktransferprocessed’,并将对应的argument的TBNP和hDMA复位。

注:当有recon,不需要‘waitfortransfercomplete’和‘marktransferprocessed’

//伪代码
//每个'transfertohost'的'seqcontrol'有一个TBNP标志;
//硬件

beforetransfertohost(argument){
	while(seqcontrol[argument].hDMA==1) wait();
}
transfertohost(condition,argument){
	if(condition == 'waitfortransfercomplete'){
		if(seqcontrol[argument].TBNP) {
			seqcontrol[argument].hDMA = 1;
		}	
		//DMA transfer
		seqcontrol[temp].TBNP = 1;  //当前置1
	}
}

while(true){
	//acquire data
	//DMA transfer
	beforetransfertohost()
	condition = 'waitfortransfercomplete';
	arugment = nsc;
	transfertohost(condition,nsc);	
}


//软件
markTransferProcessed(argument){
	seqcontrol[argument].TBNP = 0;
	seqcontrol[argument].hDMA = 0;
}
waitfortransfercomplete(argument){
	whlie(seqcontrol[argument].TBNP==0){wait();}
}
while(true){
	waitfortransfercomplete(argument);
	//process
	markTransferProcessed(argument);
}

代码

SeqControl(1).command = 'returnToMatlab';
SeqControl(2).command = 'jump'; % jump back to start.
SeqControl(2).argument = 1;
lastTTHnsc = 0;
nsc = 3;
for i = 1:Resource.RcvBuffer(1).numFrames
    Event(n).info = 'Acquisition';
    Event(n).tx = 1;         % use 1st TX structure.
    Event(n).rcv = i;        % use 1st Rcv structure.
    Event(n).recon = 0;      % no reconstruction.
    Event(n).process = 0; 
    %同步操作
 	Event(n).seqControl = nsc;
 		%以下三句会等待argument指向的前一个'transfertoHost'命令的SeqControl号,
 		%说明下一个transfertohost命令会在前一个“transferToHost“SeqControl”传输的数据的处理之后执行。
       SeqControl(nsc).command = 'transferToHost';
       SeqControl(nsc).condition = 'waitForProcessing';
       SeqControl(nsc).argument = lastTTHnsc;
       lastTTHnsc = nsc;
       nsc = nsc + 1;
    n = n+1;
	%recon事件会在处理之前自动等待“transferToHost”命令完成,
	%然后执行“markTransferProcessed”以释放硬件序列器以执行下一个“transferToHost“。
	Event(n).info = 'Reconstruct'; 
    Event(n).tx = 0;         % no transmit
    Event(n).rcv = 0;        % no rcv
    Event(n).recon = 1;      % reconstruction
    Event(n).process = 1;    % processing
    n = n+1;
end
%修改第一次同步指向的前一个'transfertohost',因为第一个agrument为本身
SeqControl(3).argument = lastTTHnsc;    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值