回收tplink路由器
回收tplink路由器 高价求购电子旧货站、库存AMIAD空气阀库存Stmv传感器... 公司免费提供物价.欢迎来电,致力于打造诚信和双赢的元器件回收中心,我们24小时恭候您的来电!
为了数据的高可用性,你只能使用数据冗余,写多份到不同的节点——工业界写三份是安全。然而,你做了冗余,又有数据一致性问题。为了解决冗余带来的一致性问题,才有了paxos的玩法,大家这个能不能改,于是你就需要一个强大的控制来控制这些东西。
在此期间,美国的Nuance、国内的科大讯飞、搜狗、云之声、思必驰等产品纷纷布局智能产品。在去年阿里和上汽合作的互联网汽车上,采用了Nuance交互;科大讯飞就在昨日跟启辰签约,早前还同奇瑞、长安、北汽签订了一系列合作协议;出门问问则同大众成立合资公司。
一直以合理的价格收购使客户与我们双赢高价回收库存气立可二手电子物品回收公司
检验芯片的各项功能需要编写诊断,目的是确保器件的各项功能按要求工作,但是无论各项有多么详尽,它都无法找出大部分层次的问题。因此,要利用级强化(STRESS TESTING)来使多种功能以度和随机的共同执行,从而迫使这些设计问题浮出表面。本文将探讨用于检验半导体器件设计的强化。 强化 强化是指将产品置于比实际正常应用苛刻得多的条件下使用,其目的是通过各种对设备进行考验,迅速发现其设计缺陷。例如,对于一件机械产品,可能让它面对恶劣的条件,如高压、高温和震动。如果该产品能在这样的条件下成功经受一个月的考验,那么在正常使用条件下,它应该能工作长得多的时间。 同样的概念也适用于芯片的设计。此时,强化的形式是执行诊断,其目的是使大量的芯片功能同时、连续、随机、密集地工作,其程度远远超过芯片正常使用时的状况。这些通常连续运行,大多数时候无人照管,夜间和也不停止。通过这些,可以在产品发货之前迫使隐藏的问题尽快来。 为什么强化对半导体设计如此重要呢?为了解释这一问题,假设一个半导体器件常常为了不同用途而应用在各种电子之中,因此,这些电子产品将被几千甚至几百万用户使用,每个用户使用产品的各不相同。在如此大量的使用中,当芯片上的功能和事件出现某种在器件中从未遇到过的顺序或组合时,可能就会发生问题。这些问题通常为:不时被锁住、数据出错或其它难以复现的异常现象。如果这些问题出现太多(或者在执行重要任务的产品中仅仅偶然出现),用户将会认为这些产品是不可靠甚至不的。 强化概念的引出 初尝试创建强化时,是研究和编写直接尽可能多的芯片功能并使它同时执行,使用定时器中断并让它执行随机,同时主程序不停地数据,并随机地不时启动其它芯片操作。当想出向芯片内引入更多无序和随机事件的招数时,便将它添加到中去。很快就可以发现,虽然陆续发现了许多问题,但它大多发生在自己编写的上。 由于不时使用同一块存储区域或外设资源,中的功能相互。例如,当一个正在使用某一通用I/O时,另一个随机启动的却更改了它的状态。由此不时的故障耗用了大量的调试时间。 第二次,尝试组织得非常好的强化。它安排随机选择的功能轮流运行,在许多地方将中断锁住,以防止冲突和保证其它安全措施。这种谨慎的编程使得非常,但与直接相比,同样不能有效地发现芯片的问题,因为它是按照一种很大程度上可预期的顺序来执行。毕竟的目的是为了半导体器件的设计,而不是为了的。 在理论上希望避免这两种极端情况。的根本目的是为了芯片中级的相互作用问题,为了达到这个目的,就必须将操作搞乱,使得许多不同事件以随机发生。其中的诀窍是,以一种有组织的来保持的无序特点,从而可靠的,并可进行扩展,还可以尽可能地帮助调试。要达到这些目的,需要仔细进行考虑和规划。这就是构建一个强化框架的思路。 框架 本文介绍一个框架(framework)的设计,读者可以使用这个框架来为半导体器件构建一个可扩展的强化。虽然本文没有提供完整的框架,但这些内容应当能够激发读者的灵感来帮助构建自己的强化框架。 框架通过提供一个公共操作引擎和来简化特定类型的应用工作,具体的应用经由一个定义好的接口来与框架连接。强化框架也采用了同样的思路,它提供一个引擎来处理强化的基本操作和公共功能。 强化框架本身不任何芯片功能,但它允许嵌入事件模块。事件模块是实现一项具体的半导体器件或事件的函数,通常要使用一组随机产生的参数。执行强化时,框架引擎将随机选择并以不同来启动这些事件模块。 这个框架还为事件模块提供了基本服务供其使用,包括保留资源的功能、选择随机参数的功能和数据记录功能。大部分预先规划和设计都位于框架本身内部,因为框架处理强化复杂和“混乱无序”的一面。然后,根据需要单个事件模块,扩展强化。由于框架负责处理公共的强化部分,事件模块的人员可以专注于为目标芯片功能编写的程序。图1为强化框架各个组成部分的高层次示意图。 随机池是强化的核心部分,实际的半导体器件就位于其中。它是为了对芯片的某项具体功能启动事件和(或)执行而编写的事件模块的。新的事件模块时,可将它添加到随机池中,以便在下一次运行强化时将其包含在内。本文后面还将更详细地介绍事件模块,因为这是为芯片并由框架启动和支持的实际半导体器件。 执行中,强化引擎随机地从池中选择和运行事件模块。为了使更加杂乱无序(从而对器件设计施加更大的强化),框架采用异步时隙来按照任意时间间隔随机选择和启动。 “时隙”使用一个硬件定时器来实现,器件或板的多个定时器可以拥有各自的时隙。框架为每个时隙定时器选择随机的时间间隔,当时隙截止时,引擎中断当前的模块,定时器的中断处理程序将选择另一个模块来执行,同时引擎为下一个时隙操作选择另一个随机的时间间隔。这样,将以一种交织的风格执行,引发各种各样的执行,同时还实现了执行的并行性,这一点将在后面看到。 选择和启动一项的框架代码很简单,因为事件模块只不过是一个C语言函数而已。列表1是启动程序的一段代码。一般而言,框架保持有一组C函数,这些函数即为模块,读者可以选择任意一个索引来查看函数并加以执行。 (列表1) 模块 如前所述,事件模块是一个函数,它针对半导体器件的某个具体特性执行一个或一次检验。虽然框架将模块作为一个C函数来,但如果需要,模块也可以调用汇编级代码。框架的编写使得设计人员可以新的模块并添加到池中,供强化期间框架随机选择。后面框架实例中的模块是void C函数,它不需要任何参数。在框架支持功能的帮助下,模块本身可以启动并调用相应的功能来记录结果。 事件模块共有三种类型: 1. 纯事件 2. 检验 3. 检验 正如其名称所表明的那样,纯事件模块启动一个事件后不做任何检验工作,包括以某种改变或启动某项后台功能。那么,启动一个事件而不执行任何检验有什么意义呢?为了解释这个问题,来考察一个事件模块,它仅仅切换处理器高速缓存的当前设置。每次框架随机选择这个模块时,高速缓存就从1切换到0或从0切换到1。这了一个变化因素,因为对于运行时需要用到这个高速缓存的模块而言,它的值有时为1有时为0。 第二种事件模块是检验,它执行一个,并在模块函数退出之前对这个进行检验。例如,这种可以用任意数据来填充随机选择的存储器区域,然后采用任意CPU读写宽度来将这个区域到一个随机的目的存储器区域,再检验其结果。 第三种模块是检验,这是功的,虽然通常只能用于可以对总线进行控制的芯片功能(换句话说,运行在CPU的后台)。这种模块将启动一个然后退出,使得在原继续运行时,其它模块可以执行。在大多数情况下,的完成用一个中断来表示。当中断发生时,中断处理程序将检验的结果。 检验的例子如DMA (直接存储器访问)传输。可以编写一个模块来选择随机的源、目的存储器区域和DMA通道。这个模块可以用任意数值来填充源存储器,并配置一个用来检验结果的DMA结束中断处理程序。这个中断处理程序即为“检验”,它可访问包含有被启动的详细信息的数据结构,在被调用时,它还将检验的结果。 框架实例 为了展示这些的强大功能,来考察一个简单的框架实例,它包含以下四个模块。 1) 简单的基于CPU的存储器(TE_CPU_COPY): 将随机数据样式填充到一个任意大小的随机源地址存储器块中,然后使用一种随机混合的读写宽度来将数据样式到任意选择的目的地址。完成后,检验目的区域中的数据是否包含了先前选择的数据样式。 2) DMA存储器---存储器(TE_DMA_M2M): 将任意数据样式填充到随机源地址的任意大小的存储器块中,然后任意选择一个存储器---存储器DMA通道,编程为将源地址的数据样式到随机选择的目的地址。当DMA结束中断发生时,检查两个存储器区域是否匹配。 3) DMA---外设(TE_DMA_M2P): 将任意数据样式填充到随机源地址的任意大小的存储器块中,然后任意选择一个存储器---存储器DMA通道,编程为将数据样式到特定外设的任意端口号中。当DMA结束中断发生时,检查外设的FIFO中是否包含了正确的数据(或者被发送到外设)。 4) 高速缓存切换(TE_CACHE): 将高速缓存从1切换到0或从0切换到1并退出。这个模块是一个纯事件模块,运行时不执行检验操作。 假设框架有三个时隙定时器用来启动事件模块,那么启动它的main( )例程位于时隙0,具体运行时可能与列表2所示类似。 (列表2) 运行开始时执行存储器。执行中,时隙2定时器在中途定时截止。此时,高速缓存事件模块被启动,它切换高速缓存的状态并退出。在高速缓存处于新设置的状况下继续执行。在完成之前,时隙1定时器又截止,此时一个DMA存储器---端口模块被启动,它设置任意的DMA通道并退出。现在,DMA已在后台执行,而原来的又重新运行。随后又发生一个时隙3定时器中断,使用DMA通道5启动存储器---存储器传输并退出。这种安排还可以继续下去,但已经可以看到,通过这个,可以让所有的DMA通道同时运行,高速缓存随机切换,而且CPU在中随机访问不同的存储器区域。 参数 事件模块将使用一个或多个随机选择的参数来执行操作。常见的参数如:源和目的存储器地址、块大小、数据样式、读写宽度(如8、16或32位)、DMA通道和UART端口。 虽然随机地选择事件函数看起来比较简单,但究竟应当如何选择随机参数值,同时确保这些值对有效,而且不与其它发生交叠从而呢?例如,如果某个选择一个随机的存储器地址和大小,需要知道(1)存储器确实存在;(2)其它没有选择与这片存储器交叠的存储器区域(因为一个有可能改写另一个的存储器并故障)。另一个资源竞争的例子是,两个都随机地选中同一个DMA通道来进行数据传输。 框架提供的支持功能使模块可以安全地选择任意参数。为了帮解这一点,这里举一个常用的参数的例子:随机选择的存储器块。随机选择的存储器块有一个起始地址值和一个大小值,它都是随机数值。这个存储器块可以位于CPU地址空间的任何位置,包括在SRAM、PCMCIA或Flash存储器中。 在列表3所示的例子中,memPool数组中填入了存储器段的起始地址和大小,它位于的地址空间中,可供进行随机选择。每个条目都有一个保留标志(inUse项)。为了选择一个随机存储器块,函数首先选择一个随机的指向存储器段数组的索引。然后在这个段中选择一个随机的起始地址和大小块的大小值是存储器段的结束地址减去所选的起始地址。一旦随机块的起始地址和大小选定了,整个存储器段就通过设置保留标志被标记为保留。 列表3:随机存储器块选择 ============================ typedef struct { uint32_t start_addr; uint32_t size; bool inUse; } memSeg; memSeg memPool[] = { /* start addr size inUse */ { 0x10000000,0x00040000, 0}, { 0x10040000,0x00040000, 0}, { 0x10080000,0x00040000, 0}, { 0x100c0000,0x00040000, 0}, { 0x30000000,0x00040000, 0}, { 0x30040000,0x00040000, 0}, { 0x30080000,0x00040000, 0}, { 0x300c0000,0x00040000, 0}, { 0x30100000,0x00008000, 0}, { 0x40004000,0x00004000, 0}, { 0x40008000,0x00004000, 0}, { 0x4000c000,0x00004000, 0}, { 0xa0000000,0x00002000, 0}, { 0xb0000000,0x00008000, 0}, { 0xb0008000,0x00008000, 0}, { 0xb0010000,0x00004000, 0} }; int SelectAndReserveBlock(unsigned int *addr, unsigned int *size) { int retries=0; /* limit the NUMBER of times we try to get a segment */ int seg; while(retries < MAX_RETRY_COUNT) { /* select a random MEMORY segment (index into memPool array) */ seg = GetRandomNumber(sizeof(memPool)/sizeof(memSeg)); if (memPool[seg].inUse) { retries++; continue; } /* reserve the segment */ memPool[seg].inUse = 1; /* select random block in segment, and don’’t let it run past the end of the segment. */ *addr = memPool[seg].start_addr + GetRandomNumber(memPool[seg].size); max_size = memPool[seg].size - (*addr - memPool[seg].start_addr); if (max_size > MAX_BLOCK_SIZE) max_size = MAX_BLOCK_SIZE; *size = GetRandomNumber(max_size); break; } /* return the segment number so it can be used to free it later, or return -1 if we ge up looking for a free segment */ return (retries >= MAX_RETRY_COUNT) ? -1 : seg; } void FreeMemorySegment(int seg) { memPool[seg].inUse = 0; } =============================================== 这种的一个缺点是,使用存储器段中的某个随机存储器块时,按照存储器段数组中的定义,整个存储器段都将被保留。如果所有存储器段都被保留了,还有存储器可用吗?解决的办法是将存储器分为更小的段。可能希望以不同的来分割存储器段,以便跨越数据宽度和类型各不相同的多个存储器器件来选择存储器块的可能性。注意这些方案都比较简单,也可以加强它的功能,关键只是直接控制指示哪些存储器区域可以使用。 其它资源的选择和保留可能更加简单。例如,保留标志数组可用来DMA通道,数组的索引代表通道。设计人员可以编写一个ReserveDmaChannel()函数,它返回一个随机DMA通道号,这个通道号处于芯片上的DMA通道数目范围之内,并且其保留标志未被设置。然后,函数将设置保留标志来保留这个通道。完成时,可以调用FreeDmaChannel()来该标志。 调试 调试和分离与相互作用有关的问题可能比较困难,在这个中可以通过设计强化框架来提供帮助。根据运行是在芯片生产前的下进行,还是在一个安装有实际芯片的板进行,所遇到的问题将会有差异。 在下运行时,速度的问题,CPU的运行速度要比实际器件慢得多。的优势在于工具可以输出芯片设计内部的详细记录,这将简化调试工作,但它也有一个很大的缺点,即问题复现困难。如果为了问题要花费太长的时间来运行强化,这将是难以接受的。 解决的办法是将强化作为许多较短(例如30分钟)的来运行,这可以通过用一组事件模块来创建不同的来实现。此外,还应该给每个分配一个专门的随机数种子(seed),以便使用这个种子的其它每次运行时,都能重新产生准确的事件和参数序列。 好的运行脚本可以随机产生种子值,然后创建一个并加以运行。种子值应当与运行结果一起记录下来。为了复现一个故障,可以用这个种子重新创建(因为可能不希望保留所有的可运行程序,其数量可能达到几千个),然后在短时间内复现这个问题。 在实际的芯片上可以运行更多强化,因为其执行速度要快得多。但在理论上,它可能还是要花费同样长的时间,因为比较常见的问题应该在芯片生产前的强化中就已来了。在这里,问题的复现同样是一个很大的困难,读者可以尝试在芯片生产前的中应用所介绍的技术,但它可能不会同样有效,因为实际可能不如在下那样确定。换句话说,两个采用同一随机种子运行的可能不会每次都相同的运行序列。另外,此时也无法记录内部的行为,因此应该依靠一些技术,如将检测点的信息记录到存储器或高速端口、各种逻辑分析仪触发事件,以及采用其它技术来帮助深入跟踪问题的详细情况。 在实际芯片上调试问题时,没有什么通用的。设计人员应当周密考虑,并象即将遇到难以捉摸的故障一样来进行计划,编写程序代码,为分析问题提供尽可能多的线索。 此外,框架还应该包含这样一种能力,它创建的运行程序能将某些模块排除在外,从而使强化无需在已知的问题上停止下来而得以继续运行。另一方面,将其余功能排除在外也将使设计人员能够对某些特定的芯片功能进行重点。 框架需要组织良好的代码来生成种子、创建、运行、存储记录和后续处理,并向设计人员报告所遇到的问题。这个应当是完全自动化的,这样就可长时间运行而无需人员。 记录 强化框架少应该记录哪个模块在运行,以及发生的所有故障。完善的记录将包括更多的信息,如选择的随机参数,各个事件是何时启动、退出和检验(针对检验函数)的。这样,设计人员就可以了解各个是如何相互联系地运行的。后续处理可以生成一些有用的报告,以显示的覆盖范围。 记录功能时,应使强化尽可能简单方便地记录事件。在下,可编写HDL代码来提供一个记录外设,这样设计人员只需写下一个数值记号,HDL就将产生完整的记录信息。在实际芯片上,可以将字节记号和数值发送到存储器板卡或输出到调试端口。关键之处是要避免记录操作本身过多占用宝贵的运行时间,并。通过后续处理,可以使记录更清楚、更美观。
SAL-XC866-2FRA5VBE
MP2329CGG-Z
K4G163222A-QC80
TM4C1230E6PMI
LPC1752FBD80
ISD4004-08MSY
OHD5R-70B
S29GL512T10GHI010
MS860702BA01-50
MAX3096CSE+
BQ21040DBVR
TLE4998C3C
AD9173BBPZ
ISL6620IRZ-T
U2513B-I/M2
LTC6363HMS8#PBF
FX-411GP
LT075HVXEDD#TRPBF
MB39C011APFT-G-BND-ERE1
SAK-TC336LP-32F200SAA
ECO50ESA103
RE115L32D473
NV133QHM-A51
6MBI150U4B-170
71V3556SA100BQ
HI3520RBCV100
MCIMX31LVKN5R2
47C04-E/P
STM32F723IET6
VNC2-32L1B-TRAY
CY8014LQI-421T
HIP2100EIBZ
K4A4G085WE-BCRC
XM5062-ADJ
16214851
XC5406-TQ100C6234
BC63B239A04-IQD-E4
ISL6620IRZ-T
RO116SFZ1A472
SN74CBTLV3861PWR
WS013Y1M-T40-69P0
STM32G070KBT6
STM32F101R8T6
2S228-T1-A
GD32F303VCT6
ATSAMD10D14A-MUT
CY2309SXC-1HT
93C56A-I/ST
AT24MAC602-SSHM-B
H9QT1GGBN6X129N
141404-2
DP83825IRMQT
XC7Z010-2CLG400I
T5090PE-SD-F
CL10A475KQ8NNNC
K5N5629ABA-AD11
TU2046BIRHBR
MC68HC711E20MFN2
LMV344MAX
88W8310-BAN
LT1963AEST-1.8#TRPBF
HC220F780NAK
MP150GJ-Z
L128ZC-75MN2
MAX492CPA+
5STP34Q5200
AS4M16D1A-5TIN
5962-9476201MX
CXM3024XR-T9
SCGD1B0207
NV140FHM-N4B
IMX305LQR-C
ADM809TART-REEL-7
SP4001111XTMA1
RH03E1C15X
HTU21D
DP-002-P
NV156FHM-N34
K9F2G08UOB-PCBO
GXL-15FUIB-C5
K4X2816E-LGC2
74LS32PC
EX-11B-R
TEMD7100X01
FD-R41
EX-L262-J
PI5V330SQE
LN61CN2702MR
ADCLK914BCPZ
CS5322-BL
LT1130AISW#TRPBF
XM700F144K1536AAXQMA1
MAX3380ECUP+T
OV9620
HDSP-H111
2SK1648S
FT230XQ-R
CXD2099AR-T6
HPP845E031R5
ACPL-K49T-500E
STC3115IJT
SD5112RBC
AFT09S282S
SKQYAFE010
LS-501-C2
HD74HC09FPEL
VA3A5JZ967
LTC6241IS8#PBF
ISL95831CHRTZ
PCAL6408AEX1Z
74HC21D
XC6SLX150-3FGG484C
HD64F5388FJ16
PCM1770PWR
NB691GG-Z
MAX3085EIM/TR
GX-H12A-P-C5
TPS54560DDAR
NT156FHM-N43
ISL95870BHRZR5673
S25FL256SAGBHI203
LT1413
TCR2EF33,LM(CT
XC2S30-5TQG144C
STM32F215ZGT6
S25FL128SAGBHI213
XM200-F64F256AB
HD74HC00RPEL
- 回收激光头激光器 激光管模组 2024-11-23
- 回收LR-W500C LR-WF10C基恩士 2024-11-23
- 回收AMD处理器英特尔处理器 2024-11-23
- 回收海思ss528v100开发板 2024-11-23
- 回收RS485ID读卡器/RS485读头 2024-11-23
- 回收不通电进水生锈扫码器 2024-11-23
- 回收锐捷3062路由器 2024-11-23
- 回收松下图像处理装置 2024-11-23
- 回收Lenze伦茨操作面板 2024-11-23
- 回收USB摄像头智能小车摄像头 2024-11-23
- 回收松下光纤传感器 松下区域传感器 2024-11-23
- 回收基恩士二维码识别相机 2024-11-23
- 回收松下光电传感器激光传感器配件 2024-11-23
- 回收库存沁恒 回收爱迪克 2024-11-23
- 回收COGNEX扫码器控制盒 2024-11-23