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

网友投稿 282 2022-10-27

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

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

1问题来源

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

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

2问题跟踪,并解决

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

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

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

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

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

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

3总结

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

1.宏定义注意事项

宏定义:

#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.中断函数接口宏定义

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java利用策略模式实现条件判断,告别if else
下一篇:k8s 的 PV 和 PVC 以及动态绑定过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~