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

    文章

    10855

    浏览量

    211610
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119601
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62151
收藏 人收藏

    评论

    相关推荐

    c51单片机中断

    优先级的中断正在处理,CPU 会暂停当前正在执行的指令,将程序计数器(PC)等关键寄存器的值保存到堆栈中,然后根据
    发表于 11-25 21:43

    关于中断知识学习总结笔记

    可以对变量进行赋值、进行条件判断并根据结果执行不同分支代码等。 函数调用能力 它们都具备调用其他函数的能力。在一个复杂的项目中,无论是普通函数
    发表于 11-23 11:23

    如何判断继电器是否正常工作

    判断继电器是否正常工作是一个涉及多个方面的过程,主要包括外观检查、电气性能测试以及实际应用中的表现等。以下将从这些方面详细阐述如何判断继电器是否正常工作。
    的头像 发表于 09-10 11:06 810次阅读

    【「ARM MCU嵌入式开发 | 基于国产GD32F10x芯片」阅读体验】+阅读中断

    进行通信的机制,外部通过中断的方式来通知处理器有事情发生了,而处理器有专门的模块根据发生的事情的紧急程序来决定是否要暂停正在执行的程序来响应中断
    发表于 09-01 23:59

    ESP32S2如何判断当前代码是否中断

    问题是,我怎么判断当前代码是否中断执行? rt_err_t IRAM_ATTR rt_event_send(rt_event_t event, rt_uint32_t set
    发表于 06-21 06:30

    对于中断,先执行中断服务函数还是先清理中断标志?

    对于中断,先执行中断服务函数还是先清理中断标志?开始学习固件库的时候,差不多是先进入服务函数在清
    发表于 05-22 07:20

    求助,帮忙判断下对ADC DMA回调函数的理解是否正确?

    但是结束完回调函数后,不管 DMA1 的 CH1 的优先级 是否比 DMA1 的 CH2 优先级高,都会重新 ADC1 的扫描,ADC2 的扫描永远不会进行,自然也不会 DMA1 CH2 的中断
    发表于 05-06 09:24

    如果单片机的程序正在执行中断服务程序,期间又有比正在执行中断级别高的中断结果会如何?

    请教一下,如果单片机的程序正在执行中断服务程序,期间又有比正在执行中断级别高的
    发表于 04-09 07:46

    执行判断CPU怎么设计?

    需要使用JUMP函数跳出吗,还是可以在EXE阶段的乘法器后面的精确乘法器上加一个使能段,根据预测结果判断要不要激活精确乘法器。但是这样会不会让EXE阶段的时钟周期过长?
    发表于 03-30 18:18

    CPU中断程序:从硬件看什么是中断

    CPU响应中断转去执行中断服务程序前,需要把被中断程序的现场信息保存起来,以便执行
    发表于 03-26 11:36 3717次阅读
    <b class='flag-5'>CPU</b><b class='flag-5'>中断</b>程序:从硬件看什么是<b class='flag-5'>中断</b>?

    关于CSD Capsense ISR的几个疑问求解

    ; 1、触发Capsense中断后,测量数据复制到定义的数据结构中不是在中断函数执行的,是通过调用CapSense_ProcessAllWidgets()
    发表于 02-01 08:31

    GD32 MCU是如何进入中断函数

    用过GD32 MCU的小伙伴们都知道,程序是顺序执行的,但当有中断来的时候程序会跳转到中断函数执行
    的头像 发表于 01-30 09:45 1074次阅读
    GD32 MCU是如何进入<b class='flag-5'>中断</b><b class='flag-5'>函数</b>的

    如何判断电感是否损坏吗

    电子发烧友网站提供《如何判断电感是否损坏吗.docx》资料免费下载
    发表于 01-22 09:25 0次下载

    系统函数怎么判断低通高通

    判断一个系统函数是低通还是高通,可以通过多种方法和指标来进行分析。下面将介绍常用的几种判断方法,并详细解释每种方法的原理和应用。 频率响应分析法 通过分析系统函数的频率响应特性,可以
    的头像 发表于 01-12 11:06 3530次阅读

    ADUCM360如何用外部中断CPU从睡眠模式唤醒?

    并未唤醒CPU执行其他操作。 问题是: 1.设置的代码是否有错误或者遗漏的地方? 2.外部中断是否上升沿或下降沿触发都可以?
    发表于 01-12 06:59