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
- TBNP: 当传输和处理完成时设置,软件可以读取该标志,等待‘waitForTransferComplete’进行TBNP位的置位操作。‘waitForTransferComplete’会等待agrument对应的‘transfertohost’操作完成。(防止数据覆盖)。通过’markTransferProcessed’可以进行TBNP复位。agrument标记复位的‘transfertohost’编号。(注:recon操作后会自动复位)。
- hDMA:当TBNP标志置位时,同时置位了hDMA标志,新的’transfertohost’停止,等待软件清除两个标志位。‘waitForProcessing’ 会导致‘hDMA’置位,agrument对应我们想要设置的对应‘transfertohost’标志。(所设置的argrument的transfertohost没有command命令就会发生错误)。
- 应用:当硬件序列中有’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;