查看原文
其他

【连载】通过"库文件"学单片机驱动编程(5)-完结篇

bug菌 最后一个bug 2021-01-31

1、首先来唠唠嗑

    今天是《通过"库文件"学单片机驱动编程》的最后一期(完结篇)了,其实库中还有特别多的技术可以供大家学习参考,开公众号的这段时间不少小伙伴私信我这样几个问题,"大佬大佬,我学了51单片机以后我该学什么?","学长、学长,我学完了stm32单片机,下一步学啥?",还有"学长,有没有好一点的资料来学习的?",好啦,在今天的文章开头就简单回答一下大家类似的问题,首先大家一定要心中有一种思维观念,知识是永远学不完的,而且我们的大脑也是在不断的记忆与遗忘之间徘徊,所以我个人觉得大家不应该总是在学习新的知识,而是要把学到的知识用起来了---"学以致用"。那么有些小伙伴们会问:"学长,可是我感觉我学了以后也不知道该怎么用呀?",当你的脑海闪现这种问题的时候,你就需要回想一下你当初问什么要学习这些知识?如说你说你想参加比赛-->参加什么比赛?-->比赛需要哪些知识?-->马上去补充-->补充完了就开始动手了!然后形成一种学与用的闭环,我觉得你在技术这条路上就不会迷茫了。(作者的一些小小的学习的思路!)

2、stm32库中的"断言"

1)什么是断言

    "断言"在C语言中都是使用的包含assert的宏来表示,它的英文意思是"维护,坚持,主张的意思",应该大部分第一次见到这个名词的小伙伴们都不太好理解吧,我是这样理解的"判断这句语言的正确性",我个人觉得正是因为这个名字难懂,在我们的程序中使用的频率不是很大,稍微大型一点的项目ASSERT的出现概率是非常高的。

    其实断言既是一种非常好的嵌入式调试工具,也是维持代码稳定性的必备要素之一,有一定项目经验的同志们都会有过数据越界、传入的参数超过范围等等不必要的bug,而这样的bug有时候隐藏得极为隐秘,可能程序员为了它还要掉一些头发。那么这个时候就应该是ASSERT的价值体现了。

    断言的理解:其实很简单,它其实就是一个判断语句的宏,如果条件为真,则程序顺利通过,如果条件为假,则会为输出错误信息供开发人员调试使用。所以说我们平时也用到了一些类似断言的语句,只是说没有进行统一归类,比如说我们在函数开始部分进行判断传入的参数是否在正常范围内,如果没在正常范围则进行函数的return处理等等。

知识小贴士之ASSERT注意事项

1)用于函数的入口处,进行输入参数条件检测;

2)位于函数的出口处,进行函数参数返回值的检测;

3)ASSERT一般设计为可分离代码,一般发布代码需要进行脱离。

4)ASSERT由于增加了代码的长度和处理,会对处理器资源以运行速度造成一定影响,具体根据实际项目的需求来进行相关断言的取舍。

2)库中断言的实现

    代码分析:1)上面是来源于stm32库中的断言部分代码的截图,代码通过一个USE_FULL_ASSERT宏来使能和禁止断言功能,那么我们设置为1表示使用断言检测功能,设置为0相当于该部分代码不存在。

    2)可以看到断言就是一个C语言中三目判断运算符,如果expr表达式为真,而相当于程序直接通过,否则就会调用assert_failed函数,其中第一参数表示该句断言所在文件名,第二个表示该句断言所在的行号。(对于__FILE__;__LINE__;这些是C语言中的预定义标识符,大伙可以看一下我之前发布的文章《C语言之预定义标识符》,这里我就不再赘述了。)

    3)那么小伙伴们一定会问如果调用了assert_failed会做什么事情?这一块stm32库并没有实现该部分代码,而是交给用户自己实现,最简单的办法就是串口打印调试信息,printf一下。一旦触发断言,我们就可以定位到代码的位置,并进行修改。(大伙是不是又get到新技能了?)

3)库中断言的使用

    我们还是以最简单的stm32库中的GPIO外设实现为例,为大家讲解。

    代码解析:(真的觉得大佬写的代码就是漂亮),断言的传入参数都使用宏进行了封装,如上面的IS_GPIO_MODE就定义好了MODE参数的取值范围,这样如果传入的MODE不在这几个参数中选择,那么必然导致断言失败。我们如果开启了断言功能,并且有断言失败处理,必然会让开发人员监控到程序异常的问题,从而得到修护。这样对于代码的稳定是非常重要的。

    同时上面我也提到了,断言也会对程序造成一定的影响。比如说一些时候我们断言过多导致程序上的延时较大,而错开了故障的交际,从而表现为正常运行,而当我们去掉断言却程序出现了问题,对于这类问题断言的作用会难以奏效。不过这也是代码的问题,这不是你不选择使用断言这一神器的理由

3、本次连载最后的总结

    好啦,本次的《通过"库文件"学单片机驱动编程》的连载就先告一段落了,库中还有一些小细节个人觉得大家可以平时拿了库代码进行细细品味,包括一些平台的可移植性处理等等,都是值得我们学习的。具体到外设学习个人觉得现在网络资源特别丰富了,我也没有必要在这里进行总结,我还是希望带给大家更多不一样的精彩,也希望小伙伴们能积极私信我你想了解或者学习的内容,我也会集中挑选为大家讲解

    好了,今天的内容到这里就结束了,感谢大家的关注公众号:"最后一个bug",今天换了一下公众号的图标,下次看文章别迷路了。最近关注的人数一直在上涨,非常感谢大家,后面的知识我一定不会让大家失望。

推荐阅读

【连载】通过"库文件"学单片机驱动编程(1)

【连载】通过"库文件"学单片机驱动编程(2)

【连载】通过"库文件"学单片机驱动编程(3)

【连载】通过"库文件"学单片机驱动编程(4)

嵌入式编程之动态接口技术(经验干货)

嵌入式编程之"重构"代码(C语言版本)

单片机常用程序框架之分时轮询(详注代码)

单片机开发之节省内存大法(C语言版本)
向Modbus协议说"So easy!"

更多精彩文章大家可以在主页目录中查找!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存