在使用定时器的过程中最令人苦恼的就是,定义flag,holdtime,每用一次定义就会导致中断函数中标志位满天飞,时间变量在程序中随处可见。在想要移植,又不敢随便删除。程序处于高耦合状态,失去了一个.c 一个 .h的意义。
引入注册机制。为了方便说明注册机制,举一个例子:手机在使用相机这个功能时,有一个操作:将拍摄的照片发送出去。以程序来实现这一过程,最容易想到的方法如下:
(资料图片)
在相机的发送模块添加以下代码:
if(选择发送){if(选择微信发送){获取发送人;选择发送人;}elseif(选择qq发送){获取发送人;选择发送人;}elseif(选择微博发送){获取发送人;选择发送人;}..此处省略一万行.}
这是最容易想到的实现方式,就如上面定时器的实现方式,哪里要用了,再定义一系列变量就是了。回到相机例子,假设某一天一个比微信还火的聊天软件出现了,用户安装了,想要发送图片,这时该怎么做 ?当然,只能在上面相机的发送发送模块中添加else if(。。。。)和它的实现方式了,也就意味着,每更新一个需要使用图片功能的软件,就必须去修改相机模块,是不是觉得和我们的定时器很像?
注册的精髓:解耦各个模块。程序讲究高内聚,低耦合。我目前对这句话的理解是:高内聚:每一个功能模块(c文件,h文件),内部不和其他模块相互调用,比如障碍物函数里面不应该有状态这一个变量存在,更不应该拥有零地标恢复运行这一操作。它只做一件事,处理IO口信息,产生相应的障碍物状态。低耦合:障碍物函数与其他模块的耦合,仅仅为产生的障碍物状态。下面深入探讨注册机制。
何谓注册:我目前这样理解的,相机要发送图片,面临着多种发送方式,每一种发送方式肯定会调用不同的函数。反过来想,就是我有很多的应用,要使用相机这个模块(此处对比定时器)。既然这样,相机模块定义一个注册函数,供其他模块调用,以告诉相机,允许使用对应的发送方式。
#definenum_max20//最大设备数typedefstruct{ u8 num;//当前注册设备数u8list_name[num_max];//用于保存注册设备列表void(*click[num_max])(u8*temp);//存放不同模块(微信qq)的发送函数地址}Equiment;EquimentCOM;/**************************注册函数****************************************/voidPhoto_Register(void(*a)(u8*temp),u8list)//提供给外部的接口{if(COM.num
微信中若要使用,在安装过程中,提示打开相机权限,便是调用上述注册函数。将微信本身自集成的发送函数地址传给相机,相机每次发送只需判断哪些设备注册了,选择对应的方式即可。如此一来,出现再多的新应用要使用相机,只需注册一次即可。相机与微信QQ微博等模块之间完美解耦!类似的,定时器的解耦也能这样处理。
首先,要想解耦,必须去掉胡乱定义的标志位与时间变量,只允许一个时间变量。因此定义一个32位的时间变量,不要任何条件限制,让他一直自加。
参考arduino 中定时处理的方法:定义一个函数获取当前时间,保存下当前时间,运行一段时间后,再次查询当前时间,两次做差,便得出运行的时间。从以上不难看出,关键点在于:获取当前时间的函数,当前时间的存放,做差后的时间。以下是实现方法:[page]
time.h
#include"stm32f10x.h"#ifndef__TIME_H#define__TIME_H#defineTimerID_max20//最大注册设备数#defineRunOutOf_time(ID,ms)(systime.now-systime.last[ID-1]
time.c
#include"time.h"/*********提供给外部的API*******************/voidTimer_Init(u16CountData,u16FreqData);unsignedcharsystime_get(void);voidRefresh(u8ID);/***********************************************/SYSTIMEsystime=定义SYSTIME类型变量,并初始化函数指针{.get_id=systime_get,.refresh=Refresh,.timer_init=Timer_Init};/****************************************************///函数名:Timer_init//描述:初始化定时器//输入:中断时间相关//输出:null/****************************************************/voidTimer_Init(u16CountData,u16FreqData){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=4;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_DeInit(TIM4);TIM_TimeBaseStructure.TIM_Prescaler=FreqData;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);TIM_ClearFlag(TIM4,TIM_FLAG_Update);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);TIM_Cmd(TIM4,ENABLE);}/****************************************************///函数名:systime_get//描述:获取当前时间,并产生一个注册//输入:null//输出:null/****************************************************/unsignedcharsystime_get(){if(systime.ID
在.c与.h实现了以上后,面向外部的只有三个函数
/*********提供给外部的API*******************/voidTimer_Init(u16CountData,u16FreqData);unsignedcharsystime_get(void);voidRefresh(u8ID);/***********************************************/
1./*初始化*/2./**********任务1实现运行等闪烁,频率1s**********/voidtask1(){staticu8Task1_ID;if(!Task1_ID)Task1_ID=systime.get_id();if(RunOutOf_time(Task1_ID,1000))RUN_LED()=1;elseif(RunOutOf_time(Task1_ID,2000))RUN_LED()=0;elseif(RunOutOf_time(Task1_ID,3000))RUN_LED()=1;elseif(RunOutOf_time(Task1_ID,4000))RUN_LED()=0;elseif(RunOutOf_time(Task1_ID,5000)RUN_LED()=1;elsesystime.refresh(Task1_ID);}/*******************任务2实现运行等闪烁,频率100ms**********************/voidtask2(){staticu8Task1_ID;if(!Task1_ID)Task1_ID=systime.get_id();if(RunOutOf_time(Task1_ID,100))RUN_LED()=1;elseif(RunOutOf_time(Task1_ID,200))RUN_LED()=0;elseif(RunOutOf_time(Task1_ID,300))RUN_LED()=1;elseif(RunOutOf_time(Task1_ID,400))RUN_LED()=0;elseif(RunOutOf_time(Task1_ID,500))RUN_LED()=1;elsesystime.refresh(Task1_ID);}/***************main函数实现任务1运行10s,任务2运行10s****************/intmain(void){staticu8main_ID;System_Init();while(1){if(!main_ID)main_ID=systime.get_id();if(RunOutOf_time(main_ID,10000))task1();elseif(RunOutOf_time(main_ID,20000))task2();elsesystime.refresh(main_ID);}}
以上,任何函数想要使用定时器,只需要按要求,设立一个ID存储变量,以存储注册时分配的ID,便可调用定时器,且在任何平台上均可方便的移植,只需修改硬件初始化。[page]
此程序无法实现时刻任务执行,例如某任务要100ms执行一次,只能用作时间段内执行。原因在于程序主循环会耗时,导致轮询时无法精准捕捉到100ms时刻,想要达到此效果,还需改进或者完全换一种思路来写,例如捕捉放到中断中,主循环来查询100ms使能位。
[1]取经的孙猴儿. (2018, June24). stm32定时器使用注册机制复用. https://blog.csdn.net/qq_36969440/article/details/84455176?spm=1001.2014.3001.5501
上一篇:【世界新要闻】文化和旅游部要求切实解决游客“找厕难”问题
下一篇:最后一页
关注、星标公众号,直达精彩内容来源:CSDN作者|取经的孙猴儿1
猪叔叔猪扒包品牌信息品牌名称:猪叔叔猪扒包所属行业:汉堡主营产品:
原标题:文化和旅游部要求切实解决游客“找厕难”问题记者6月19日从文
视剧步步惊心大结局,步步惊心大结局这个问题很多朋友还不知道,来为大
西藏市场监管局举办培训班促肉制品产业健康发展---中新网拉萨6月19日电
上周国内股市表现亮眼,主要受两方面因素影响。泓德基金表示,一是虽然
中新经纬6月19日电题:近期房价涨不动的逻辑是什么?作者曹远征中银国
1、MyFamilyIhaveahappyfamily Therearefourpeopleinit Theyaremyfathe
导读1、工程签证是指在施工合同履行过程中,承发包双方根据合同的约定
1、非武汉市户籍买房条件提供自购房之日起前2年(含2年)在武汉市连续缴
红网时刻新闻6月19日讯(记者曾珍通讯员周亚芬)6月18日,邵阳市作家协
1、PON灯是外线连接状态显示灯,代表光纤是否连接到光猫;正常状态应该
1、已发送至:alextina@qq com请查看《原来这就是爱》电影假装情侣插曲
来为大家解答以上的问题。曼努埃尔·加西亚·冈萨雷斯,努埃尔·加西亚
粉丝朋友们,周一,人工智能板块中的算力、CPO板块表现不错,其中工业
菲林格尔(603226)06月19日在投资者关系平台上答复了投资者关心的问题。
1、nuk是奶瓶大型品牌。2、NUK,是德国MAPA公司生产的世界高质量的婴儿
奕东电子涨19 99%
央视网消息:海关总署有关负责人6月18日介绍,2022年,中国跨境电商进
1、诚信是人最美丽的外套,是心灵最圣洁的鲜花。2、2、诚信是你价格不
1、好听的歌名字有:《四块五》、《这一生关于你的风景》、《出山》、
新湖南,主流新媒体,移动新门户。-分享自@新湖南
2023甘肃高考成绩全省排名可以根据甘肃高考一分一段表来查询。高考成绩
中国平安“港币-人民币双柜台”正式启用,股份代号:82318 HK
你们好,最近小品发现有诸多的小伙伴们对于看门狗2进不去游戏怎么回事
据“车陂同舟”今天(19日)消息,车陂村取消初三至初五招景和探亲活动
来为大家解答以下的问题,份文件归档方法中,ldquo坦然rdquo的反义词是
年产白酒10000斤,谷城卫永风身残志坚、勤劳致富---湖北日报客户端讯(
据《今日美国》日前报道,当地时间6月16日,美国总统拜登在康涅狄格州
雪球推出首部投资剧情类漫画 《进阶吧!投资者》第三十七话中,“就连
天眼查App显示,近日,北京蓝泉物业管理有限公司发生工商变更,潘石屹
公兴场,别名“坛罐窑”,起源于明朝正德年间,因公兴有三口规模大、产
1、可以建议你学JAVA软件编程,湖南长沙一度软件教育是最专业就JAVA软
菏泽2023年用地供应计划(第3批)!17个地块,被征收!,征收,胡路,陈集
前段时间,赌王二房千金何超仪出席何家旗下酒店开幕式时,曾主动透露丈
在一个节目上,李斌还用了一个比喻来表明自己不降价的决心——就连上个
作为目前河南最大的综合性单体港口,淮滨中心港区坐拥淮河黄金主航道,
本文内容是由小编为大家搜集关于优盾网银怎么用,以及优盾网银怎么用详
“黑丝配西装”越看越上头,今夏最in穿搭,高级时髦又干练霸气,穿搭,西
近期,中国轻纺城传统市场涤纶长丝加氨纶类弹力面料挂样上市品种局部显
今年“五一”假期,黄河壶口瀑布沿途公路被景区管理方砌墙围挡的新闻,
“要深刻认识中医药传承创新发展在当代的重要价值和作用。”中国科学院
琅琊新闻网讯6月18日,临沂市兰山区金雀山街道金苑社区联合市公安局兰
喜报!南财理财通斩获第六届(2023)数字金融创新大赛金奖!,风控,金融
一、净水和废水1:3的比例在市面上所售卖的净水机,一般都遵循进水和废
同花顺数据中心显示,欧陆通6月16日获融资买入2016 43万元,占当日买入
日前,冯小刚养女徐朵晒与冯小刚合照并配文:“老爸节快乐!”有网友在
1、一般来说饭前半小时是服用的最佳时期(最早胃苏颗粒的说明书上是要
导读1、八仙女——谢娜 美女——钟欣桐(阿娇)二宝——孙兴电影明星
1、素描: 认真审题,分析默画的内容 2、比较比例关系调整好
6月16日,申万宏源(000166)融资买入2114 66万元,融资偿还2172 8万元
1、首先进入游戏后在联盟处找到石语者埃鲁纳克NPC,埃鲁纳克NPC会让主
同花顺(300033)数据显示,2023年6月16日,海大集团(002311)(002311
“我刚刚毕业工作还没稳定,更别提结婚生孩子了。”刚刚研究生毕业两年
你们好,最近小时空发现有诸多的对于电脑特别卡怎么解决,电脑特别卡怎
卡霍夫卡水电站遇袭引发的洪水逐渐消退赫尔松地区洪灾高峰阶段已过去--
胡市点草成“金”---该镇以水稻种植为主,稻草资源丰富,当别处还在为
根据市场公开信息整理,彩讯股份(300634)于6月19日将有364 21万股限
09:40齐鲁网·闪电新闻6月19日讯青岛的孙女士说,她从去年7月份的时候
大家好,我是良许。在我的直播间,每天晚上都有人在问,我今年30多岁了
今年“三夏”,各地主动应对天气影响,科学高效统筹调度农机、抢天夺时
通过第四次考试后逃跑不宣誓对拿到驾照没有影响,因为驾照考试结束时不
最近端午节马上就要来了,很多人特别喜欢端午节,不仅是因为端午节能够
6月18日,第十四届新领军者年会(2023天津夏季达沃斯论坛)青年志愿者
otaai模式命令随机多一个技能,dotaai模式命令这个问题很多朋友还不知
夏日江南,风景如画。
为贯彻落实国家和省关于开展2023年“百日千万招聘专项行动”的通知精神
大安函授大专怎么报名一、其实人都是有惰性的,不逼急了是不会去想着改
乘联会崔东树:全国新能源汽车产业布局集中化趋势明显,需要优化空间布
1、内地ATM余额查询均不收取任何费用,无论是同行还是跨行,同城还是异
一、河南省开封市天气预报1、尉氏县气象台2023年6月14日9时10分发布高
记者18日从交通运输部长江三峡通航管理局获悉,自2003年6月18日正式向
中新社运城6月18日电题:“油桃之乡”年销海外万吨助农“桃”金作者杨
2022年商用车市场持续走低,但新能源物流车的销量却走出了上涨曲线。20
央视网消息:“三夏”时节,在安徽滁州天长市,96万亩小麦目前已经全部
今天,2023“甜城湖绿水青山”中国休闲运动首届挑战赛暨内江第十一届大
6月18日,2023年亚布力论坛创新年会在太原召开,全国政协常委、人口资
雷达财经鸿途出品文|孟帅编|深海最近几天,梅西的中国之旅在国内互联网
记者夏侯凤超为深化市校融合发展战略,充分发挥驻济高校广大校友的丰富
央视网消息:第十三届中国国际商标品牌节昨天(6月17日)在东莞开幕,国
现代化产业体系是高质量发展的物质和技术支撑,是国民经济循环畅通
在潜江,小龙虾“无处不在”。一下高铁,车门打开,眼前就是三幅巨型海
诚意满满!上海银行养老金融,伴您畅享美好生活!,上海银行,养老金融
在学习、工作、生活中,大家逐渐认识到岗位职责的重要性,明确岗位职责
00:12北京时间6月18日上午7:30左右,美国国务卿布林肯抵达北京。来源:
有色金属行业周报:宏观利好频出金属价格回暖
中央气象台6月18日06时继续发布暴雨黄色预警:预计,6月18日08时至19日
6月16日,网上有很多关于“浙江跳桥救人的外卖小哥被奖励10万元和一套
生肖猴的人工作顺利,以免演变成棘手问题,心智敏感,人生经历与处世态
中宏网河南6月15日电6月14日,光山县人民法院刑事审判庭法官潘伦皓开庭
记忆里的爸爸一直照亮我们前行的路也像一把伞他是我们心里的超级英雄长
近期,一篇“大学生“以证换狗”走红背后”的报道登上了各大搜索引擎的
来为大家讲解以上的问题。深信服AD-2200,信服AD-2200介绍这个很多人还
近日,黛莱皙全球首家旗舰店在北外滩盛大开业,成为入驻虹口的又一家首
阿根廷经济部贸易国务秘书马蒂亚斯·通博利尼当地时间16日在社交媒体上
以下是一些适合13岁儿童的生日礼物:1 手机或平板电脑:这是一个
6月17日,在江苏无锡举行的2023年亚洲击剑锦标赛女子重剑决赛中,中国
浦东新区气象局2023年06月18日07时35分发布暴雨蓝色预警[Ⅳ级 一般]:
同时千仞雪也是在赌,赌自己选择对了,这是天使神对自己的试探,并不是
韩国首尔市教育厅相关人士17日表示,由于日本福岛核污染水排放在即,学
X 关闭
银行理财产品是什么?银行理财产品有哪些种类?
降准指的是什么意思?降准对老百姓意味着什么?
国债是怎么赚钱的?国债利率下降会不会亏损呢?
国债收益率下跌说明什么?国债收益率下跌还可以买入吗?
X 关闭