最后一个bug

其他

当MCU死机了,先把硬件抓过来~

正文大家好,我是bug菌!上一篇文章跟大家聊了一下软件开发中偶发性问题的处理办法,这些都是手段,看似不是很难,其实最重要还是对问题的敏感度,而这份敏感度来源于你对整个系统的理解和把握。当你能够尽快的缩小问题代码的范围,在一定程度上就已经加快了解决问题的进度。在上一篇文章末尾bug菌提到MCU程序直接死了以后软件上也有力不从心的时候,这时候我觉得你应该把做硬件的哥们揪过来了。做嵌入式软件的朋友们也不要太高估了自己,虽然大家可以把硬件秀起来,但是你拯救不了“无药可救”的硬件。不要一头扎到代码的调试中,而是更多的分析现场和一些可能性的问题,先排查一些更加常见且易查的硬件问题,此时此刻示波器得秀起来~1电源问题对于电源问题引起的死机,在这么多年软件调试过程了至少有碰到过10次左右,特别是一些经验不是特别丰富的软件工程师们在开发的过程中很少去质疑硬件问题,所以一言不合就从嵌入式软件开始排查,同时也有许多硬件伙计觉得软件可以优化非常多的硬件问题。所以嵌入式软件没有一定经验在调试硬件问题会比较难受,那么对于电源这块能量的核心,主要是电压、功率和稳定性等。大部分芯片都会有一个稳定运行的电压范围,过高或者过低都有可能导致运行异常,注意是可能,不是一定,甚至同一个型号,不同批次的芯片都有所差异~所以功率不够,电压过低会导致芯片内外供电不够,使得相应模块、外设运行异常,最终程序死机、跑飞是经常发生的。特别是整个系统的功率需求并不是特别稳定,且电源的设计并没有太多的余量,当出现比如动作继电器等等功耗较大的动作时,其电源就有可能出现不稳定状态,最终影响到芯片运行。当然如果你是购买的劣质或者参数虚标的电源,就要更多的去测试和监控一下电源的稳定程度了。所以bug菌目前亲自开发的项目,在项目的设计评审初期,会要硬件多留一个MCU的AD采样电路用来实时采集供电电压等,软件内部做一些快速的电压保护或者故障侦测,以检测出大部分电源异常问题。2复位电路干扰相比电源问题会少一些,不过也遇到过几次,大部分都是板子刚打样回来上电调试的时候,MCU直接不运行的情况,大多都是复位电路中的电阻或者电容贴错了,虚焊了等等;如果是采用复位芯片的大多估计供电不足,选型有问题等等。不过有一次遇到是在PCB走线上,复位电路与功率部分挨得比较近导致MCU概率性复位,当然如果有使用外部看门狗的话就更需要排查一下了。3晶振失效或受干扰晶振本身失效或者受干扰,一般MCU都会选择外部晶振,相比内部的会更加准确一些。然而对于这个MCU的心脏也是有概率出问题的,之前有个项目采用定时测量时间,每次测量信号的误差都是忽大忽小,后来直接把捕获的信号用IO信号翻转出来与实际信号进行对比,发现并无差异,才定位到是计时这块的频率出了问题,最终定位外部晶振电路存在干扰,导致时钟频率发生变化,最终影响测量结果,如果干扰再大一些估计就跑飞宕机了。对于当出现了一些死机或者计时不准的问题,不仅仅要看软件,也要从硬件晶振时钟这块进行排查,所以对于目前主流的一些MCU都会存在时钟频率输出的引脚,一方面是用来供外部进行内部时钟的监控,另外一个应用就是进行不同芯片之间时钟上的同步。4最后几小点最后,静电问题说实在的在开发中真的是虚无缥缈的存在,曾经一个伙计徒手换芯片,10个芯片换上去,坏了一半,大概率是因为天气比较干燥,用手触碰了几下芯片,后来硬件人手准备一套装备~同时在系统中与MCU没有隔离的IO口,通信等等都要做好保护,这些对外的接口会把静电、或者是浪涌电压等引入MCU内部,使得MCU内部逻辑混乱导致死机。高速运行的MCU会受外界辐射等电磁干扰,做好一些屏蔽措施等。基本上遇到的MCU死机或者复位暂时就总结这么多吧,以后再想到一些再写写~最后
2021年8月12日
其他

芯片短缺,如何快速上手并替换一款MCU

正文大家好,我是bug菌!近段时间国外芯片短缺、涨价使得一些依赖性比较强的企业苦不堪言,在一个项目中重新对一款芯片的评估和选型需要花较多时间和精力,更别说软件工程师对相应芯片的熟练度的评估和芯片自身的问题了。其实近些年来国内也加大了芯片和半导体的研发和生产,一些国产芯片也获得了较大的突破和提升,面对芯片等等长时间的交期问题,对于一些中低端产品,企业也开始了转向国产芯片的替代方案。当然做到100%兼容一般是不太可能的,多多少少存在差异,只要芯片性能和功能上能够覆盖,对于一个合格的软件工程师替代并不是太大的难事,bug菌了解到这也是前段时间某知名企业大力招聘嵌入式软件研发工程师的原因之一。这也就回答了一些初学MCU爱好者的疑问:我是不是只需要玩一款MCU就可以了。答案是:可以的,但是你不可以只会一款MCU,要做到一通百通,否则学习成本实在是太大了。那如何快速上手并替换一款MCU呢?1对比选型
2021年4月10日
其他

【进阶】三种" 堆栈溢出检测 "方法,请拿去吹牛!

本文主要是跟大家分享三种堆栈溢出检测的方法,也算是接着之前分享的堆栈溢出分析的续篇。2、正文部分在阅读本文前建议大伙阅读往期文章
2021年1月7日
其他

【进阶】" 堆栈溢出 ",也就这么回事!

盲目的分配过大的堆栈空间,无非就是对资源的浪费。如果你的项目能够让你这样任性,那你们产品成本估算就真是个形式。所以合理的分配堆栈大小是非常重要的,首先我们得看看堆栈中主要放些什么
2020年12月30日
其他

【原创bug】如何看出应聘公司研发实力?

对于还在学习提升阶段的朋友们可能这招并不是非常适用,往往稍不注意语言上的艺术就容易恼怒面试官,然而对于稍有些工作年限和技术的伙计,这样的技术交流和切磋,或许是你打开一个陌生公司的最好方式。
2020年12月15日
其他

【MCU】一种"灵活且省资源"的IAP升级方案

该方案通过外部加载相对较复杂的boot2到RAM中运行,从而可以大大节省Flash,那么boot1的功能相对就比较简单,当APP完整且不需要进行升级的时候,直接从boot1跳转到APP执行即可。2
2020年11月25日
其他

【bug菌的文章】你还错过了哪些?

(防窥膜原理)☞【TIOBE-5月-排行榜】C语言回归王座(经验分享)☞更多精彩好文正在筹备中......13)转载精品图文☞【设计思维】"真"模块化根本就不需要读源码!☞【干货】Linux进程模型
2020年11月22日
其他

【进阶】"结构体嵌入共联体"在协议解析中的神操作!

*pSendBuff;然后在进行字节流发送,那就简洁很多了。当然在此过程中你还要注意字节序、对齐等等,在往期的文章中bug菌都有讲到,模拟此过程参考下面代码。参考示例:#include
2020年11月18日
其他

【MCU】把"安卓HAL层思想"引到单片机软件开发中

hw_device_t**)device);来调用hal层的open函数得到led硬件操作的led_control_device_t结构体实例,这样应用程序就可以通过该对象使用对应的接口了。
2020年11月17日
其他

【嵌入式C】你有想过"数组下标"为何从0开始吗?

好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地,如果你喜欢交流可以添加下方bug菌微信,我拉你加入公众号技术交流群。推荐好文
2020年11月12日
其他

【MCU】寄存器、标准库、HAL库、LL库,这么多库!你叫我怎么选?

比如上图串口外设的API接口,其第一个参数即为串口的外设寄存器基地址,所以这些函数都是围绕寄存器来进行封装的,说白了就是寄存器的访问封装。相比直接操作寄存器,相关寄存器功能更加明确、易懂。3LL库
2020年11月10日
其他

【程序人生】学不到东西,不想呆在这家公司了!

确实生活嘛,不仅仅只有工作!说到这个份上,我相信你心中已经有自己的决定了!是的,下个月我就准备结账走人了,然后去广州、深圳那边找工作看看,我最近还查了几家公司,到时候去投投简历,看收不收人!
2020年11月6日
其他

【MCU】可怕,别人把我MCU固件给反汇编了!(逆向)

本文主要跟大家分享一个简单逆向stm32固件程序的实例,为了让大家在一款成熟的产品中去考虑加密这一块的技术,不然分分钟被别人copy!2、情景再现咬金,你们公司固件程序有加密处理吗
2020年11月3日
自由知乎 自由微博
其他

【C进阶】"最常见"却又"最不常用"的三个预编译

上面这几个比较"冷门"的知识认真想想其实还是挺有用的,可能现在的产品都急于快速上市,对于代码的雕琢还有所欠缺的,一份成熟的代码不仅仅只是稳定,还有后期的维护、扩展等等都是值得考虑的。
2020年10月28日
其他

【MCU】U-boot2020移植到stm32F4,效果杠杠的!

)当然首先你应该有一个Linux编译环境,最方便的做法就是去目前比较热门的几家Linux开发板商白嫖虚拟机,bug菌使用的是VMware虚拟出来的Ubuntu16.04_X64的环境。2
2020年10月24日
其他

【C进阶】同事笑我 : 有了"宏"你还用"枚举"干嘛?

当然有些小伙伴会使用强制类型转换,甚至有些编译平台可以直接赋值,但建议尽量少用,如果一定要用,务必明确对应平台上枚举类型的大小,否则会存在大值给小值带来的数据范围问题。参考demo:#include
2020年10月18日
其他

【数字电源】数字电源核心理论-"伏妙平衡"与"安秒平衡"

在目前的数字电源中其调制方法主要分为脉冲宽度调制(PWM)和脉冲频率(PFM),当然还有一些其他的调试方法以及混合调制,基本上大同小异吧,bug菌这里就以大家熟悉的PWM调制进行平衡理论的讲解。
2020年10月14日
其他

【C进阶】拿着"sizeof这些用法和坑"去吹牛吧!

点击蓝色字体即可跳转☞【开源】bug菌把"动态数字显示"开源了!☞【嵌入式】bug粉碎机之volatile的那些坑☞【MCU】用stm32的UID给固件加密(重点在加密)☞【硬核C进阶】如何实现
2020年10月10日
其他

【进阶】同事用#include"xxx.c"把我给惊呆了!!

点击蓝色字体即可跳转☞【开源】bug菌把"动态数字显示"开源了!☞【嵌入式】bug粉碎机之volatile的那些坑☞【MCU】用stm32的UID给固件加密(重点在加密)☞【硬核C进阶】如何实现
2020年9月29日
其他

【开源】bug菌把"动态数字显示"开源了!

玩过嵌入式GUI的都有一种感觉,一款成熟的GUI一般都会有其PC端的模拟器,一方面可以实现软件和硬件的同步开发,另一方面在相应图形设计过程中更加高效便捷,其实计算机图形和嵌入式GUI本质都是一样的。
2020年9月26日
其他

【嵌入式】bug粉碎机之C语言变量作用域的坑

同时大家还可以尝试在函数内部extern,或者在其他编译器里面来定义并使用同名变量,你会发现更多有意思的地方,同时也是大家需要注意的地方,最终规避掉这些问题还是需要有良好的编程习惯!3、最后小结
2020年9月22日
其他

【嵌入式】bug粉碎机之volatile的那些坑

对于C语言关键字volatile大家应该都很熟悉了,因为现在非常多的资料一旦讲到该关键字就会把其用法说得明明白白,其中"避免被优化"、“每次变量都从内存中取值”等等之类的词条随处可见。
2020年9月18日
其他

【MCU】用stm32的UID给固件加密(重点在加密)

今天跟大家带来的知识不算难,现在非常多MCU都有全球唯一标识码这个东西,可能大家都了解过,不过具体怎么用并没有实际设计过!下面重点对其加密方面的应用跟大家理一理。2、stm32的标识码UID
2020年9月14日
其他

VSCode和SourceInsight,到底哪个看源码爽?

点击蓝色字体即可跳转☞【收藏】【看门狗软件设计】"喂狗"真那么简单吗?☞【经验】bug菌谈单片机编程"十层功力",你练到了第几层?☞【看门狗软件设计】"喂狗"真那么简单吗?
2020年9月9日
其他

【硬核C进阶】如何实现 万能 "两数交换" 宏 ?

点击蓝色字体即可跳转☞【收藏】【看门狗软件设计】"喂狗"真那么简单吗?☞【经验】bug菌谈单片机编程"十层功力",你练到了第几层?☞【C进阶】一不小心就被"strlen"给坑了!
2020年9月9日
其他

【C进阶】一不小心就被"strlen"给坑了!

得找找size_t的具体实现,通过查找C标准库了解到,size_t是一个无符号的整形类型,如下图所示:上图截取至http://www.cplusplus.com/reference/cstddef/
2020年9月7日
其他

【经验】bug菌谈单片机编程"十层功力",你练到了第几层?

理论与实践更好的结合,能够洞察领域内的潮流技术和发展方向,关注学术理论研究进展,一旦有技术从理论到了产品便能够迅速掌握关键实现点,并带领团队进行研发工作,让产品脱颖而出,更加富有竞争力!3、最后小结
2020年9月4日
其他

【看门狗软件设计】"喂狗"真那么简单吗?

点击蓝色字体即可跳转☞【收藏】get这些技巧,HardFault_Handler排查只需要几分钟☞【C进阶】这种地方别再强制类型转化了,来告诉你个小技巧!☞【MCU】一种单片机节省内存的方法(补充)
2020年9月3日
其他

kFlashFile - 一个基于Flash的掉电数据存取方案

点击蓝色字体即可跳转☞【收藏】get这些技巧,HardFault_Handler排查只需要几分钟☞【C进阶】这种地方别再强制类型转化了,来告诉你个小技巧!☞【MCU】一种单片机节省内存的方法(补充)
2020年9月3日
其他

【硬核】优质 "嵌入式C编程" 必备指南

点击蓝色字体即可跳转☞【收藏】get这些技巧,HardFault_Handler排查只需要几分钟☞【C进阶】这种地方别再强制类型转化了,来告诉你个小技巧!☞【MCU】一种单片机节省内存的方法(补充)
2020年8月31日
其他

【MCU】一种单片机节省内存的方法(补充)

对于MCU节省内存办法大合集bug菌在很早之前就总结分享给大家了,如果还没来得及阅读的小伙伴点击下方链接先学习一波。☞单片机开发之节省内存大法(C语言版本)3、本文补充省内存办法1const的使用
2020年8月31日
其他

从点一个灯开始学写Linux字符设备驱动

if(copy_to_user(&(led_dev.value),buf,1))
2020年8月29日
其他

【整理】一文带你了解"单片机解密"技术

因为单片机是一个活动的电子器件,当它执行不同的指令时,对应的电源功率消耗也相应变化。这样通过使用特殊的电子测量仪器和数学统计方法分析和检测这些变化,即可获取单片机中的特定关键信息。3过错产生技术
2020年8月26日
其他

位操作运算有什么优秀的技巧?(附源码)

关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥位运算百度百科如下:程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作位操作的优势位运算是一种底层的运算,往往比我们普通的运算要快上许多许多位运算是最高效而且占用内存最少的算法操作,执行效率非常高位运算操作的是二进制数,会拥有一些二进制的特性,在实际问题可以方便运用位运算只需较低的空间需求位运算使用能使程序变得更加简洁和优美位运算可以表示一些状态集合运算符号下面的a和b都是整数类型,则:含义C语言按位与a
2020年8月26日
其他

【C进阶】有了"链表"还用"数组"干嘛?被问懵了......

链表---一种不一定有序、不一定连续、不一定相同元素的存储结构。特点:元素不一定相同,只需要存在链接信息;不需要内存连续;非下标访问,通过链接信息遍历。3、数组和链表的异同1相同点
2020年8月25日
其他

【bug菌整理版】听嵌入式大牛讲解硬核单片机编程思想

没有思想的裸程序就如一副人体骨架,有个人形,但没有人样,骨骼之间的关节都是靠胶水或拉线连接起来的,生硬而呆板。如果给骨架包上皮肉,加上灵魂,我们就会惊叹:啊!这是帅哥,这是美女!因为骨架活了。
2020年8月22日
其他

【C进阶】二级指针这个问题被问好几遍!该终结了!

**)ptr)都尝试着打印出来分析分析。所以bug菌在下面把指针的一些知识点都跟大家讲解一下,形成系统的知识,避免一些小伙伴仅学习了一些碎片而一知半解。3、二级指针的使用1多级指针
2020年8月20日
其他

【算法】高效"KMP"字符匹配算法就这么简单

前面我们讲到KMP算法利用已经进行过匹配过的信息进行优化匹配,如上图当进行第一次匹配以后,我们能够利用的信息有两个:1)模式串信息;2)已经匹配过的ababa信息,其他信息暂且还未知。
2020年8月18日
其他

【算法】"暴力"字符匹配算法的C语言实现

不过暴力匹配算法的好处就是理解上非常的简单,也可以说比较呆吧,往往简单的东西更加容易让大家接受,并且应用在实际的项目中,除非特别是对匹配效率比较敏感的项目。3、暴力匹配的C代码实现1参考实现1
2020年8月16日
其他

【收藏】get这些技巧,HardFault_Handler排查只需要几分钟

那么所有的问题都归结到触发中断系统是如何保存中断现场,要回答这个问题大家得看看上面所提到的几点知识。那么下面作者就以两个开源项目中该部分的处理为大家简单介绍一下如何排查fault。3、RTT中的处理
2020年8月11日
其他

【C进阶】同事用void把我给秀翻了!

好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。同时非常感谢各位小伙伴的支持,我们下期精彩见!如果还有想加入公众号群聊共同讨论技术的小伙伴可以添加下方bug菌微信!
2020年8月5日
其他

【C进阶】这种地方别再强制类型转化了,来告诉你个小技巧!

其发生该情况的主要原因是由于4字节float类型变量不能完全覆盖int类型的所有类型数值,所以在进行强制类型转化的过程中会产生精度上的损失,这样大家稍不留意就会有一些不必要的麻烦。
2020年8月1日
其他

【贼稳定】" IO口模拟串口 "之优化半周期法

看过上篇文章的小伙伴应该知道,1/3周期采样法采用的办法是通过采集第二次低电平作为起点来进行IO口电平判断,这样处理的主要目的是为了让检测IO口电平不会出现在串口电平不稳定的位置。
2020年7月29日
其他

【妙招】一份 " IO口模拟串口 " 独门秘籍

那么所有的问题就归结到如何在电平稳定的时候读取IO口的状态,那么最直接的办法就是提高定时器的中断频率,比如1/3bit周期法等等更高的定时器中断频率,如下图所示1/3bit周期法:
2020年7月26日
其他

【进阶】嵌入式编程技法之"数据驱动编程"

在之前的文章中作者在介绍结构体的时候说到了一个妙处不知道大家还是否记得?,在该文中说到结构体可以囊括所有数据,并且几乎所有的事物进行抽象以后都可以归为数据,所以采用数据驱动开发也将是行之有效的思路。
2020年7月15日
其他

【OS】“ 文件系统 ” 中这些概念可以这样理解

该存储分配规划区一般都是固定的,当程序上电以后会从固定的地址读取该部分信息,进而定位各个数据区域,当应用程序需要访问某个存储数据区域的时候,便可以通过描述信息找到对应的区域并读取或者写入相关信息。
2020年7月9日
其他

【C进阶】听说用 “ 逗号表达式 ” 仅仅为了秀技?

大家首先可以自己算一下最后输出的结果,然后再去看下面的答案,其实对于逗号表达式的语法规则并不是很难,主要是大家在平时的开发中使用得比较少,一旦经常不使用就容易淡忘。
2020年7月6日
其他

C语言宏定义里的这些“骚操作”你都会了吗?

bar(wolf);baz(wolf);==baz(wolf);==,不在判断条件中,显而易见,这是错误。如果用大括号将其包起来依然会有问题,例如#define
2020年7月2日
其他

【开源解读】一款轻量级C日志库-EasyLogger

大家通过上面的调用关系看出来了,函数形式采用了大量的可变参数和一些预定义标识符,可能部分小伙伴对该部分接触的不多,可以先阅读作者往期对于这两块C语言知识点的讲解,基本上理解这块代码就也问题不大了。
2020年7月2日
其他

​【杀手锏】用“万能C编程”来引出"面向对象"

最近文章更新的频度稍微有点慢,不是因为作者懒,而是因为确实很忙,工作,生活上都是各种各样的事情!好了,同样开头为大家推荐一首《感谢你曾来过》,感谢默默支持作者的小伙伴们!
2020年6月23日