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

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

3天内不再提示

关于如何判断CPU是否正在执行中断函数?

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

扫码添加小助手

加入工程师交流群

1.这是一个有许多经验的攻城狮都遇到过的坑,本文教你正确绕过这个坑;

2.教大家了解__get_CONTROL的用法,及xQueueSend和xQueueSendFromISR的区别;

Ⅰ问题来源

今天在FreeRTOS系统上移植了部分别人写的代码,移植前仔细看了下源码,确认没问题后,编译,下载,运行,突然“死机了”······

于是,我又再次确认了移植的代码,没有发现Bug所在。此时,我开启了在线调试功能,发现程序死在了“vPortEnterCritical”函数中的断言语句里。如下:

Ⅱ解决问题的过程

我解决问题还是按照常规思维,一步一步跟踪,很多问题其实都是类似道理,有规律可循。

1.查看configASSERT断言做了什么事?

跟踪代码:

#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

其中,里面taskDISABLE_ INTERRUPTS();就是关中断的意思。紧跟着后面执行了for( ;; );

看到这里,我明白了一点,就是死在for( ;; );里面了。

2.进一步查找问题

我又开始了思考,为什么会执行到这里来呢?为什么会执行portDISABLE_INTERRUPTS(); uxCriticalNesting++; if( uxCriticalNesting == 1 )等这些语句呢?

这就是我们常说的“临界段”,这一点我学习RTOS的时候已经明白了,这一个函数肯定会被调用。于是,我把目标锁定了portNVIC_INT_CTRL_REG这个参数:

#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )

0xe000ed04? 这个地址,相信之前了解过NVIC的都知道,就是Interrupt control state register.即中断控制状态寄存器

3.确定问题点

从上面的分析,其实问题都已经浮现出来了。于是查看了【Cortex-M3权威指南】中相关的内容。(PS:这本手册真的能解决很多问题,翻译成中文,对大部分朋友来说是一件好事)

其实,有这个一个寄存器:控制寄存器(CONTROL),里面讲述的非常清楚:

看上图,大概意思就是:在中断模式下,CONTROL[1]为0。于是,又把思路转向了core_cm3.c文件中的源码:

__ASM uint32_t __get_CONTROL(void){ mrs r0, control bx lr}

懂一点汇编的,相信在这里都已经明白,大概意思就是过去控制寄存器状态,这也是我开篇说的,让大家了解的__get_CONTROL。

4.在线调试,分析结论

上面分析出来控制寄存器CONTROL,那么我们需要验证是否符合我们预期的效果,通过在线调试,断电就可得出,如下面两图:

a.在非中断情况下的值0x02

b.在中断情况下的值0x00

至此,问题已经查明就是CONTROL。

Ⅲget_CONTROL的应用

一般在RTOS实时操作系统中,常常使用队列来处理我们的数据,也就是常说的FIFO(先入先出)。

比如:我们在FreeRTOS系统中,要将UART发送、或者接收的数据加入队列:在中断里加入队列,在非中断里加入队列。这个时候,就需要使用get_CONTROL来判断当前是否处于中断函数里。

当然,类似的情况很多,像CANI2C、SPI等一样的道理。

举例,CAN总线发送数据加入队列:

Ⅳ多说两句

以上的分析,看似很简单,其实包含的内容很多,可能有很多人觉得:这些问题对于我来说是小菜一碟。

说句实话,我和大家一样,都是慢慢学习过来的,这里面跳过的坑其实很多,是因为我跳过了太多的坑,所以才会对一些问题更加了解。

上面类似的问题,在我学习RTOS、移植CANOpen等等那些时候都有遇到过,想要知道我遇到那些问题,处理起来难不难,明确回答:很多问题在初学的时候都很难,但我还是走过来了。

说到这里,多说一句,关于问问题的话,后台每天都有许多人问我问题,但是有些问题其实真的很简单,比如:编译有个变量未调用的警告、重复定义,多了一个分号等,这些看一下提示都知道。不要告诉我你英语差,我英语初高中从来都没有及格过,依然还是得看英文手册。确实不懂,安装一个翻译软件不难吧。

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

    关注

    68

    文章

    11216

    浏览量

    222914
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122598
  • FreeRTOS
    +关注

    关注

    14

    文章

    497

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    mcu短时间内发生多次中断,如何解决中断丢失问题呢?

    ?例如:中断A在短时间内触发了3次,但是CPU来不及响应(中断A的执行函数时间长,或者正在
    发表于 12-05 07:07

    如何判断光栅尺是否需要清洁?

    如何判断RE74光栅尺是否需要清洁? ‌ 外观检查 ‌ 观察光栅尺表面是否有明显灰尘、油污或划痕。若发现污染物,需立即清洁‌ 1 。 ‌ 信号异常 ‌ 若出现计数不准、显示闪烁或坐标漂移,可能是
    的头像 发表于 11-22 10:25 434次阅读

    关于蜂鸟E203内核中断硬件实现中断嵌套的设计

    嵌套,可以有很多层(蜂鸟处理器该情况下不响应新的中端,继续执行正在处理的ISR,彻底完成后才响应新的中断请求) 注意:假设新来的中断请求的优先级比
    发表于 10-23 07:07

    如何判断射频模块的硬件是否损坏?

    判断射频模块(如射频信号发生器中的核心模块)的硬件是否损坏,需围绕 “ 直观物理异常、功能完全失效、参数极端异常、拆解后硬件特征 ” 四大维度展开,核心是区分 “硬件损坏(突发性、不可逆故障
    的头像 发表于 10-14 17:36 653次阅读

    rt_tick_increase 引用指针变量未判断是否为空?

    此指针变量使用之前没有判断是否为空,万一rt_system_scheduler_start此函数调用之前来滴答定时器的中断了,这样操作是不是会有风险
    发表于 10-09 08:07

    如何判断功率分析仪的校准周期是否需要调整?

    判断功率分析仪的校准周期是否需要调整,核心是围绕 “ 精度稳定性风险、使用场景变化、设备状态异常 ” 三大维度,通过 “数据验证、环境评估、设备跟踪” 找到周期与实际需求的不匹配点。本质是让校准周期
    的头像 发表于 09-25 17:34 469次阅读

    如何判断通信问题是否由设备故障引起?

    判断通信问题是否由 “设备故障” 引起,核心逻辑是“聚焦设备本身的‘硬件状态、软件配置、通信交互能力’,通过‘孤立测试 + 替换验证 + 故障定位’,排除链路、干扰、配置等外部因素,确认问题是否
    的头像 发表于 09-25 14:19 644次阅读
    如何<b class='flag-5'>判断</b>通信问题<b class='flag-5'>是否</b>由设备故障引起?

    求助,关于RT-Thread 最新版本timer.c rt_timer_check函数问题求解

    关于系统定时器超时处理函数rt_timer_check,V5.1.0版本和原来v4.1.1版本有个区别在于,进入超时回调函数t-&gt;timeout_func(t-&
    发表于 09-25 07:00

    如果在FMC执行“程序”或“擦除”时发生中断事件,是否会处理中断事件?

    如果在FMC执行“程序”或“擦除”时发生中断事件,是否会处理中断事件?
    发表于 08-27 08:01

    如果在FMC执行“程序”或“擦除”时发生中断事件,是否会处理中断事件呢?

    如果在FMC执行“程序”或“擦除”时发生中断事件,是否会处理中断事件?
    发表于 08-22 06:58

    如何判断伺服电机是否损坏

    伺服电机作为工业自动化领域的核心部件,其运行状态直接影响设备效率和生产线稳定性。判断伺服电机是否损坏需要结合多维度检测方法,从基础观察、性能测试到专业诊断层层递进。以下为系统性判断流程及实操要点
    的头像 发表于 05-12 17:21 2992次阅读
    如何<b class='flag-5'>判断</b>伺服电机<b class='flag-5'>是否</b>损坏

    CPU的各种指令和执行流程

    在集成电路设计中,CPU的指令是指计算机中央处理单元(CPU)用来执行计算任务的基本操作指令集。这些指令是CPU能够理解并执行的二进制代码,
    的头像 发表于 04-18 11:24 1913次阅读

    变频器是否有故障的方法判断

    变频器是否有故障用这几种方法就可以轻松判断,维修使用建议熟记 
    发表于 03-06 17:19 2次下载

    如何判断电路是否为高频电路

    在数字电路中,工程师需要判断该电路是否高频电路,以此确保电路性能稳定、减少信号失真和避免传输线效应,本文将分享如何判断电路是否为高频电路。 1、信号的上升沿/下降沿时间(Tr) 若信号
    的头像 发表于 01-20 10:49 1222次阅读

    全面解析:如何精准判断SMT贴片打样是否合格?

    一站式PCBA智造厂家今天为大家讲讲SMT贴片打样是否合格如何判断?判断SMT贴片打样是否合格的方法。在电子设备制造领域,SMT贴片打样是产品开发和生产过程中的关键环节。合格的SMT贴
    的头像 发表于 01-07 09:29 807次阅读