0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

宏定义 “中断函数接口”的注意事项

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-07 16:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天周六,写点轻松一点的内容,相信很多朋友都有使用宏定义的经历。宏定义写得好,你的代码修改、调试、移植等都方便;相反,写的不好,可能你的头脑会炸掉。

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来说,为了移植方便,使用宏定义三个中断函数,如下图:

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源代码
    +关注

    关注

    96

    文章

    2953

    浏览量

    69668
  • USART
    +关注

    关注

    1

    文章

    201

    浏览量

    32938
  • 宏定义
    +关注

    关注

    0

    文章

    51

    浏览量

    9365
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    迅为RK3588开发板Android系统烧写及注意事项

    迅为RK3588开发板Android系统烧写及注意事项
    的头像 发表于 12-03 15:17 6117次阅读
    迅为RK3588开发板Android系统烧写及<b class='flag-5'>注意事项</b>

    驱动板PCB布线的注意事项

    PCB Layout 注意事项 1)布局注意事项: ●● 整体布局遵循功率回路与小信号控制回路分开布局原则,功率部分和控制部分的 GND 分开回流到输入 GND。 ●● 芯片的放置方向优先考虑驱动
    发表于 12-02 07:40

    CW32F030在使用中的注意事项有哪些?

    CW32F030在使用中的注意事项有哪些?
    发表于 11-18 06:20

    emWin AppWizard 开发注意事项有哪些?

    emWin AppWizard 开发注意事项
    发表于 09-04 06:18

    sc接口光纤安装方法和注意事项

    SC接口光纤的安装方法主要涉及光纤端面处理、连接器安装以及连接后的测试,以下是详细的安装步骤和注意事项: 一、准备工作 工具与材料: 光纤剥线钳:用于剥除光纤外层涂覆层。 光纤切割刀:保证光纤端面
    的头像 发表于 06-19 10:15 1482次阅读

    第十章 W55MH32中断应用概览

    本章讲述了W55MH32中断应用,涵盖异常类型、NVIC介绍、优先级定义与分组,阐述中断编程三要点(使能中断、配置 NVIC、编写服务函数
    的头像 发表于 05-22 17:07 1605次阅读
    第十章 W55MH32<b class='flag-5'>中断</b>应用概览

    美国Odyssey奥德赛电池充电注意事项全解析

    Odyssey奥德赛电池充电注意事项全解析 奥德赛电池作为高性能的深循环铅酸电池,广泛应用于汽车启动、摩托车、船舶以及备用电源系统中。正确的充电方法不仅能够延长电池寿命,还能保障其性能稳定发挥
    的头像 发表于 05-19 16:31 906次阅读
    美国Odyssey奥德赛电池充电<b class='flag-5'>注意事项</b>全解析

    IGBT器件的防静电注意事项

    IGBT作为功率半导体器件,对静电极为敏感。我将从其静电敏感性原理入手,详细阐述使用过程中防静电的具体注意事项与防护措施,确保其安全稳定运行。
    的头像 发表于 05-15 14:55 1233次阅读

    运算放大器的使用注意事项

    上篇我们了解了运算放大器的基本定义和内部工作原理。在本篇中,为了把运算放大器用好,建议我们在使用之前,先弄清一些重要的产品性质和注意事项
    的头像 发表于 04-07 17:18 1251次阅读
    运算放大器的使用<b class='flag-5'>注意事项</b>

    扫描电镜的日常维护有哪些注意事项

    扫描电镜日常维护的注意事项
    的头像 发表于 03-24 11:38 922次阅读
    扫描电镜的日常维护有哪些<b class='flag-5'>注意事项</b>?

    驱动板设计注意事项

    设计驱动板时我们需要考虑电路原理与元器件选择、PCB设计、热管理、电磁兼容性(EMC)、其他注意事项。以下是关于相关内容的详细介绍,让我们一起来简单的了解一下吧!
    的头像 发表于 02-12 13:48 1065次阅读

    GD32单片机GPIO结构及注意事项

    电子发烧友网站提供《GD32单片机GPIO结构及注意事项.pdf》资料免费下载
    发表于 02-07 17:27 3次下载
    GD32单片机GPIO结构及<b class='flag-5'>注意事项</b>

    智多晶DDR Controller使用注意事项

    最后一期我们主要介绍智多晶DDR Controller使用时的注意事项
    的头像 发表于 01-24 11:14 1361次阅读
    智多晶DDR Controller使用<b class='flag-5'>注意事项</b>

    AN20-仪表低通滤波器的应用注意事项

    电子发烧友网站提供《AN20-仪表低通滤波器的应用注意事项.pdf》资料免费下载
    发表于 01-12 11:25 0次下载
    AN20-仪表低通滤波器的应用<b class='flag-5'>注意事项</b>

    多层板埋孔设计注意事项

    多层板埋孔设计注意事项
    的头像 发表于 12-20 16:06 1253次阅读