厦门莫格电气自动化有限公司销售
ABB INICT13A、PBA20000
欢迎来电咨询!
INICT13A、PBA20000
INICT13A、PBA20000
您迈开询价的一小步,我还您成功的一大步。
尽管许多嵌入式工程师充满了希望和梦想,但高可靠性的代码不是一蹴而就的。它是一个艰苦的过程,需要开发人员维护和管理系统的每个比特和字节。当一个应用程序被确认为“成功”的那一刻,通常会有一种如释重负的感觉,但仅仅因为软件在受控条件下的那一刻运行正常并不意味着明天或一年后还会运行正常。
从规范完善的开发周期到严格执行和系统检查,开发高可靠性嵌入式系统的技术有许多种。本文介绍了7个易操作且可以长久使用的技巧,它们对于确保系统更加可靠地运行并捕获异常行为大有帮助。
技巧1——用已知值填充ROM
软件开发人员往往都是非常乐观的一群人,只要让他们的代码忠实地长时间地运行就可以了,仅此而已。微控制器跳出应用程序空间并在非预想的代码空间中执行这种情况似乎是相当少有的。然而,这种情况发生的机会并不比缓存溢出或错误指针失去引用少。它确实会发生!发生这种情况后的系统行为将是不确定的,因为默认情况下内存空间都是0xFF,或者由于内存区通常没有写过,其中的值可能只有上帝才知道。
不过有相当完备的linker或IDE技巧可以用来帮助识别这样的事件并从中***系统。技巧就是使用FILL命令对未用ROM填充已知的位模式。要填充未使用的内存,有很多不同的可能组合可以使用,但如果是想建立更加可靠的系统,***明显的选择是在这些位置放置ISR fault handler。如果系统出了某些差错,处理器开始执行程序空间以外的代码,就会触发ISR,并在决定校正行动之前提供储存处理器、寄存器和系统状态的机会。
技巧2——检查应用程序的CRC
对嵌入式工程师来说一个很大的好处是,我们的IDE和工具链可以自动产生应用程序或内存空间校验和(Checksum),从而根据这个校验和验证应用程序是否完好。有趣的是,在许多这些案例中,只有在将程序代码加载到设备时,才会用到校验和。
然而,如果CRC或校验和保持在内存中,那么验证应用程序在启动时(或甚至对长时间运行的系统定期验证)是否仍然完好是确保意外之事不会发生的***途径。现在一个编程过的应用程序发生改变的概率是很小的,但考虑每年交付的数十亿个微控制器以及可能恶劣的工作环境,应用程序崩溃的机会并不是零。更有可能的是,系统中的一个缺陷可能导致某一扇区发生闪存写入或闪存擦除,从而***应用程序的完整性。
技巧3——在启动时执行RAM检查
为了建立一个更加可靠和扎实的系统,确保系统硬件正常工作非常重要。毕竟硬件会发生故障。(幸运的是软件永远不会发生故障,软件只会做代码要它做的事,不管是正确的还是错误的)。在启动时验证RAM的内部或外部没有问题,是确保硬件可以如预期般运作的一个好方法。
有许多不同的方法可用于执行RAM检查,但常用的方法是写入一个已知的模式,然后等上一小段时间再回读。结果应该是所读就是所写。真相是,在大多数情况下 RAM检查是通过的,这也是我们想要的结果。但也有***的可能性检查不通过,这时就为系统标示出硬件问题提供了***的机会。
技巧4——使用堆栈监视器
对许多的嵌入式开发者而言,堆栈似乎是一股相当神秘的力量。当奇怪的事情开始发生,工程师终于被难倒了,他们开始思考,也许堆栈中发生了什么事。结果是盲目地调整堆栈的大小和位置等等。但该错误往往是与堆栈无关的,但怎能如此确定?毕竟,有多少工程师真的实际执行过***坏情况下的堆栈大小分析?
堆栈大小是在编译时就静态分配好的,但堆栈是以动态的方式使用的。随着代码的执行,应用程序需要的变量、返回的地址和其它信息被不断存储在堆栈中。这种机制导致堆栈在其分配的内存中不断增长。然而,这种增长有时会超出编译时确定的容量极限,导致堆栈***相邻内存区域的数据。
***确保堆栈正常工作的一种方法是实现堆栈监视器,将它作为系统“***”代码的一部分(有多少工程师会这样做?)。堆栈监视器会在堆栈和“其它”内存区域之间创建一个缓冲区域,并填充已知的位模式。然后监视器会不断的监视图案是否有任何变化。如果该位模式发生了改变,那就意味着堆栈增长得太大了,即将要把系统推向黑暗地狱!此时监视器可以记录事件的发生、系统状态以及任何其它有用的数据,供日后用于问题的诊断。
大多数实时操作系统(RTOS)或实现了内存保护单元(MPU)的微控制器系统中都提供有堆栈监视器。可怕的是,这些功能默认都是关闭状态,或者经常被开发人员有意关闭。在网络上快速搜寻一下可以发现,很多人建议关闭实时操作系统中的堆栈监视器以节省56字节的闪存空间。等等,这可是得不偿失的做法!
LXD63***0
RL-3200S
1756-A10
1756-DNB
1756-ENBT
1756-IB32
1756-L61
1756-OB32
1756-PA75
1756-TBCH
01984-2518-0002
1734-IB8
1734-IE8C
1734-OB8E
EP 3640-1436-7-56BC
BUG622-28-54-B-009
C500PS222E
DSQC6043HAC12928-1
E-Z32
Z32
6EP1436-2BA00
IC693ACC310
IC693CBL300
IC693CHS393
IC693PWR330
IC694TBB032
XVME-674
TAU ACC-24E2A
16903A
140ACI04000
140CPS21400
140CPU65150
140DDI35300
140DDO35300
140ERT85410Z
140NOE77101
140XBP01000
140XCP51000
140XTS00200
E4410-60170
1756-A17
1756-A7
1756-CNBR
1756-ENBT
1756-IB32
1756-IF8
1756-L61
1756-N2
1756-OB32
1756-PA72
1756-TBCH
1757-SRC1
1757-SRM
1784-CF64
1786-TPS
1786-XT
XBTF024110
XBTMEN08
MC-4
1771-P2 A
PA2800
VA24H1500
UDX5105
1756-L61
6ES7214-2BD23-0XB8
M100DC
1786-RPA
1756-BA1
1756-PA72
1794-OW8
50SCCM
140CPS11420
140CPU11303
140CPU65150
140CRP93100
CPS-420F
JZNC-NIF01B-1
JZRCR-NPP01B-1
JZRCR-NTU01D-1
SGDR-AXA01A
TSX3708001
TSXDMZ28DR
PC832-001-T
6***6671-1CB00-0AX2
6ES7315-2EH14-0AB0
6ES7321-1BL00-0AA0
6ES7322-1BL00-0AA0
6ES7332-5HF00-0AB0
6ES7355-2SH00-0AE0
6ES7390-1AJ30-0AA0
6ES7392-1AJ00-0AA0
6ES7392-1AM00-0AA0
6ES7953-8LL11-0AA0
6ES7972-0CB20-0XA0
升级6***6642-0BA01-1AX1
6NH9720-3AA00
IC693CPU311
IC693MDL645
IC693MDL940
1756-IB16
1769-L35E
EDS-305
IC693CPU374-GV
SGDM-20ADA
SGMGH-20ACA61
PC832-001-T
6ES7216-2AD23-OXB8
6ES7231-OHC22-OXA8
6ES7307-1EA01-OAAO
6ES7315-2AH14-OABO
6ES7331-7KF02-OABO
6ES7365-0BA01-OAAO
6ES7392-1AJ00-0AA0
6ES7953-8LJ30-0AA0
EM140AF4-05
3HNE00442-1/06
2203 16 IN/16
A06B-0826-B100
VE4001S2T2B4
VE4002S1T2B5
VE4003S2B1
VE4003S5B1
VE4003S6B1
MHD 093C-058-NP1-BN
140ACI03000
140CPS11420
140CPU43412A
140DAI75300
140DAO84210
140NOE77101
1769-IQ16
1769-IR6
1769-L31
1769-OW8
1769-PB4
6ES7 331-1KF02-0AB0
MHF-D100LR
ER-JG-7200D
SC14PT
6SE6440-2UD32-2DB1
S263-D16
PTQ-PDPMV1
P0973HA
5X00105G14
ACS800-01-0006-3+P901
ACS800-01-0120-3+P901+D150
KPS-600/20-ESC
600/20-ESC
1756-DNB
AK-BX56M
6SE7031-8TF60
1336F-B125-AN-EN
PS-DA0125-043(S)
PS-M06D12S5-NJ1L(S
6SE7037-OEK60
IC3645LXCD1
GPD515C-B034
1757-SRM
AM-SA85-000
AM-SA85-002
OKYM 6 W 22
N-2302-1-F04AA
3503E
3604E
3700A
6EP13363BA00
3540E
3706
3708E
9566-810
9765-610
9766-210
1606-XLE240E