干货连载编译器强大的库函数你了解多少——把犀利功能用在MCU上

Posted 周立功单片机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货连载编译器强大的库函数你了解多少——把犀利功能用在MCU上相关的知识,希望对你有一定的参考价值。

上一篇文章我们列举了好多嵌入式系统中可以直接调用的标准C语言库函数,如果用得好的话,可以大大减少开发的难度。但还是有一些我们无法直接调用的函数,也非常重要,下边咱们就着重介绍字符打印与时间相关的函数。


标准字符串打印函数

在我们刚学C语言的时候,怎么强调printf函数的重要性都不为过,在PC上学习C语言,只有通过printf函数在黑底白字的控制台打印出来字符,才能够判断你编写的程序执行得是否正确。不过在嵌入式系统中,由于编写的C语言可以直接操控MCU的I/O口外设等资源,打印字符串反而成了一项辅助的功能。但是对于高手来说,字符打印仍然是一个比较重要的调试手段。因此使用printf函数还是非常有必要滴。


【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上

但可惜的是,这个函数与硬件关联比较紧密,不能直接调用。在PC上是通过黑底白字的控制台来显示的,如果在嵌入式系统里边运行,总不能接一个显示屏去显示吧。好在编译器里边开放了printf的底层接口,方便用户修改。由于不同的编译器的设置方法不一样,在这篇文章里边统一使用KEIL5 MDE,其它编译器的修改方法类似。

在KEIL MDK编译器里边,printf会调用底层的fputc函数来具体实现打印的位置,其函数定义如下:


【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上

其中参数ch表示当前串口接收的字符编码,只要在这个函数里边把串口发送函数放到fputc里边,就可以通过printf函数打印串口数据了。


其实这个函数不仅可以打印串口数据,也可以重定向为别的通讯协议,比如I2C协议,SPI协议等,也可以通过特殊处理,把打印的信息显示到外接的彩屏上(不过需要自己在代码里边处理换行之类的操作),也可以把字符写到外部的flash里边等等,只有你想不到没有你做不到。


与printf相对应的就是标准输入的函数scanf,其对应的底层函数是fgetc,改写方法与fputc类似,不过需要注意的是,scanf接收的字符串必须以换行符结尾,否则scanf函数会认为接收没有完成。


MCU模拟实时时钟

有些嵌入式系统上会用到实时时钟的功能,用于进行时间的走时、闹铃的提示等功能,这些功能有时候是必不可少的。通常的做法是外接一个RTC芯片然后通过总线方式设置或读取时钟芯片里边的时间。


现在大部分MCU内部有独立的RTC外设,如果不使用外接时钟芯片,还想获取具体的年月日时分秒怎么办呢?可以根据MCU的RTC外设的计数器中获取数据,然后根据数据大小求出年、月、日、时、分、秒、毫秒,当然,还要注意闰年二月天数不同的因素…… 哎哟妈呀,太繁琐了,算了、还是外挂一个RTC芯片来的实惠!


【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上

当然,标准的C库函数毕竟是伟大的,所以我们可以想办法利用time.h里边的函数来套用时间操作。

咱们还以KEIL MDK5为准,来掰扯一下time函数的移植与使用方法。


1

设置一个“struct tm”类型的全局变量“calendar”,用于保存年、月、日、时、分、秒、星期的信息;设置“time_t”类型的全局变量“currentTime”用于读取硬件RTC寄存器的计数值;

注:“calendar” 数据转化为“currentTime”类型,可调用“mktime()”函数;“currentTime”数据转化为“calendar”类型,可调用“localtime()”函数;


2

1. 重写“time(time_t* timer)”函数,此函数里边实现的内容是把硬件RTC里边计数值读出来,赋值给变量“currentTime”,然后返回,相当于更新时间的作用;


至此,标准time函数的移植已经结束,只要设置好硬件RTC,就可以像设计PC端软件的那种方式获取MCU的时间。


time相关的函数只是把硬件寄存器里边的二进制数据转化成年月日的结构体格式显示出来而已,跟硬件关系并不是那么密切。如果MCU工程里边需要获取从某年某月到某年某月一共有多少天时,就可以直接调用时间函数进行计算,用不着自己去设计算法。

总结

【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上

连标准的输入输出函数和获取时间函数都可以移植到MCU里边,那么还有什么可以阻挡你愉快的使用标准的C库函数呢?如果你是个高手,精通C++,那么恭喜了,C++的标准库函数更多,用起来更酸爽。


有时候在使用MCU进行控制类或者信号类编程的时候,程序上需要对某些数据进行数学变换,比如,傅里叶变换、矩阵计算、滤波计算等。当然这些函数都可以用算法搭建出来,那么有没有现成的库函数进行调用呢?请看下集——《编译器强大的库函数你了解多少(3)——高数计算不用愁》


是的,重点就是-----



我还有下集!

【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上

往期好文推荐

【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上



【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上
【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上

广州周立功单片机科技有限公司

【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上
【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上

zlg.sales@zlgmcu.com

【干货连载】编译器强大的库函数你了解多少(2)——把犀利功能用在MCU上

400 888 2705

www.zlgmcu.com

点击

写留言

与小编沟通

以上是关于干货连载编译器强大的库函数你了解多少——把犀利功能用在MCU上的主要内容,如果未能解决你的问题,请参考以下文章

干货连载编译器强大的库函数你了解多少——高数计算不用愁

干货合集 | 关于制品库,你了解多少?

实用干货 | iPhone 隐藏功能被扒出,十分强大!

强大的PyTorch:10分钟让你了解深度学习领域新流行的框架

干货 | 商业数据挖掘的13种应用场景,你了解多少?

关于dart中的late关键字,你了解多少?#yyds干货盘点#