历史上的今天
返回首页

历史上的今天

今天是:2025年01月23日(星期四)

正在发生

2021年01月23日 | 宏定义“中断函数接口”的注意事项

2021-01-23 来源:eefocus

1问题来源

我前面移植一部分代码,忽略了一些细节问题,直接测试,一有数据(正常应该是进入中断),程序就挂了,进入了“B .”处,如下图:

图片


这代表什么意思呢? 网上一搜B .的意思就知道,程序运行到这个地方,在这里死循环了。


2问题跟踪,并解决

遇到上面问题,于是我就开始了在线调试查找问题。果然,在线调试一眼就看出了问题,中断函数体没有被触发,先看下图:

图片

看上图,经常调试的人就知道,前面没有灰色的标记代表程序不会运行到这个位置。


上面那个DEBUG_COM_IRQHandler函数,我使用的是宏定义:

图片


那么,问题来了,我使用了宏定义中断函数接口,为什么没有进入中断函数?


问题就出在宏定义和被定义函数体的包含关系,简单说就是:stm32f4xx_it.c文件里面应该添加#include "bsp_usart.h"这行代码。


不添加包含宏定义的文件,编译时就会把DEBUG_COM_IRQHandler当做成一个普通函数,也不会出错。此时,中断函数其实是没有定义的,那么,程序运行中断函数时,没有定义函数体,自然就会跳转到B .处去。


解决的办法就如上所说:stm32f4xx_it.c文件添加添加#include "bsp_usart.h"即可。


3总结

针对以上问题,拓展并总结几点内容:

1.宏定义注意事项

宏定义与源代码最好要高度一致,就拿USART时钟的宏定义来说,如下这种方式就容易出错。

宏定义:

#define DEBUG_COM_CLK   RCC_APB2Periph_USART1

调用方式:

RCC_APB2PeriphClockCmd(DEBUG_COM_CLK, ENABLE);


假如我修改时钟:

RCC_APB2Periph_USART1改为RCC_APB1Periph_USART2


发现问题没有:

APB2和APB1混乱调用了。


2.B .含义

这里提出来,是让有些初学者顺便了解一下(其实网上一搜就明白)。这是一个汇编指令,“B”代表不返回的跳转,比如跳到某个标号处。“.”是指定当前的地址, B .这条指令,其实就是死循环。


3.在线调试代码覆盖

经常有朋友问题:我在线调试,为什么有些地方不能打断点? 处理需要配置输出调试信息之外,就是这里说的代码覆盖问题。


看见我上面有两个中断函数那张图没有,里面我有文字说明:前面有灰色标记的代码,代表程序可执行(已覆盖)。相反,则没有被覆盖。


4.中断函数接口宏定义

一般很多初学者不知道函数接口可以使用宏定义。其实,有很多地方,包括一些标准的代码都有用到使用宏定义函数接口。拿我们比较熟悉的FreeRTOS来说,为了移植方便,使用宏定义三个中断函数,如下图:

图片


这里需要注意的就如上面分析的,包含关系需加上。


推荐阅读

史海拾趣

科山芯创(COSINE)公司的发展小趣事

科山芯创(COSINE)公司成立于2017年,由一群对射频及模拟集成电路芯片充满热情的工程师创立。他们看到了中国电子行业中对于高性能、高品质芯片的巨大需求,于是决定成立一家公司,专注于这一领域的研发与设计。他们的初心是通过自主创新和核心技术,为国内外客户提供有竞争力的解决方案。

Advanced Semiconductor, Inc.公司的发展小趣事

为了进一步扩大市场份额,ASI积极寻求与全球各大电子企业的合作。通过与这些企业的战略合作,ASI不仅获得了更多的订单和市场份额,还进一步提升了自身的技术水平和创新能力。同时,ASI也积极参与国际半导体行业的交流和合作,与全球同行共同推动半导体技术的发展。

CITIZEN公司的发展小趣事

近年来,西铁城公司在市场推广方面也进行了一些大胆的尝试。其中,与著名花样滑冰选手羽生结弦的跨界合作尤为引人注目。双方共同推出了限量版签名腕表“四周半”,这一产品以羽生结弦的经典动作为灵感,融合了西铁城独特的光动能技术,展现了技术与艺术的完美结合。这一合作不仅提升了西铁城品牌的市场影响力,也展示了公司在产品创新和市场推广方面的新思路和新策略。

这些故事只是西铁城公司发展过程中的一部分,但它们都充分展示了公司在电子行业中的创新实力和市场竞争力。从最初的维修和销售到如今的全球知名品牌,西铁城的发展历程充满了挑战和机遇,也为我们提供了一个观察电子行业发展和变革的窗口。

Gowanda Electronics公司的发展小趣事

进入21世纪,西铁城公司在技术创新方面继续取得显著进展。其中,光动能技术的开发是公司历史上的一大里程碑。1995年,西铁城推出了第一只光动能手表,这一技术能够吸收任何可见光源并转化为动能,为腕表提供持续的动力。随后,公司不断对光动能技术进行改进和优化,使其更加精确、高效。这一技术的成功应用,不仅提升了西铁城产品的竞争力,也为整个电子行业带来了新的发展方向。

Cotco公司的发展小趣事

在电子行业快速发展的浪潮中,Cotco公司于XXXX年正式成立,由几位在电子行业有着丰富经验的企业家和技术专家共同创立。初期,公司专注于电子元器件的分销和贸易,凭借创始团队成员在行业内的人脉和资源,Cotco很快与多家知名电子元器件制造商建立了合作关系,开始为客户提供优质的元器件采购服务。随着市场需求的不断增长,Cotco的业务也逐渐扩展,开始涉足电子产品的设计和生产领域。

大毅科技公司的发展小趣事

随着业务的不断增长,大毅科技意识到需要扩大生产规模以满足市场需求。于是,公司开始在大陆地区寻找合适的生产基地,最终在东莞、清溪、苏州等地设立了生产基地。这一举措不仅降低了生产成本,还提高了生产效率,使大毅科技能够更好地服务全球客户。同时,这也体现了大毅科技对全球市场的战略眼光和布局。

问答坊 | AI 解惑

行业精英策论PCB设计关键技术

基于Ansoft电磁技术的新一代PCB仿真设计     针对PCB设计人员关注的问题予以讨论,剖析PCB电磁问题的实质及处理方法,介绍Ansoft仿真解决方案的技术特点,与同类型产品的定位关系及比较,并为您展示Ansoft电磁技术及工具在国内 ...…

查看全部问答>

除了定时器我还能用啥来喂狗

我用了一个看门狗芯片LTC1232,想每100ms喂狗,程序如下,OK没问题。 但现在我的两个定时器都要用到别的地方,做计数器用,难道我要在主程序里面每过一段时间喂狗码? 请高手指教 void time0() interrupt 1//定时器中断time0 {    ...…

查看全部问答>

兄弟们,2010年6月23日,中国足球机器人首获世界杯冠军了!

博创足球机器人助中国首获RoboCup2010中型组世界冠军                                ...…

查看全部问答>

[===============]WINCE arm开发板 上电后 全屏 自动运行 指定程序

第一次 接触  wince 开发板 首先遇到的问题是  要让用vs2003写的程序 在 设备 一上电 就 全屏 自动运行 这个问题 就是不想让用户 看到 wince 系统界面上的程序 请各位大侠 指教 …

查看全部问答>

[wince5.0]关于interruptinitialize的使用问题,请教!

我目前是在一个wince5.0平台上写个小驱动,需要在init里启用一个中断,于是就想到了interruptinitialize()这个函数。现在的问题是如果在原BSP里的某个驱动里使用这个函数调用就没有问题,并且能完成任务;但是我自己写的驱动,编译完成后就总是出现 ...…

查看全部问答>

NAND FLASH的spare区格式是什么啊?

NAND FLASH的spare区格式是什么啊? 小块的。。16BIT的。。。 …

查看全部问答>

关于1*16SDRAM的使用问题

各位大哥:本人现做的一个项目需要用到一个8M的RAM缓存,初步打算用1*16的SDRAM,主控是AVR单片机,我想请问一下哪位高手有用过普通单片机来控制SDRAM的呢?具体怎么实现?还有,究竟怎样通过执行LOAD MODE REGISTER命令,完成对SDRAM工作模式设定 ...…

查看全部问答>

买STN32开发板的遭遇

                                 打电话到北京英蓓特办事处问有无STN32开发板,有,兴冲冲找了一个多小时,才在边远地区找到,拿出开发板,但无ulin ...…

查看全部问答>

EXTI的中断问题

                                 stm32例子中的EXTI中断程序的开始都有一个功能是查哪个管脚发生的,以EXTI15_10_IRQHandler为例,在程序开始的时候 ...…

查看全部问答>