越是这样的小问题越是难以解决。如果字符串是单一的中文字符,或者ascii字符还好点,如果混合的话,需要分别计算每个字符的宽度。可以用api获得字符的宽度。不愿意用的话自己粗略计算一下也可以。
以静态文本控件m_txt为例(其他控件要考虑边缘空白)用静态文本控件正好容纳1000个中文字符的情况下来计算中文字符所占宽度,其他字符类似。
然后在程序中就可以通过计算字符串整体宽度与控将窗口宽度(m_txt->GetClientRect或 m->txtGetWidnowRect)相比较来判断了
字符串可以通过getwindowtext来获得
GetDC()的返回值是CDC 也就是说是一个指向CDC类的指针 CDC类的对象它是MFC内部为我们动态构建的, 储存的地方也就是指针指向的地方, 但是具体是在代码的哪个部分生成的, 这点我们不得而知 不过需要注意的一件事情是, 用GetDC()获取的CDC对象, 必须用ReleaseDC()将其释放 如:ReleaseDC(GetDC());
至于获得CDC指针的用处有什么, 那么在这里是不可能一言而尽了 所以GUI函数都在它里面 因此只能是用到哪里, 学到哪里, 不可能全部学会
血清甘油三酯/三酰甘油(TG)是一项重要的临床血脂常规测定指标,特别是随着对其致动脉粥样硬化(AS)作用研究的深入,TG作为冠心病的一项独立的危险因素日益受到重视。但是血清TG测定及其临床应用尚存在很多问题,如生物学变异、游离甘油对测定的影响、测定的标准化系统不完善等等。本文仅对TG的生物化学、测定方法与标准化、临床意义等方面的近况作一简述。 血清TG测定方法一般可分为化学法、酶法和色谱法3大类。早期测定方法是以总脂质与胆固醇和磷脂之差估算。化学法用有机溶剂抽提标本中的TG,去除抽提液中磷脂等干扰物后,用碱水解(皂化)TG,以过碘酸氧化甘油生成甲醛,然后用显色反应测甲醛。比较准确的是二氯甲烷-硅酸-变色酸法(Van Handel-Caslson法),此法抽提完全、能去除磷脂及甘油干扰、变色酸显色灵敏度高、显色稳定,至今还是美国疾病控制与预防中心(CDC)的内部参考方法。但因 *** 作步骤繁多、技术要求高而不适于常规工作应用。核素稀释/气相色谱/质谱技术(ID/GC/MS)主要用作参考系统中决定性方法的建立及参考物质的制备与定值,此法费用昂贵,样品处理复杂,难以推广应用。
所有的临床实验室都用酶法检测血清TG水平,虽然方法各异,但一般都包括3个基本步骤[3,5~7]:用最合适的LPL水解TG生成甘油和FFA;接着是转化,该步骤一般只用一种酶,例如甘油激酶,将甘油磷酸化以进行下一步反应,或者生成中间待测物;最后是有色染料(常为醌亚胺等)或者紫外吸收物质的形成,再通过分光光度法计算相应的TG浓度。如脂蛋白脂肪酶-甘油磷酸氧化酶- 过氧化物酶-4-氨基安替比林和酚法(GPO-PAP 法)等。此法具有简便快速、微量、精密度高的优点,且特异性强,易于达到终点,线性范围宽。用一步法测定的是血清总甘油酯(定义为TG和FG及少量甘油二酯、甘油一酯之和,习惯统称为TG)。为了消除FG的干扰,中华医学会检验分会曾推荐GPO-PAP 法的两步酶法作为血清TG常规测定方法[7],该法不增加试剂成本和工作量,适合自动化分析,由于试剂分成两部分加入,对正确设置分析测定参数有较高要求。对此法能否去净游离甘油方面有人提出质疑。针对这一情况,中华医学会检验分会在《关于临床血脂测定的建议》文件中建议酶法如GPO-PAP 法作为临床实验室测定血清TG的常规方法。普通临床常规实验室可采用一步GPO-PAP法,有条件的实验室(如三级以上医院)应考虑开展游离甘油的测定。
血清FG对TG测定结果的影响一直是临床十分关注的问题。国外资料显示,正常人体血清FG含量为006~022mmol/L,约占总TG的6%~14%[3]。国内的研究结果与此相近,中国正常人血清FG 水平平均约为008mmol/L(002~ 033mmol/L),约占总TG719%(081% ~2164%)。虽然临床标本中FG显著升高者很少见,但有些异常或病理情况下如应激反应(肾上腺素激活LPL促进体内脂肪水解),剧烈运动,服用含甘油的药物如硝酸甘油,静脉输入含甘油的营养液,肝素治疗,某些严重的糖尿病、肝病与肾病,取血器材或试管塞上带有甘油等时,可见血清FG显著升高,并给临床决策带来误导[3]。因此,可采取测定“真”TG的方法减少其影响:一种是同时测定总甘油和FG,两个结果的差值反应了真TG浓度(外空白法),另一种是用上文所述的两步酶法直接测定TG(内空白法)。前者国内外应用较少,后者国外(如日本)使用较多,已有许多临床实验室开展。
对于FG空白的设置建议采取如下措施:
⑴临床实验室应备有可以做FG空白的检测系统,在任何情况下都可以做FG空白;
⑵TG报告单中应标明是否为FG空白结果,实验室应告知临床医生FG空白的意义;
⑶临床及基础研究、参加CDC脂质标准化计划的实验室都要做FG空白;
⑷住院病人中内源性甘油过高群体的标本都应做FG空白;
⑸体检及门诊患者可以不做FG空白,但糖尿病或其他特殊门诊例外;
⑹FG>23mmol/L者最好做FG空白;
⑺对某些可疑情况,如TG高而血清不混浊应排除高FG的可能。
此外,一些物质如抗氧化物质(维生素C等)、黄疸、溶血、脂血等对酶法测定TG有干扰,可采用设置血清空白予以消除。
在应用自动生化分析仪进行临床常规TG测定时,还要特别注意交叉污染和基质效应。最易对TG测定产生交叉污染的是总蛋白和铁试剂,因其还原物质浓度可影响Trinder反应。如果接着TG测定直接胆红素,也会因表面活性剂的导入产生误差。铁测定对TG的影响与亚铁氰化钾的量有关。此外,还要注意常规酶法测定TG对制备物的基质效应。Halani等用24份新鲜血清为对照,对5份CAP制备的冻干血清及9份CDC冰冻混合血清进行了评价。以3种商品TG酶试剂测定,以CDC参考方法为对比方法,校正游离甘油后,2种商品试剂对CAP及CDC血清均无基质效应,另一种商品试剂对4份CAP血清有基质效应。也有资料表明,各种质控血清中FG占TG的12%~85%。我们的研究也发现,临床使用的各种TG检测试剂盒、不同的测定/校准系统、质控血清之间存在明显的基质效应,因此对于不同方法/试剂的选择,如选用两步酶法试剂和质控物时要注意其反应的通用性与适用性。 TG测定的结果受取样时个体生物学变异(CVb)和分析不精密度(CVa)的影响[3]。一般情况下,CVa相对较小(约为3%),而CVb占总变异的90%多[6]。即使严格按美国胆固醇教育计划(NCEP)要求控制的个体,在2周内2次所测的TG结果差异百分比约为胆固醇的5倍,75%以上的个体在两周内的变异大于10%。李健斋等[9]研究发现,中国人群血清TG个体间变异为28%,居所有血脂项目之首。国外资料表明,空腹25月的人群TG变异约25%,非空腹状态的变异更大,日间约为63%~65%,月内为129%~348%,一年为129% ~399%,以上数据均为正常个体稳定饮食状态的结果,某些病理状态下的波动会更大。
为减少上述变异对TG测定的影响,NCEP建议受试者在两月内分次测定,两次间至少间隔一周,测定结果取均值。但当血脂水平远离医学决定水平时,则无需多次取样。标本采集要求受检者在前三周内不改变饮食习惯,采血前至少12h不进食,72h不饮酒。抽血后应尽快检测,某些含有高活性LPL的标本,如用肝素治疗的病人标本,TG常会过度水解。标本最好放在冰浴中,2h内分离血清。室温放置1天TG下降达34%。Eberly等研究发现非空腹高TG血症的发生明显多于空腹,而两种状态高TG血症所致冠心病的危险基本相同,因此测非空腹TG更有利于冠心病危险预测。
临床上常见到肉眼脂血标本,这常与一些潜在的错误有关。其中之一是LPL水解TG时产生的“清除效应”。在用血清而非试剂作空白时,大颗粒TRL散射引起假性高基线吸收。随着反应的进行,TG被水解,脂蛋白颗粒变小,浊度也减小,总的效应是在吸光度上升(产生NADH)的反应中,结果轻微偏低。这种误差所占比率较小,且只发生于高浓度TG标本中,其误差通常是可接受的。另外,肉眼脂血标本特别是CM含量过高者,由于CM漂到样品杯上层使标本成为多相。因此对于肉眼脂血标本,应充分混匀且尽快检测。TG水解产生大量脂肪酸,特别是脂血标本,由于其浊度和产物的抑制作用,对分析也有影响。在反应的缓冲液中加入牛血清白蛋白或α-环式糊精可以避免上述情况。 美国的TG测定的参考系统较为完善,其推荐的决定性方法是由美国国家标准与技术研究所(NIST)建立的ID/GC/MS法,以13C3甘油三软脂酸酯为内标,可测总甘油酯和“净”TG,一级参考物质为NIST的SRM1595(三软脂酸甘油酯);参考方法为CDC的二氯甲烷-硅酸-变色酸法,一直被用作美国CDC-NHLBI血脂标准化计划中的参考方法,该法用Supelco的三油酸酯和NIST的三软脂酸甘油酯标准物质SRM 1595的2:1混合物作标准,测定值不仅是TG,还包括(或部分包括)甘油二酯和甘油一酯。二级参考物质有NIST的SRM1951a、CAP RM026及CDC的多种冰冻血清。此法此参考方法步骤繁琐,实验室间进行方法学转移比较困难,CDC拟对其进行改进,以期在胆固醇参考方法实验室网络(CRMLN)建立一个结合提取、水解步骤的酶法作为“指定参考方法”。
国内陈文祥等建立了高效液相色谱(HPLC)测定总甘油和游离甘油的方法,测定总甘油酯的相对不精密度小于2%,游离甘油小于4%,总甘油平均回收率1000%,游离甘油997%,与ID/GC/MS法相对偏差不大于±2%。此法拟推荐为中国TG测定的参考方法。
血脂测定标准化并非要求统一测定方法,而是要求实验室测定结果达到所制定的技术目标。对于TG测定,国内外要求不精密度(用CV表示)应不大于5%,不准确度(用偏差表示)应不大于±5%,总误差应不大于15%。总误差=偏差%+196CV(与参考血清的靶值比较)。特别值得一提的是卫生部北京老年医学研究所血脂实验室已于2002年3月被接纳CDC的CRMLN成员(全球共12家),在血脂测定的标准化方面积累了丰富的经验,中国TG测定的参考系统正在建立之中。
美国疾病控制和预防中心;美国疾病控制与预防中心。
CDC(P):CentersforDiseaseControl疾病控制中心是由政府举办的实施国家级疾病预防控制与公共卫生技术管理和服务的公益事业单位。其使命是通过对疾病、残疾和伤害的预防控制,创造健康环境,维护社会稳定,保障国家安全,促进人民健康;其宗旨是以科研为依托、以人才为根本、以疾控为中心。
芯片设计进阶之路——跨时钟域深入理解(2)
------------------------------------------
版权声明:
本文作者: 烓围玮未
首发于知乎专栏:芯片设计进阶之路
转发无需授权,请保留这段声明。
------------------------------------------
在《芯片设计进阶之路——亚稳态和同步器》中,分析了亚稳态和同步器,我们继续理解跨时钟信号处理的各种方法。
跨时钟域的信号可以分为单bit信号和多bit信号,处理方法有所不同,我们先从单bit的CDC开始。
CDC: Clock Domain Crossing, 跨时钟域。下面会用CDC来指信号跨时钟域处理。
1 单bit信号跨时钟域的处理
信号跨时钟域,根据两个异步时钟之间的关系可以分为:
信号从快时钟域到慢时钟域;
信号从慢时钟域到快时钟域;
单bit信号一般采用同步器来做CDC。这里要指出的一点是,由于在CDC时,会在源时钟域做寄存输出,所以信号的变化频率不会超过源时钟的频率(请参考《芯片设计进阶之路——亚稳态和同步器》),所以这里能够以两个时钟之间的快慢来分类。
11 快时钟域到慢时钟域
111 快时钟到慢时钟CDC问题
信号从快时钟到慢时钟CDC如下图所示
上图显示了当在一个时钟域(aclk)中生成的信号adat被送到了另一个时钟域(bclk)中采样,由于采样时间太靠近第二个时钟的上升沿时,发生的同步失败。同步失败是由于输出bdat1变为亚稳态,而在bdat1再次被采样时没有收敛到合法的稳定状态。
这里注意一下,如果是电平信号进行CDC, 那么不用考虑时钟快慢,直接用同步器就可以了,因为总能被采样到。所以,下面考虑的主要是信号位宽有限的CDC。
快时钟到慢时钟的(单bit)信号处理,主要问题就是信号在快时钟域中,可能会多次改变,这样慢时钟可能来不及采样,导致丢失数据。这个问题被称为信号宽度问题,在CDC检查工具中,如果快时钟的信号宽度不足,会报出CDC违例。
快时钟到慢时钟的(单bit)信号处理分为两种:
1 采样丢失是被允许的。单bit信号一般不会是这种情况,如果是这种情况,直接用同步器同步就可以了。
2 采样丢失不被允许。这样就要采样其他手段来保证数据不丢失。主要原理是保证快时钟域的信号宽度满足一定的条件,使得慢时钟域有足够时间采样到。
112 信号宽度的“三时钟沿”要求
那么信号在快时钟域到底需要多宽,才能保证在慢时钟域安全的被采样到呢?比较安全的宽度是,快时钟域的信号宽度必须是慢时钟域时钟周期的15倍以上。也就是要持续3个时钟沿以上(上升沿和下降沿都算)。这个被称为:“三时钟沿”要求。
下面是一个CDC信号只持续一个周期的例子:
发送时钟域的频率高于接收时钟域,而CDC脉冲在发送时钟域中只有一个周期宽,这样CDC信号可以在慢时钟上升沿之间变动,不会被捕获到慢时钟域,如下图所示
如果CDC信号宽度超过慢时钟周期,但是不足15个周期,也会发生问题。如下图所示
如上图所示,信号宽度超过了一个慢时钟周期,但是可能会setup和hold time违例,导致信号采样失败。
113 信号宽度问题的解决方法
一种最简单的方法是,通过保证信号宽度满足超过慢时钟的时钟周期15倍,来解决这个问题。这种方法是最直接,也是跨时钟最快的方法。可以通过system Verilog加“断言”的方式来检测是否满足条件。
但是实际中很少用这种方式,因为设计可能会变,设计人员在改变设计时,可能会忘记这个限制,以为是一个通用的解决方法。
所以,常用的还是通过“握手”的方式来保证数据被采样到。
通常的做法是:是发送一个使能控制信号,将它同步到新的时钟域,然后通过另一个同步器将同步信号作为确认信号传回发送时钟域。如下图所示:
优点:
同步反馈信号是一种非常安全的技术,可以识别第一个控制信号并将其采样到新的时钟域中。
缺点:
在允许控制信号改变之前,在两个方向上同步控制信号可能会有相当大的延迟。也就是说,在应答信号到来之前,是不允许源信号改变的。
在实际的芯片设计中,脉冲(宽度有限)信号的同步都是采用这种握手机制来处理。
12 慢时钟到快时钟域
慢时钟域到快时钟域的CDC, 直接使用信号同步器就可以了。具体逻辑可以参考《芯片设计进阶之路——亚稳态和同步器》。
但是,这里有一点要指出来,那就是怎么才算慢时钟域到快时钟域的CDC呢?这里和平常理解的有点不一样。
目标时钟频率必须是源时钟频率15倍或者以上,才能算慢时钟到快时钟的CDC
这也很好理解,只有满足快15倍以上,才能满足“三时钟沿”的要求,才能保证快时钟域保证能够采样到慢时钟域的脉冲。
如果目标时钟域只快一点,比如1~15倍之内,为了保险起见,请按照11中快时钟到慢时钟域的处理方法来处理。
另外,有的设计中为了保险和以后修改的方便;或者还不清楚时钟之间的关系;都会按照11中的方式来进行单bit的CDC处理。
2 多个信号跨时钟域的处理
在两个时钟域之间传递多个信号,简单的同步器已经不能满足要求。
工程师经常容易犯的错误是,直接用简单同步器来同步多个信号。如下图所示:
这里列出理两个信号分别通过同步器同步后,在目标时钟域聚合后使用的三种场景。问题是两个同步器,跨时钟的延时可能不一样,比如信号从2’b00->2’b11, 上面的同步器花了2个周期同步到了目标时钟域;下面的同步器花了3个周期才同步到目标时钟域。那么在第二和第三周期之间,就出现了2’b10的值了,即出现了错误的采样信号,这样功能有可能就不正确了。
如果不明白,为什么同步器的同步延时会不一样,可以参考可以参考《芯片设计进阶之路——亚稳态和同步器》。
另外,不同同步器的芯片上的走线也可能不同,导致延时不一样。即使我们完美的控制后端不同bit同步信号的走线长度一样,同一个die上面不同芯片之间或者不同制程之间的偏差,都可能引入差异,导致多bit信号的延时不同。而且这样对后端走线难度增大。
考虑到以上两点,多个信号的CDC一般不用简单同步器的方法。在CDC检查时,会有专门的规则来检查是否采样了多bit信号用同步器同步聚合使用的情况。
为了避免多位CDC倾斜采样的情况,多个信号CDC策略可以分为三种:
(1)多个信号合并。在可能的情况下,将多个CDC位合并为1位CDC信号。
(2)多周期路径法。使用同步负载信号安全地传递多个CDC位。
(3)使用格雷码传递多个CDC位。
(4) 使用异步FIFO来传递多位信号。
21 多个信号合并
在可能的情况下,将多个CDC信号合并为一个1位的CDC信号。有些时候,并不需要将多个信号来做CDC。下面是两个多个信号合并为一位信号做CDC的例子。这里
例子1:
下图所示的简单示例中,接收时钟域中的寄存器需要加载信号和使能信号才能将数据值加载到寄存器中。如果负载和使能信号都是在同一个发送时钟边缘上驱动的,那么控制信号之间的小偏差就有可能导致两个信号在接收时钟域中同步到不同的时钟周期。在这种情况下,数据不会被加载到寄存器中,就会出问题。
解决方法也很简单,将控制信号b_load和b_en合起来:b_lden=b_load & b_en 同步到aclk域中。
例子2:
下面是另外一个例子:
下图中的显示了两个使能信号,aen1和aen2,它们从发送时钟域依次驱动到接收时钟域,以控制流水线数据寄存器的使能输入。问题是同步器并不能保证两个cycle就一定能同步过来,下面的同步器花了3个cycle才同步完成数据,导致流水线寄存器不能“流水”起来。
该问题的解决方案是只向接收时钟域发送一个控制信号,并在接收时钟域内生成第二个相移流水线使能信号。如下图所示:
23 多周期路径(Multi-Cycle Path, MCP)
下图中显示了在时钟域之间传递的两个编码控制信号。如果这两个编码信号在采样时略有偏差,则在接收时钟域中的一个时钟周期内可能会产生错误的解码输出。
多位数据问题可以用“多周期路径法(MCP)”来解决。
MCP方法是指直接不同步将数据发生到目标时钟域,但是同时送一个同步过的控制信号到目标时钟域。数据和控制信号同时发送,允许数据在目标寄存器的输入端进行设置,同时控制信号在到达目标寄存器的负载输入端之前做同步。
MCP方法的优点:
(1)不需要在发送时钟域计算适当的脉冲宽度
(2)发送时钟域只需要将enable toggle到接收时钟域,表示数据已经被传递完成,已经准备好被加载。使能信号不需要返回到初始逻辑电平。
MCP方法的实质就是,不同步多位的数据,只同步一位的控制信号,通过握手保证控制信号能够正确传输,然后在目标时钟域通过控制信号来采样数据。
MCP需要用到“同步脉冲器”:
同步脉冲器的符号表示如下:
多周期路径法有两种方法来传递多位信号:
1 带反馈的MCP
电路图如下
2 带应答反馈的MCP
电路图如下:
多周期路径法的思想十分有用,但是实际中用来传递多位信号比较少见,因为逻辑过于复杂。但是MCP方法用来传递单bit的信号却十分有用。这里就不展开讲了,有兴趣的可以参考最后的参考文档中的描述。
下面是一种利用MCP思想进行跨时钟处理脉冲,不用考虑源时钟信号宽度的代码:
限制就算输入脉冲不能相隔太近,否则会丢掉中间的脉冲。
24 格雷码
对于计数器的CDC, 大部分是不必要的。如果一定需要,那么可以使用格雷码。
格雷码每次只允许更改一个位,从而消除了跨时钟域同步更改多个CDC位所带来的问题。
格雷码和二进制码之间的转换是一种很成熟的技术,很容易就能找到现成的代码,这里就不在详细描述。
需要注意的是:格雷码必须是计数到2^n才是每次改变一个bit。
如果计数器是从0~5计数,那么从5->0的计数,不止一个bit改变,就失去了只改变一个bit的初衷。
格雷码最常见的应用是在异步FIFO中,通常异步FIFO的深度都是2^N,原因就是上面说的。所以,就算浪费面积,也需要把FIFO深度设置为2^N。
25 通过AFIFO进行多位信号CDC
多位信号CDC的工程上的一般做法都是采用异步FIFO, 异步FIFO的设计请参考:
“Clifford E Cummings: Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons”
这篇文章,里面写的十分清楚,而且给出了详细的RTL代码,可以直接使用。把这篇文章搞懂了,AFIFO的知识点基本就清楚了。AFIFO的设计也是芯片设计的基本功,一定要弄清楚。
这里有一个特殊的应用,那就是深度为2的AFIFO,来进行多bit数据的CDC 如下图所示:
2个寄存器搭建的AFIFO,地址只需要一位。相比MCP方法,逻辑简单,可以复用AFIFO代码(一般公司都有芯片验证过的AFIFO代码),而且延时也比MCP方法小。
所以多bit仅仅跨时钟域,不需要进行数据吞吐率匹配(FIFO的重要功能之一)的情况,推荐用深度为2的AFIFO来实现,而不是MCP方法。
3 总结
CDC问题是芯片失败的最常见的问题之一,弄清楚CDC方法也是芯片设计的最重要的事情。常见的CDC方法总结如下:
推荐的1-bt CDC技术:
慢时钟到快时钟:同步器;
快时钟到慢时钟:MCP方法
推荐的multi-bit CDC 技术:
多个信号合成一个信号。
MCP方法(其实用的很少,但是设计思想很好)
AFIFO
2-Depth AFIFO
4 后记
跨时钟设计是芯片设计的最重要的主题,没有之一。信号的跨时钟处理是芯片设计师必须要要掌握的技术,深入理解CDC的问题和对应的方法,是芯片设计进阶的必经之路。本文是跨时钟域(CDC)深入理解文章的第二篇,后续会陆续发布跨时钟域(CDC)深入理解系列的文章,尽情期待。
赠人玫瑰,手有余香。原创不易,如果你有所得,麻烦花一秒时间帮我“点赞”吧,谢谢!
——————————————————————————————————————
参考资料:
Clifford E Cummings,"Clock Domain Crossing (CDC) Design & VeTechniques Using SystemVerilog”
——————————————————————————————————————
以上就是关于MFC中Static text怎样判断控件中的字符串是否超出控件的宽度。100分求解。全部的内容,包括:MFC中Static text怎样判断控件中的字符串是否超出控件的宽度。100分求解。、C++:CWnd下GetDC()函数,获取了什么存在哪里、甘油三酯的测定方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)