游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

你的单片机裸机程序框架是怎样的?

  前言
  前不久,我有位做测试的朋友转去做开发的工作,面试遇到了一个问题,他没明白,打电话问了我。题目大概就是:
  在单片机裸机开发时,单片机要处理多个任务,此时你的程序框架是怎样的呢?
  这其实是个经典面试问题,我以前面试也被问过。答案一:轮询系统
  代码结构如:intmain(void){initsomething();while(1){dosomething1();dosomething2();dosomething3();}}
  这种结构大概是我们初学单片机的时候的代码结构。在没有外部事件驱动时,可以较好使用。
  只答出了这种情况,印象分估计会比较低,多半凉凉。答案二:前后台系统
  代码结构如(该代码来自《RTThread内核实现与应用开发实践指南》):intflag10;intflag20;intflag30;intmain(void){硬件相关初始化HardWareInit();无限循环for(;;){if(flag1){处理事情1DoSomething1();}if(flag2){处理事情2DoSomethingg2();}if(flag3){处理事情3DoSomethingg3();}}}voidISR1(void){置位标志位flag11;如果事件处理时间很短,则在中断里面处理如果事件处理时间比较长,在回到后台处理DoSomething1();}voidISR2(void){置位标志位flag22;如果事件处理时间很短,则在中断里面处理如果事件处理时间比较长,在回到后台处理DoSomething2();}voidISR3(void){置位标志位flag31;如果事件处理时间很短,则在中断里面处理如果事件处理时间比较长,在回到后台处理DoSomething3();}
  此处,中断称为前台,main中的while循环称为后台。相比于循环系统,这种方式相对可以提高外部事件的实时响应能力。
  可以回答出这种情况,印象分大概一半以上,会再细问。答案三:升级版前后台系统(软件定时器法)
  以前,学C语言时,常常听到有人说:指针是C语言的灵魂,没学会指针就是没学会C语言
  后来,学单片机时,又听到有人说:中断和定时器是单片机的灵魂,没掌握中断与定时器就没学会单片机
  大佬们都那么说了,那就拿定时器来搞点事情。定时器浑身都是宝,本篇笔记我们来介绍使用定时器(系统滴答定时器或者其它定时器)来做的裸机框架。软件定时器法也有另一种说法:时间片轮询法。
  可以回答出这种情况,这场面试多半稳了。
  下面以STM32单片机为例看看这种方法的使用。站在巨人的肩膀上
  开源项目MultiTimer,项目仓库地址:
  https:github。com0x1abinMultiTimer1、MultiTimer简介
  MultiTimer是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式,更优雅更便捷地管理程序的时间触发时序。2、MultiTimer的demoincludemultitimer。hstructTimertimer1;structTimertimer2;voidtimer1callback(){printf(timer1timeout!r);}voidtimer2callback(){printf(timer2timeout!r);}intmain(){timerinit(timer1,timer1callback,1000,1000);1slooptimerstart(timer1);timerinit(timer2,timer2callback,50,0);50msdelaytimerstart(timer2);while(1){timerloop();}}voidHALSYSTICKCallback(void){timerticks();1msticks}3、MultiTimer的移植、剖析
  想要对MultiTimer进行深入学习可阅读项目源码及如下这篇文章:MultiTimer,一款可无限扩展的软件定时器自己动手,丰衣足食1、代码模板
  准备一个定时器,可以是系统滴答定时器,也可以是TIM定时器。使用这个定时器拓展出多个软件定时器。比如我们系统中有三个任务:LED翻转、温度采集、温度显示。此时我们可以使用一个硬件定时器拓展出3个软件定时器,定义如下宏定义:defineMAXTIMER3最大定时器个数EXTvolatileunsignedlonggTimer1〔MAXTIMER〕;defineLedTimergTimer1〔0〕LED翻转定时器defineGetTemperatureTimergTimer1〔1〕温度采集定时器defineSendToLcdTimergTimer1〔2〕温度显示定时器defineTIMER1SEC(1)秒defineTIMER1MIN(TIMER1SEC60)分
  在定时器初始化的时候也顺便给三个软件定时器进行初始化操作:函数:TIM1Init,通用定时器1初始化参数:arr:自动重装值psc:时钟预分频数说明:定时器溢出时间计算方法:Tout((arr1)(psc1))Ft返回:voidvoidTIM1Init(uint16tarr,uint16tpsc){TIMTimeBaseInitTypeDefTIMTimeBaseStructure;NVICInitTypeDefNVICInitStructure;RCCAPB2PeriphClockCmd(RCCAPB2PeriphTIM1,ENABLE);定时器TIM1初始化TIMTimeBaseStructure。TIMPeriodarr;TIMTimeBaseStructure。TIMPrescalerpsc;TIMTimeBaseStructure。TIMClockDivisionTIMCKDDIV1;TIMTimeBaseStructure。TIMCounterModeTIMCounterModeUp;TIMTimeBaseStructure。TIMRepetitionCounter0;TIMTimeBaseInit(TIM1,TIMTimeBaseStructure);TIMClearFlag(TIM1,TIMFLAGUpdate);中断使能TIMITConfig(TIM1,TIMITUpdate,ENABLE);中断优先级NVIC设置NVICInitStructure。NVICIRQChannelTIM1UPIRQn;NVICInitStructure。NVICIRQChannelPreemptionPriority1;NVICInitStructure。NVICIRQChannelSubPriority0;NVICInitStructure。NVICIRQChannelCmdENABLE;NVICInit(NVICInitStructure);TIMCmd(TIM1,ENABLE);全局定时器初始化for(inti0;iMAXTIMER;i){gTimer1〔i〕0;}}
  在定时器中断中对这些软件定时器进行定时值做递减操作:函数:TIM1IRQHandler,定时器1中断服务程序参数:无返回:无voidTIM1UPIRQHandler(void)TIM1中断{uint8i;if(TIMGetITStatus(TIM1,TIMITUpdate)!RESET)检查TIM1更新中断发生与否{各种定时间器计时for(i0;iMAXTIMER;i)定时时间递减if(gTimer1〔i〕)gTimer1〔i〕;TIMClearITPendingBit(TIM1,TIMITUpdate);清除TIMx更新中断标志}}
  我们在各个定时任务中给这些软件定时器赋予定时值,这些定时值递减到0则该任务会被触发执行,比如:voidTaskLed(void){等待定时时间if(LedTimer)return;LedTimer1TIMER1SEC;LED任务主体LedToggle();}voidTaskGetTemperature(void){等待定时时间if(GetTemperatureTimer)return;GetTemperatureTimer2TIMER1SEC;温度采集任务主体GetTemperature();}voidTaskSendToLcd(void){等待定时时间if(SendToLcdTimer)return;SendToLcdTimer2TIMER1SEC;温度显示任务主体LcdDisplay();}
  如此一来,每过1、2、4秒则分别触发LED翻转任务、温度采集任务、温度显示任务。
  这里配置的最小定时单位为1秒,当然根据实际需要进行配置(定时器初始化),定时器初始化可以放在系统统一初始化函数里:函数:SysInit,系统上电初始化参数:说明:返回:voidSysInit(void){CpuInit();配置系统信息函数SysTickInit();系统滴答定时器初始化函数UsartInit(115200);串口初始化函数,波特率115200TIM1Init(20001,360001);定时周期1sLedInit();Led初始化TemperatureInit();温度传感器初始化LcdInit();LCD初始化}
  此时我们的main函数就可以设计为:intmain(void){上电初始化函数SysInit();主程序while(1){定时任务TaskLed();TaskGetTemperature();TaskSendToLcd();}}
  主函数主要是进行系统上电的一些初始化操作,接着是调用各定时任务函数。
  本demo使用定时器1来扩展出3个软件定时器,如果TIM资源不够用,可以换用系统滴答定时器来做。如:
  其中,时间基数可以根据实际需要进行调整。2、实践(代入法)
  套用以上模板,分享我的一个实例:
  需要思考及注意的问题是给每个任务的定时值设置多大合适?这也是一些朋友有疑问的,这只能是自己对自己的任务做考虑,具体情况具体分析,给经验值、调试调整。就如同常常有人问定义多大的数组合适?在使用RTOS时每个线程的线程栈大小设置多大合适、优先级设置为多少合适?这些都是需要我们自己进行思考的。有模板轮子套用是好事,但有些问题不能单单依靠模板,否则有可能把自己给套进去。
  以上是以STM32为例的,其它单片机也是可以用这样子的思想的,包括51单片机。
  面对文首提到的面试问题,若是可以提到使用软件定时器来处理,进一步能清楚地表达出来,再进一步能写出一些伪代码,那这场面试多半是稳了。
  不仅仅是为了面试,本文的方法是很经典的,小编曾经接触的产品项目中就有用到,很实用,值得学习掌握。方法掌握多了,实际应用的时候想用屠龙刀还是倚天剑根据实际情况选择使用即可。
  以上就是本次的分享,如有错误,欢迎指出,谢谢。

生鲜果蔬行业解决方案,教你如何利用小程序圈住周边五公里的客户作为日常高频消费的生鲜果蔬行业,目标客户基本都是附近小区的居民,在同一条社区街道,竞争还是很大的,没有稳定的客源,也很容易闭店。面对种种经营困境,又是急需转型的关键风口,……微软正式宣布以197亿收购语音AI厂商Nuance今日传得沸沸扬扬的微软收购语音AI厂家Nuance,终于靴子落地。微软在官方网站上宣布了收购的细节,详见https:news。microsoft。com20210412micr……有机构已浮亏9亿!押注买菜的资本被套牢?每日优鲜股东超20家,叮咚买菜有数十家投资方,他们的耐心会持续多久?本文由无冕财经(wumiancaijing)原创首发作者:海棠葉编辑:陈涧设计:岚昇……提高人声清晰度的方法,最后一期在前面的几期里我分享了7种如何提高人声清晰度的方法,这期是最后一期,将会分享最后4个方法,也希望能帮助到大家。1。铅笔练习它不一定是铅笔。您可以放在牙齿之间的任何道……东北彩王马洪平,500万大奖一年中两次,他为何锒铛入狱了一年间,他买彩票接连中了两次500万元的头等大奖,被誉为全东北的彩王,然而后来却落得个锒铛入狱的下场,他就是马洪平。从普通人到千万身家的大富翁,再到阶下囚,他都经历了什么……巨化获国家科学技术进步奖二等奖11月3日,国家科学技术奖励大会在北京隆重举行,由巨化装备制造有限公司与浙江大学联合申报的《氢气规模化提纯与高压储存装备关键技术及工程应用》项目摘得国家科学技术进步奖二等奖。……北京咖啡外卖报告出炉,2021年咖啡订单增速高达200。15近年来,咖啡市场的发展呈现出一个明显特征:随着外卖服务的品质化升级,全国各地主打快速消费场景的精品咖啡馆逐渐成为当下年轻消费者的新晋选择,这类精品咖啡馆往往会借助更小的门店面积……山东硅科与德国瓦克成功举办合资项目签约仪式为助推园区企业提档升级,园区鼓励入驻企业积极挂大联强,实现跨越式发展。10月27日,山东硅科新材料有限公司与德国瓦克在济宁举行了以携手同行、悦见未来为主题的合资项目签约仪式。德……方案篇得有店小程序珠宝行业,单价昂贵也能日日订单量爆满小程序的流量红利狂欢进行到如今,各行各业都搭建起了自己的小程序,为自己的生意带来了不少助力,那么珠宝行业得有店小程序能碰撞出什么火花?得有店能为珠宝行业带来什么助力?1,……2020年中国在线导购平台行业研究报告核心摘要:依托于网络购物市场的繁荣发展,2019年在线导购平台行业整体GMV规模达1187。4亿元随着网络购物市场进入成熟繁荣的存量发展时期,在线导购行业在2019……60的外贸企业都在抱怨线上推广太难!其实越来越多的中国外贸出口企业在抱怨:客户询盘越来越少,客户质量越来越低;国内同行恶性竞争激烈,订单成交利润越来越低;新客户开发越来越难,老客户越来越不稳定。。。。。。原因是……毛利率集体转正,造车新势力需要新卖点前一段时间,理想、蔚来、小鹏都发布了2020年财报。总体来看,数据亮眼,毛利率均已转正,账上还躺着一大笔足够面向未来的现金。理想甚至在2020Q4第一次实现了盈利。看起来……
你见过长春最美的老照片是什么样的?承蒙邀请,很遗憾因为年纪原因错过了老长春的良多风景,但是好在逝去的老长春时光还可以在老照片中得以翘首回望。透过这些古老的影像,我仿佛看到了一个个鲜活的老长春人朝我走过来,……阿里巴巴研发投入位居中国民营企业第二互联网企业第一中华全国工商业联合会近日发布2021民营企业研发投入500家榜单,榜单显示,华为位居榜首,阿里巴巴位居第二,超过腾讯、百度,在中国互联网企业里位居第一。研发投入是衡量企业……车主起诉特斯拉获赔151万,特斯拉反告车主侵权,索赔500万近日特斯拉频繁登上热搜,不是因为特斯拉又推出了新车型,而是因为特斯拉把在车展上维权的女车主,以及成功获得退一赔三赔偿的车主韩先生告上了法庭,索赔500万元。这起事件还要从……可弹出可拆卸,还支持取出拍摄vivo再爆手机摄像头新专利继此前,vivo可拆卸手机摄像头专利曝光之后,日前,vivo又一项手机摄像头专利被曝光了出来。据外媒letsgodigital报道,vivo正在研发一种新型的升降式摄像头手机,……电动车要考什么驾驶证,看清楚车辆的类型经常我们说的电动车有2类,一类是纯电动汽车,一种是电动单车。1。纯电动汽车至少需要自动挡的C证,持有C2或者C1都是可以驾驶。2。电动单车不属于机动车,所以不用驾驶证。要注意的……放弃工作去做独立游戏值么?底层开发者算了笔账《雨袭(Rainswept)》最近,一位来自印度的独立游戏开发者ArmaanSandhu在博客上分享他放弃工作,全身心投入到独立游戏制作的心路历程,同时晒了一遍这款游戏的……2019中国互联网大会阿里巴巴技术主席说互联网时代才刚刚开始2019年7月9日,第18届中国互联网大会在北京国家会议中心召开,本次大会的主题是创新求变再出发优质发展谱新篇。阿里巴巴技术委员会主席王坚在大会上作主旨报告。阿里巴巴技术……怎么从佳能相机的型号上判断哪个是入门机?专业机?低端:1000D1100D中低端:300D350D400D450D500D550D600D,半幅的较多。中端:10D20D20Da30D40D50D60D大多是34……密码,让百姓生活更安全来源:人民网人民日报密码技术是保障网络与信息安全的核心技术和基础支撑,通过加密保护和安全认证两大核心功能,可以完整实现防假冒、防泄密、防篡改、抗抵赖等安全需求,在网络空间……电动车是趋势相比传统的烧油的汽车,国产电动车确实更有可能实现弯道超车。就好比以前的手机,关键技术都被诺基亚、摩托罗拉这些国外大牌掌控。但是,到了智能手机时代,华为、OV、小米这……美光科技(MU。US)宣布考虑在美投建内存芯片工厂智通财经APP获悉,美光科技(MU。US)周三表示,正考虑在美国建造一家新的存储芯片工厂,但需要美国州和联邦补贴来抵消高于其亚洲工厂的成本。美光科技是唯一一家同时生产两种……微信和支付宝都有理财产品,你更相信谁?为什么?微信和支付宝的理财产品我都用过,对这些产品还算比较了解。其实这些理财产品都不是他们自己的,不过是通过他们的平台代理销售,因此安全性主要在于发行产品的公司,可以说和支付宝、……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网