前言
前不久,我有位做测试的朋友转去做开发的工作,面试遇到了一个问题,他没明白,打电话问了我。题目大概就是:
在单片机裸机开发时,单片机要处理多个任务,此时你的程序框架是怎样的呢
这其实是个经典面试问题,我以前面试也被问过。
答案一:轮询系统
代码结构如:
这种结构大概是我们初学单片机的时候的代码结构。在没有外部事件驱动时,可以较好使用。
只答出了这种情况,印象分估计会比较低,多半凉凉。
答案二:前后台系统
代码结构如(该代码来自 《RT-Thread内核实现与应用开发实践指南》 ):
此处,中断称为前台,main中的while循环称为后台。相比于循环系统,这种方式相对可以提高外部事件的实时响应能力。
可以回答出这种情况,印象分大概一半以上,会再细问。
答案三:升级版前后台系统(软件定时器法)
以前,学C语言时,常常听到有人说:指针是C语言的灵魂,没学会指针就是没学会C语言。。
后来,学单片机时,又听到有人说:中断和定时器是单片机的灵魂,没掌握中断与定时器就没学会单片机。。
大佬们都那么说了,那就拿定时器来搞点事情。定时器浑身都是宝,本篇笔记我们来介绍使用定时器(系统滴答定时器或者其它定时器)来做的裸机框架。软件定时器法也有另一种说法:时间片轮询法。
可以回答出这种情况,这场面试多半稳了。
下面以STM32单片机为例看看这种方法的使用。
站在巨人的肩膀上
开源项目—— MultiTimer ,项目仓库地址:
https:// github.com/0x1abin/Mult iTimer
1、MultiTimer 简介
MultiTimer 是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式, 更优雅更便捷地管理程序的时间触发时序。
2、MultiTimer 的demo
3、MultiTimer 的移植、剖析
想要对MultiTimer 进行深入学习可阅读项目源码及如下这篇文章:
第6期 | MultiTimer,一款可无限扩展的软件定时器p.weixin.qq.com
其中,时间基数可以根据实际需要进行调整。
2、实践(代入法)
套用以上模板,分享我的一个实例:

需要思考及注意的问题是给每个任务的定时值设置多大合适也是一些朋友有疑问的,这只能是自己对自己的任务做考虑,具体情况具体分析,给经验值、调试调整。就如同常常有人问定义多大的数组合适使用RTOS时每个线程的线程栈大小设置多大合适、优先级设置为多少合适些都是需要我们自己进行思考的。有模板/轮子套用是好事,但有些问题不能单单依靠模板,否则有可能把自己给套进去。
以上是以STM32为例的,其它单片机也是可以用这样子的思想的,包括51单片机。
面对文首提到的面试问题,若是可以提到使用软件定时器来处理,进一步能清楚地表达出来,再进一步能写出一些伪代码,那这场面试多半是稳了。
以上就是本次的分享,如有错误,欢迎指出,谢谢。
相关资源:顺丰快递单打印软件2.7可支持自定义快递模板-物流工具类资源-CSDN…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!