您当前的位置: 财报说  >>  财经 > >  内容页
全球观焦点:嵌入式软件开发中的注册机制
来源:面包芯语      时间:2023-06-19 22:29:59

1.问题描述

在使用定时器的过程中最令人苦恼的就是,定义flag,holdtime,每用一次定义就会导致中断函数中标志位满天飞,时间变量在程序中随处可见。在想要移植,又不敢随便删除。程序处于高耦合状态,失去了一个.c 一个 .h的意义。

2.如何解决这种问题

引入注册机制。为了方便说明注册机制,举一个例子:手机在使用相机这个功能时,有一个操作:将拍摄的照片发送出去。以程序来实现这一过程,最容易想到的方法如下:


(资料图片)

在相机的发送模块添加以下代码:

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

X 关闭

经济动态 查看更多

X 关闭

精彩推荐
党建引领聚合力 校社联动促共治_当前关注
时间·2023-06-19    来源:面包芯语
电脑怎么编程一个窗口_电脑怎么编程
时间·2023-06-19    来源:面包芯语
蔚来,撑得住吗? 世界最新
时间·2023-06-19    来源:面包芯语
“中原出海大通道”成了老区经济新引擎
时间·2023-06-19    来源:面包芯语
快消息!优盾网银怎么用 优盾网银怎么用详细步骤
时间·2023-06-19    来源:面包芯语
在路边砌起围墙挡风景 会让景区“败好感”
时间·2023-06-19    来源:面包芯语
以高水平科研推动中医药创新发展
时间·2023-06-19    来源:面包芯语
世界观焦点:临沂:粽叶飘香迎端午 反诈粽子进社区
时间·2023-06-19    来源:面包芯语
全球观焦点:胃苏颗粒饭前还是饭后喝_胃苏
时间·2023-06-19    来源:面包芯语
大玩家国际旅行社(大玩家演员表)|微速讯
时间·2023-06-19    来源:面包芯语
中考美术特长生考什么项目_中考美术特长生考什么
时间·2023-06-19    来源:面包芯语
时讯:瓦斯琪攻略_如何去瓦斯琪尔
时间·2023-06-19    来源:面包芯语
沪深股通|海大集团6月16日获外资卖出0.02%股份
时间·2023-06-19    来源:面包芯语
初婚年龄不断推迟,只是因为受教育年限增加吗?
时间·2023-06-19    来源:面包芯语
电脑特别卡怎么解决(电脑特别卡怎么办)
时间·2023-06-19    来源:面包芯语
胡市点草成“金” 天天快看
时间·2023-06-19    来源:面包芯语
高龄能不能转行做程序员?
时间·2023-06-18    来源:面包芯语
临汾300万亩小麦进入夏收高峰预计6月25日进入收尾阶段
时间·2023-06-18    来源:面包芯语
8天长假 请三休八休假模式火了
时间·2023-06-18    来源:面包芯语
大安函授大专怎么报名
时间·2023-06-18    来源:面包芯语
河南省开封市2023-06-14 09:12发布高温橙色预警 当前独家
时间·2023-06-18    来源:面包芯语
天天快看:三峡船闸通航20年累计货运量达19.1亿吨
时间·2023-06-18    来源:面包芯语
“油桃之乡”年销海外万吨助农“桃”金 全球时快讯
时间·2023-06-18    来源:面包芯语
2023新能源物流车市场销量占比分析
时间·2023-06-18    来源:面包芯语
多部门联动 为龙舟节保驾护航 世界今日讯
时间·2023-06-18    来源:面包芯语
干一单赔一单,“疯狂”极兔IPO能走远吗?
时间·2023-06-18    来源:面包芯语
建设现代化产业体系是一项系统工程
时间·2023-06-18    来源:面包芯语
诚意满满!上海银行养老金融,伴您畅享美好生活!
时间·2023-06-18    来源:面包芯语
酒店预订员岗位职责(6篇)-环球热消息
时间·2023-06-18    来源:面包芯语
美国国务卿布林肯今天上午抵达北京
时间·2023-06-18    来源:面包芯语
有色金属行业周报:宏观利好频出 金属价格回暖
时间·2023-06-18    来源:面包芯语
今日看点:原来你是这样的爸爸!
时间·2023-06-18    来源:面包芯语
深信服AD-2200(关于深信服AD-2200介绍)|焦点快看
时间·2023-06-18    来源:面包芯语
北外滩首店再添一员!|世界热资讯
时间·2023-06-18    来源:面包芯语
环球微速讯:超190亿元!以人民币结算!
时间·2023-06-18    来源:面包芯语
13岁儿童生日礼物 全球热议
时间·2023-06-18    来源:面包芯语
全球快播:击剑亚洲锦标赛:中国香港选手江旻憓夺冠
时间·2023-06-18    来源:面包芯语
年底发布!理想纯电MPV命名“MEGA”
时间·2023-06-18    来源:面包芯语
600161股票千股千评_世界播资讯
时间·2023-06-18    来源:面包芯语
世界实时:百利地产(关于百利地产的基本详情介绍)
时间·2023-06-18    来源:面包芯语
余姚一酒店操作失误多收780元 赔偿消费者1170元
时间·2023-06-18    来源:面包芯语
市场细分的标准思维导图_市场细分的标准 每日精选
时间·2023-06-18    来源:面包芯语
世界热点评!form from区别(form f)
时间·2023-06-18    来源:面包芯语
如何锻炼情商和口才(如何提高情商和口才)
时间·2023-06-17    来源:面包芯语
短讯!agaras_agar
时间·2023-06-17    来源:面包芯语
全球热文:跨越时空的三个6月17日,值得铭记!
时间·2023-06-17    来源:面包芯语
天山脚下夏日美景惹人醉 用心守护“赛湖蓝”
时间·2023-06-17    来源:面包芯语
征集志愿是不是就是补录 征集志愿是不是补录
时间·2023-06-17    来源:面包芯语
微动态丨板栗去皮机(煮板栗怎么去皮)
时间·2023-06-17    来源:面包芯语
州领导调研督导临夏市基层社会治理工作
时间·2023-06-17    来源:面包芯语
暴雨黄色预警!中国气象局启动暴雨三级应急响应
时间·2023-06-17    来源:面包芯语
辽宁省开展涉企行政执法突出问题专项整治|速递
时间·2023-06-17    来源:面包芯语