欢迎光临 驰兴科技有限公司官方网站! 简体版 | English | 联系驰兴 | 网站地图
客服热线:
0755-29452870

专业生产及销售电感制造商

联系我们
驰兴科技有限公司

客服热线:0755-29452870

公司传真:0755-61658369

公司邮箱:sales@coilank.com

公司地址:广东省深圳宝安区民治街道创业花园创新大厦12F

单片机

当前位置: 首页 > 新闻资讯 > 技术支持 >

如何做安稳单片机程序(40点)

时间:2016-08-23 11:26来源:未知 作者:admin
如何做安稳单片机程序(40点):

1.间断和 main函数或其子函数 里不要同时有同一外设模块信号的操作,如对74hc595的操作,对HT1621B的操作的信号线有必要是有序的,而不能交叉,否则简略失调或花屏

2.间断里标志位变化时,回main函数或其子函数后尽量再区分符号位,否则简略致使遗传前次标志位的效果,而没有及时发现间断回来后标志位已改动,而致使程序失调

3.类似于信号量临界区的安稳性处理

4.对全部死等待如等待某标志位 ,做超时退出处理,防止卡死

5.全部数组下标尽量在拜访数组前都做下标是不是越界区分
       b.做除零失常区分,假设分母为零就不除
       c.留意:假设程序里有很多个守时器或多个高速外部间断在工作,并且守时频率都很高,那么假设栈空间分配很小,那么很简略发生嵌套的多层次抢占间断而在进入间断函数时发生局部变量分配储存空间时失利即库房溢出,而致使死机和卡死!,尽量
把功用用分支if做到1个守时器间断里,少用守时器,并尽或许减小守时器频率,并尽或许加大栈初始化空间,如stm32单片机里 .s 文件里的一些定义

6.对于一些潜在的不安稳要素(甚至1-2个月才出现一次缺点),比如网络忙时包ID的先后次第发生变异,而致使if xxxx.id>old.id 永久无法再树立而卡死

7.多机通讯尽量用单向通讯,比如主从方式,主机发包轮询查询并从机回来效果方式,双向的全双工通讯方式的安稳性比较差

8.全部按钮处理有必要做按钮去颤抖算法,甚至不是阻塞式延时式的去颤抖算法,而是情况机时的异步流程办法的过滤掉按得过快的2次按钮工作距离,比如200ms内再无按钮工作且按钮已没按住才算按了1次,并且最好加个104电容在按钮里并联

9.多机主从通讯尽量用 意图机ID+通讯协议版别号+分包的子包ID序号(如1-10)+子包总数+本子包数据长度+前次包的全局ID+crc32校验,办法来处理重复 包,30ms内没收到从机反应数据则重发包(比如重发4-6次)来处理丢包,并其时次包的全局ID大于一定值时发清零包ID的cmd包来复位ID计数,但 要区分从机先收到大点的ID的包的情况

10.网口通讯比usb通讯安稳,usb在烦扰时简略掉线

11.TF卡只适合做只读的fat32文件系统运用,如要常写入,最好合作 W25q64来固定分片办法的无fat32文件系统式的写入,由于TF卡常写入,简略写坏文件系统格局,比如意外掉电时等

12.对于一些串口接口的模块,假设波特率用得太大,则单片机简略串口间断照应不过来,而发生嵌套的失常串口间断,或丢串口数据,致使通讯不安稳,波特率最好低点!

13.单片机程序的架构最好做成异步式的情况机式的虚拟多线程办法,不要用任何阻塞式的死等待和延时,延时也要做成情况机里的某个情况的delay的异步 非阻塞式的累加,加到一定值才进入下1个情况码,异步办法比阻塞式的办法的安稳性要好,处理实时性也高,多级菜单的屏幕闪现和按键处理也可以用情况机式的 异步流程,有个情况码指示其时菜单的第1级选择项号,选择深度,第2级选择项号。。。。

14.一样的类似的归于同一功用概念下的处理进程最好集成到一个函数里做分支区分,而不要把1个功用松散到很多个函数里,这么代码比较难保护和二次批改

15.可以抽象为1个功用或1个流程体内的东西最好归纳法和抽象法抽象一下,不要做成if分支遍历和穷举全部情况办法,就像要做成矢量图,而不是像素图,抽象归纳后的代码写法更有简练性,更
有可保护性和安稳性!.复杂度尽量做成可配备数组里的数据,用配备数据来翻开对代码的控制,而不是把复杂度全部映射到代码if分支等分支上,就像要做成矢量图,而不是像 素图,就像一个图形圆在可配备数组里(矢量图里)是 yuan_type和sin cos,而假设代码分支法,则是成堆对于圆的点阵按15点所说的抽象和归纳代码后的代码简练化和可保护性加大化,可以使代码的条理和逻辑层次更加清楚,使更简略分析和预感到或许的bug和细节逻辑不谨慎,然后防止bug和不安稳性bug,终究影响程序工作时安稳性,所以bug是由思维抉择的.

16.看门狗在程序完工后最好加上去,软件里的要害数据最好做RAM区多处备份,如备份10份,死机自动复位康复后,检查RAM区里备份里的各备份,重复 次数最高的那几份备份(且重复次数在6次以上)最或许为初始未被损坏的数据,并做个ram标志位检查是上电复位,仍是看门狗复位,复位后可以做不根除 ram数据,程序跑飞后,可以提前做些标志位区分,如跑飞到某处,或许某标志位未被置位却实行到这,则可以自动区分出是已跑飞,则自动软件复位一次!

17.单片机芯片的近期的外围一圈上的单片机芯片vdd,gnd引脚附近有必要多弄几个0603封装的贴片104电容来往不断烦扰,pcb电源类走线的线宽有必要要宽,最少0.4mm以上,甚至0.8mm以上,单片机芯片在pcb局部时尽量挨近电源芯片和供电芯片处;就单单才零点几欧电阻的导线稍微长点来传电源,比如20cm长,就会致使高频杂波变多,所以导线结尾必须加470uf以上的电解电容来往不断耦滤波,可以梦想,在单片机引脚周围1圈上也应当最好加上几个470uf电容和104电容环绕大功率pcb供电线走线千万不要在单片机周围走线或走过单片机,一定要把大功率电源的输入接口做在大功率电路有些的附近,防止电源线的长距离走线!,要走也不要在单片机外周走过!,且大功率pcb供电线走线要边走线边1路隔个几段距离就加个104去耦电容

18.假设是软件仿照spi信号接口或i2c接口,那么字节发送函数里最好先阻止总间断使能,发完后再翻开总间断使能,否则简略不安稳

19.c8051f340单片机芯片工作时假设电源电压比较低或有俄然的电源脉冲浪涌烦扰,简略使烧好的程序扔掉,安稳性好像不怎么好,stm32单片机芯片或GD32芯片好像就好点,就没这个疑问!,举荐优先选后者

20.对于以太网网络模块芯片运用,最好把这芯片的RST复位信号接到单片机上,并RST脚接个104电容(有时候烦扰简略致使意外硬式复位,而反而不安稳),这么,网络卡死时可以强行复位网卡芯片一次来批改

21.lwip等网络协议栈的某些版别有或许有内存泄露bug,或长时间工作后卡死,最好做守时自动软件复位单片机功用,来防止内存泄露过度

22.芯片上假设flash够,最好做从效力器查询新版BIN固件来自动晋级单片机自身的hex固件功用(固件下载完要做CRC32校对),以及usb的固件升 级功用,即net bootloader和usb bootloader,来应对【做项目即使结束和检验后,几个月出现的bug要批改,而措手不及】

23.比如 休眠后唤醒时给PB1引脚1个高电平后不明要素的死机,不一定是进入未定义间断,而是main函数之前bootloader对PB1照应:主程序进入休眠 态,唤醒后 pb1为高,进入bootloader态,但bootloader里没有从头初始化stm32 cpu的时钟系统等,故卡死,虽然bootloader后跳转到的main里有从头初始化stm32 cpu的时钟系统等的代码,但是已实行不到

24.密脚芯片单片机等ic焊接时上松香吸锡后,假设用酒精清洁,是不是过几个月后会发生引脚间松香,助焊剂等物质发生蜕变而短路?而不安稳?

25.缺点实时监测功用很首要!(备灾1):比如某stm32版的带网口的板子做个板子是不是在线监测和掉线时短信提示功用,即每10秒钟发送1个心跳包给效力 器,假设效力器50秒内没收到某板子的任何心跳包,则此板子判为已掉线,并发送报警短信,email给对应的技术员来通知处理和批改

26.同一个安装点上弄多个冗余板子,某块缺点时,另1块自动切换到上线!,或双电源,1个后备电池逆变电源,主电缺点则自动切换到备电(备灾2)

27.电源接插头不要用圆孔的那种电源插座或usb接口插座,要用专用的接线端子母座和接线端子插头(绿色方形的带2针的那种,最好还带上扣机制,插紧后自动上扣),否则电源不稳或接触不良,致使板子掉程序或其他失常,信号线也可以如此处理

28.回流焊终究1段温度曲线的抵达最高温度时如坚持时间过长(举荐205度坚持15秒,对于无铅锡膏)致使锡膏被烤干,或锡膏过期了,就会致使出来后焊接效果欠好,比如焊盘上锡的亮度不高,无光泽,太干燥,这时简略影响产品功用和加速日后的产品功用衰变

29.eeprom写入前不需要擦除全部扇区,比如at24c02之类的,而单片机自带的flash和w25q64等都是flash,写入前假设不擦除全部扇区,或许有些字节会写错字节,而致使失常和不稳,或许做了擦除处理,但是写某个数据时
未备份扇区里原数据而直接擦除扇区,致使数据扔掉,比如要写入的数据数组跨过了2个扇区的距离的情况

30.尽量不要用一些外置的啥is62lv256+ls373方案的拓展ram内存办法,而要直接用自带高ram大小的192K ram的单片机,比如stm32f407或stm32f103zet,stm32103re ,gd32f103cb等,由于外扩办法简略不安稳,比如受焊接质量,打板精度,环境湿度温度,电源不坚定等影响
而不稳

31.递归函数尽量用while/for循环+栈或数组或链表的办法来代替,而不要做成多层次调用函数自身办法的递归,做也做成带递归深度变量的,束缚最大递归深度,否则简略库房溢出而死机

32.当要进行或许的成果极端风险或非常首要,不能被任何烦扰误触发的控制操作时(比如房子爆破队驱动炸药燃烧的设备,自动驾驭的急迫刹车制动驱动器,高压总闸开关继电器),必须要备份10份以上的
控制码,假设只需1份控制码,当这份控制码被强烦扰信号改动内存数据而变为致使触发的政策控制码时,就会误动作,而假设是10份,会校验全部10份控制彻底共同后再翻开控制,这么只需1份或2份被烦扰
后就不会误动作了,全部内存区的任何变量也都实时备份10份以上,这么被烦扰后可实时康复精确的数据(残留下的重复次数最多的那几份且重复次数在6次以上即为未损坏数据),
当10份备份中重复次数在6次以下,意外着系统也无法自个自我批改,就会自动进入溃散情况或自动软式复位,
再进行首要控制或驱动前,也检查全部内存区的各变量的实时备份的10份数据,假设任何一个变量的10份备份中各数据间重复次数在6次以下,则意外着烦扰太强了,系统已失调,则不继续进行首要控制或进行驱动。
,进行i/o控制的代码最好在前面多加几百行陷井代码和区分是不是已被烦扰弄溃散的代码,来尽或许减少意外直接跑飞到【进行i/o控制的代码】的概率,或许不用任何简略的i/o来控制首要设备或高压的首要设备,
而用i2c或spi接口的外围驱动芯片来直接控制,且i2c或spi有必要为软件仿照,在i2c或spi的发字节函数里,每发1个比特就再区分一次【是不是已被烦扰弄溃散即检查全部变量的10份备份是不是还算无缺和共同】,
这么就非常可靠和安稳,不会被强烦扰弄误触发了!

33.在存在强电流,强功率,强电压,强静电,强射频耦合传递,或或许有接触式火花的本地尽量多的加光耦隔绝来隔绝信号控制计算处理有些和高压信号驱动有些,假设一个系统上存在2个或以上独立供电电源,
相互之间也有必要彻底隔绝(GND等都不要接一起),用光耦耦合来传递控制,
继电器尽量换为可封闭的晶闸管,或场效应管,或其他大功率开关管,这些控制开断时有【无火花】的利益,防止继电器通断时的火花放电空地致使的强烦扰,假设实在要用继电器,在继电器的2触点引出脚直接入RC去火花电路,
,并在继电器的2触点引出脚控制的真空电磁阀或电机等感应负载上反向并联入【1个高耐压二极管+串1个0.5欧支配的大功率电阻】,以及并联入1个别积大的104电容,来往不断除真空电磁阀或电机等在断电霎时间发生的
反向电动势,然后消除反向电动势在继电器触点刚断开时的细小空地里发生火花,然后消除火花发生的强烦扰来使单片机跑飞,死机或复位的成果,其他假设用继电器,最好每个继电器的VCC串1个10欧的电阻后再控制继电器,这么继电器吸合时对电源的脉冲烦扰小点!

34.做编程项目或电子项目,必须做一个 发现的未处理的程序bug的备忘.txt ,及时记载发现的偶尔出现的bug,和俄然构思里闪现的预感到的或许会出现的bug情况,以及要改进的本地,
比如一些操作不变鸡肋疑问,安稳性疑问,都要及时记载,由于假设每忘掉1点点bug,都意味着或许日后会出现这个bug,即致使项意图彻底失利,究竟【一个项意图成功是靠堵住全部一些或许的细节虫洞和鸡肋来做到的】

35.假设是在别人的翻开途径或接口上做程序,那么需要定时检查全部情况都是不是正常,比如即使今天全部正常,但是他们途径或许早就换了接口版别,只是老用户仍是保持老版别接口,新订货的用户用我们isv软件时却已切换到新接口,不能用,却发现不了

36.字符串数组即二维的uchar数组,在定义时,前1个方括号索引字符串序号,后1个方括号索引其时字符串的字符下标,比如u8 wavfile1n[7][15] 代表7个最长14个字符的字符串,方括号别弄反了,简略失常

37.板子上电源处加的电解电容在1000uf以上时,简略上电时电容霎时间电流过大而致使开关电源发生短路保护,如此循环,而不易发起

38.EMI:pcb电源输入有些增加共轭电感器克制中高频的共模噪声,并加共模滤波电容(2个电容串联,2端接电源正负,中心点接地)和差模滤波电容

39.假设要抗雷击浪涌,应在电源输入处并联入动作电压大于额定电压2-3倍以上的压敏电阻,并且电源输入处pcb走线宽度要粗,并电源输入处的压敏电阻前的走线串联入玻璃保险管的座的有关元件

40.pcb信号线的走线尽量短并且宽: pcb布线时选择合理的导线宽度 由于瞬变电流在印制线条上所发生的冲击烦扰首要是由印制导线的电感成分形成的,因此应尽量减小印制导线的电感量。印制导线的电感量与其长度成正比,与其宽度成反比
晶振走线有必要尽量短:           时钟线、信号线也尽或许挨近地线,并且走线不要过长,以减小回路的环面积
信号线走线角落应选用圆弧形:   电路板上的印制线宽度不要骤变,角落应选用圆弧形,不要直角或尖角。(9)时钟线、信号线也尽或许挨近地线,并且走线不要过长,以减小回路的环面积。
坚持环路面积最小,降低烦扰对系统的影响,前进系统的抗烦扰功用。并联的导线紧紧放在一起,运用一条粗导线进行联接,信号线紧挨地平面布线可以降低烦扰。电源与地之间增加高频滤波电容

选用无缺的地平面计划,选用多层板计划,铺设地层,便于烦扰信号泄放。

 

首页| 磁胶电感| 一体成型电感| 产品中心| 电感定制| 荣誉资质| 新闻资讯 关于驰兴| 联系驰兴|