千家信息网

使用FreeRTOS遇到死等异常怎么解决

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容介绍了"使用FreeRTOS遇到死等异常怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2026年10月31日使用FreeRTOS遇到死等异常怎么解决

本篇内容介绍了"使用FreeRTOS遇到死等异常怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

问题场景:

在使用apollo3时,调试时发现在ADC中断中一发送信号量就卡住。

追溯代码:

追溯代码发现其实是在ADC中断中调用xQueueGenericSendFromISR就卡住,卡住位置如下

这个宏定义如下


继续往里看,发现卡在下面位置

此断言如下

所以打印看到的条件是0>=128,所以就while(1);卡在这里了

分析代码

这是获得ipsr寄存器的值,保存在ulCurrentInterrupt变量,那ipsr寄存器代表的是什么呢,这里有写https://blog.csdn.net/weixin_41572450/article/details/105027244
表示中断编号,而这个宏

表示用户中断编号是从16开始,1-15就是我们熟悉的内核中断编号,如下

apollo的中断编号如下

可以看到内核部分也是16个,其中ADC的中断编号编到32(注意这里要加上内核的16个编号),
所以

if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )

这个条件是说当产生了外部中断,就走if条件里面,

归纳下就是

ucCurrentPriority = ( uint8_t * )(0xE000E3F0+ulCurrentInterrupt)即ucCurrentPriority = ( uint8_t * )(0xE000E3F0+32)即ucCurrentPriority = ( uint8_t * )(0xE000E400+16)

其中,0xE000E400是NVIC->IP寄存器地址

这里存放的外部中断的中断优先级,如下

所以这里的0>=128的0是IP[ADC]寄存器复位值,就是把ADC中断优先级设置成0了,说明初始化时没有设置ADC优先级,检查下果然漏了,添加下面设置就没问题了

那128是怎么来的?如下

所以是128.

最后发现之前大段英文注释有说这个问题,最后还有网址
https://www.freertos.org/FAQHelp.html
如下说明

"使用FreeRTOS遇到死等异常怎么解决"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

寄存器 代码 优先级 内核 就是 条件 问题 位置 内容 更多 知识 实用 学有所成 接下来 代表 信号 变量 困境 地址 场景 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技股 广州大一互联网络科技有限公司 湖南永感互联网科技有限公司 互联网和科技技术 互联网最新的科技 互联网最新的科技有限公司 深圳科技互联网 互联网科技公司发展 亿账通互联网科技 顺网科技2021年互联网排名 北京三清互联网科技 深圳国际航运科技和互联网 宁波青枫互联网科技有限公司 华夏互联网科技业 洛阳昕诺飞互联网科技有限公司 国大互联网教育科技有限公司工作 西安小鹰速贷互联网科技有限公司 卓翼科技产业互联网合作 领航科技大厦互联网公司 珠海东科互联网科技有限公司 伟宏互联网科技 合肥互联网科技公司 互联网科技产品 济南华为互联网科技产业总部基地 千方科技属于互联网企业吗 晋城互联网科技 朱啸虎曾投资哪些互联网科技企业 图游互联网科技 科技信息时代互联网发展 马化腾互联网科技教学
0