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

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来判断当前是否处于中断函数里。
当然,类似的情况很多,像can、i2c、spi等一样的道理。
举例,can总线发送数据加入队列:
ⅳ多说两句
以上的分析,看似很简单,其实包含的内容很多,可能有很多人觉得:这些问题对于我来说是小菜一碟。
说句实话,我和大家一样,都是慢慢学习过来的,这里面跳过的坑其实很多,是因为我跳过了太多的坑,所以才会对一些问题更加了解。
上面类似的问题,在我学习rtos、移植canopen等等那些时候都有遇到过,想要知道我遇到那些问题,处理起来难不难,明确回答:很多问题在初学的时候都很难,但我还是走过来了。
说到这里,多说一句,关于问问题的话,后台每天都有许多人问我问题,但是有些问题其实真的很简单,比如:编译有个变量未调用的警告、重复定义,多了一个分号等,这些看一下提示都知道。不要告诉我你英语差,我英语初高中从来都没有及格过,依然还是得看英文手册。确实不懂,安装一个翻译软件不难吧。

瑞萨电子陷困境 日本官商拟收购
一款智能镜子显示屏的应用,将定义全新的智能生活
新唐科技W588L150主板介绍
单片机串口通讯原理解析
杰华特带来多款串联锂电池保护方案,助力储能电源应用
关于如何判断CPU是否正在执行中断函数?
动态 | 华为支持北京金融科技产业联盟,发布《金融业IPv6发展演进白皮书》
温湿度计的使用注意事项及测量范围
DoDAF/MODAF的统一配置文件
电动汽车的发展与未来铜的市场需求
物联网影响教育和学习的五种方式
802.11n最大传输速率_802.11n支持5g频段吗
智能视频监控应用系统设计攻略
数字化浪潮下,意拉德电子如何砥砺前行?
大众拟数十亿欧元收购华为自动驾驶 小鹏汽车加速向无人驾驶过渡
这次后果可能很严重,iPhone会不会退出美国市场?
“草根”公司的AI技术
浩亭推出新型PushPull20针连接器,每个插针的容量高达2安培
影响4G工业路由器覆盖范围的因素都有哪些
改采星状分散式架构,PV发电系统克服遮蔽效应