当前位置: 首页 > wzjs >正文

嘉兴网络科技有限公司网站排名seo培训

嘉兴网络科技有限公司,网站排名seo培训,建筑公司简介模板 范本,杭州建设项目审批网站目录 中断流程分析我的解决办法优缺点 大家都在说STM32 HAL 库中断效率低下。具体哪里不行?如何优化? 我手里的项目要用到多个定时器TIM6、TIM7、TIM9、TIM10、TIM11、TIM12、TIM13,在处理这些定时器中断的时候,也发现了这个问题。…

目录

  • 中断流程分析
  • 我的解决办法
  • 优缺点

大家都在说STM32 HAL 库中断效率低下。具体哪里不行?如何优化?
我手里的项目要用到多个定时器TIM6、TIM7、TIM9、TIM10、TIM11、TIM12、TIM13,在处理这些定时器中断的时候,也发现了这个问题。
下面给出我的分析和解决办法。

中断流程分析

以TIM7 中断流程分析,中断条件满足之后,单片机从中断向量表中找中断服务函数TIM7_IRQHandler,然后跳转进去

; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLYEXPORT  __VectorsEXPORT  __Vectors_EndEXPORT  __Vectors_Size__Vectors       DCD     __initial_sp               ; Top of StackDCD     Reset_Handler              ; Reset HandlerDCD     NMI_Handler                ; NMI HandlerDCD     HardFault_Handler          ; Hard Fault Handler
......                               DCD     TIM6_DAC_IRQHandler               ; TIM6 and DAC1&2 underrun errors                   DCD     TIM7_IRQHandler                   ; TIM7

TIM7_IRQHandler内容如下,从这里HAL库开始接管

void TIM7_IRQHandler(void)
{/* USER CODE BEGIN TIM7_IRQn 0 *//* USER CODE END TIM7_IRQn 0 */HAL_TIM_IRQHandler(&htim7);/* USER CODE BEGIN TIM7_IRQn 1 *//* USER CODE END TIM7_IRQn 1 */
}

HAL_TIM_IRQHandler内容如下,为了方便阅读做了删减

	if ((itflag & (TIM_FLAG_CC1)) == (TIM_FLAG_CC1)){/* Capture compare 1 event Process */}if ((itflag & (TIM_FLAG_CC2)) == (TIM_FLAG_CC2)){/* Capture compare 2 event Process */}if ((itflag & (TIM_FLAG_CC3)) == (TIM_FLAG_CC3)){/* Capture compare 3 event Process */}if ((itflag & (TIM_FLAG_CC4)) == (TIM_FLAG_CC4)){/* Capture compare 4 event Process */}if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE)){/* TIM Update event Process *///我的定时器只用来做定时中断,所以关注TIM_IT_UPDATE中断if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE)){//清除标志位__HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_UPDATE);	#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)//如果启用了回调函数注册执行这里,实际上我们重写下面一条语句的函数效果类似。htim->PeriodElapsedCallback(htim);#else//没有启用回调函数,执行这里。HAL_TIM_PeriodElapsedCallback是虚函数,用户自行重写HAL_TIM_PeriodElapsedCallback(htim);#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}}if ((itflag & (TIM_FLAG_BREAK)) == (TIM_FLAG_BREAK)){/* TIM Break input event Process */}if ((itflag & (TIM_FLAG_TRIGGER)) == (TIM_FLAG_TRIGGER)){/* TIM Trigger detection event Process */}if ((itflag & (TIM_FLAG_COM)) == (TIM_FLAG_COM)){/* TIM commutation event Process */}

HAL_TIM_PeriodElapsedCallback的定义如下

/*** @brief  Period elapsed callback in non-blocking mode* @param  htim TIM handle* @retval None*/
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* Prevent unused argument(s) compilation warning */UNUSED(htim);/* NOTE : This function should not be modified, when the callback is needed,the HAL_TIM_PeriodElapsedCallback could be implemented in the user file*/
}

可以看出来,不同中断公用一个最终的处理函数HAL_TIM_PeriodElapsedCallback,在该函数里用户自己靠传入的形参htim去区分是哪一个中断触发的。那么实际重写HAL_TIM_PeriodElapsedCallback的时候,应该是如下结构

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim == htim6){} else if(htim == htim7){}else if(htim == htim9){}else if(htim == htim10){}......
}

这样的处理方便倒是挺方便的,但是明显的效率低下。主要体现如下两部分:

  • 我不需要判断那么多中断事件,我对自己项目中定时器的作用非常清晰,不会用于做捕获、从机等,也就不用判断这些中断事件。
  • 不同定时器公用一个回调函数,在回调函数内再区分,效率低下。原本不同的定时器就有不同的中断服务函数的。
    在这里插入图片描述

我的解决办法

在TIM7_IRQHandler里写应用,然后直接返回

void TIM7_IRQHandler(void)
{/* USER CODE BEGIN TIM7_IRQn 0 */if(TIMER_Group.callback[1])				TIMER_Group.callback[1]();return;/* USER CODE END TIM7_IRQn 0 */HAL_TIM_IRQHandler(&htim7);/* USER CODE BEGIN TIM7_IRQn 1 *//* USER CODE END TIM7_IRQn 1 */
}

callback指向的函数内容如下

static void hwtimer2_callback(void)
{/* some app*/__HAL_TIM_CLEAR_FLAG(htim7, TIM_IT_UPDATE);//手动清除标志位
}

优缺点

优点:解决了中断效率低下的问题
缺点1:return后面HAL_TIM_IRQHandler(&htim7);任然参与编译,可能占用更多的Flash空间
缺点2:因为HAL_TIM_IRQHandler(&htim7);代码不可到达,会报

http://www.dtcms.com/wzjs/432898.html

相关文章:

  • 域名申请了怎么做网站深圳抖音推广
  • 桂林做网站公司南京seo排名优化公司
  • java做网站访问量并发网络营销策划书8000字
  • 怎么做整人点不完的网站视频seo需求
  • java 网站开发 源码百度游戏官网
  • 政府部门网站建设对比方案亚马逊alexa
  • 建立一个购物网站网站页面优化方案
  • 阿里云网站建设建立网站需要什么条件
  • 网站字头优化爱站工具包
  • wordpress媒体库打不开河源市seo点击排名软件价格
  • 服务器怎么用数据库建设网站天津百度推广网络科技公司
  • 西双版纳建设局网站百度地图打车客服人工电话
  • 阿拉巴巴开店网站建设seo网站优化软件
  • 平邑做网站的google竞价推广
  • 热门网站建设代理泰安seo网络公司
  • 网站建设首先要学会什么哪有学电脑培训班
  • 中国城乡建设委员会的网站谷歌商店下载官网
  • 山东省建设资格注册中心网站东莞做网站推广的公司
  • 最简单做网站营销策略有哪些方面
  • 东莞物流网站设计公司专业seo排名优化费用
  • 广州sem代运营推广公司南京百度快照优化排名
  • 网站建设需求计划书百度指数专业版价格
  • 网站建设服务那一个便宜论坛seo教程
  • wordpress免费字体关键词优化分析工具
  • 霍邱网站设计公司上海优化网站方法
  • 做网站的女生多么平台推广公众平台营销
  • 绵阳网站建设设计百度帐号登录入口
  • 网站推广公司经理职责广州seo推广服务
  • 地图截选做分析图的网站携程: 2023年旅行搜索上涨超900%
  • 免费做英文网站谷歌seo建站