使用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遇到死等异常的解决的详细内容,更多关于FreeRTOS死等问题的资料请关注我们其它相关文章!

(0)

相关推荐

  • FreeRTOS动态内存分配管理heap_4示例

    目录 heap_4.c 内存堆管理 数据结构如下 分配 内存堆初始化 把新构造的结构体插入空闲链表 释放 还剩空闲字节数 历史剩余最小字节数 适用范围.特点 heap_4.c 内存堆管理 heap_4也是用链表来管理,但是链表头用的是结构体,链表尾用的是指针,链表尾占用ucHeap内存 数据结构如下 /* Define the linked list structure. This is used to link free blocks in order of their memory addr

  • FreeRTOS实时操作系统空闲任务的阻塞延时实现

    目录 什么是阻塞延时.为什么需要空闲任务 空闲任务的实现 阻塞延时的实现 xTicksToDelay 递减 SysTick初始化 仿真 什么是阻塞延时.为什么需要空闲任务 RTOS中的延时叫阻塞延时,即任务需要延时时,任务会放弃cpu使用权,cpu转而去做其他的事,当任务延时时间到后,任务重新请求获得cpu使用权.但当所有的任务都处于阻塞后,为了不让cpu空闲没事干就需要一个空闲任务让cpu干活. 空闲任务的实现 空闲任务实现和创建普通任务没区别,空闲任务在调用vTaskStartSchedul

  • FreeRTOS动态内存分配管理heap_2示例

    目录 heap_2.c 内存堆管理 分配 初始化内存堆 把新构造的结构体插入空闲链表 释放 还剩空闲字节数 适用范围.特点 heap_2.c 内存堆管理 heap_2和heap_1一样是开辟一个大数组作为堆空间供用户使用,但是采用单项不循环链表来管理内存的分配释放,主要思想是用链表把内存块串起来,数据结构如下 /* Define the linked list structure. This is used to link free blocks in order of their size.

  • FreeRTOS动态内存分配管理heap_5示例

    目录 heap_5.c vPortDefineHeapRegions 常见问题 heap_5.c heap5与heap4分配释放算法完全相同,只是heap5支持管理多块不连续的内存,本质是将多块不连续内存用链表串成一整块内存,再用heap4算法来分配释放.若使用heap5则在涉及到分配释放的函数调用时要先调用vPortDefineHeapRegions把多块不连续内存串成一块初始化. vPortDefineHeapRegions 此函数原型 void vPortDefineHeapRegions

  • FreeRTOS实时操作系统的列表与列表项操作示例

    目录 前言 列表项数据结构 列表项初始化 列表数据结构 将列表项按照升序排列插入到列表 将列表项从列表删除 前言 FreeRTOS列表与列表项其实就是链表和节点,在list.c和list.h实现 列表项数据结构 //列表项数据结构 typedef struct xLIST_ITEM { TickType_t xItemValue; //辅助值,用作节点做顺序排序 struct xLIST_ITEM * pxNext;//后继指针 struct xLIST_ITEM * pxPrevious;//

  • FreeRTOS实时操作系统的任务创建与任务切换

    目录 任务控制块数据结构 任务创建函数 定义就绪表 就绪表初始化 启动调度器 任务切换 任务控制块数据结构 任务控制块数据结构在task.c声明 typedef struct tskTaskControlBlock { volatile StackType_t * pxTopOfStack; //栈顶指针 ListItem_t xStateListItem; //任务节点 StackType_t * pxStack; //任务栈起始地址 char pcTaskName[configMAX_TAS

  • 使用FreeRTOS遇到死等异常的解决

    目录 问题场景: 追溯代码: 分析代码 问题场景: 在使用apollo3时,调试时发现在ADC中断中一发送信号量就卡住. 追溯代码: 追溯代码发现其实是在ADC中断中调用xQueueGenericSendFromISR就卡住,卡住位置如下 这个宏定义如下 继续往里看,发现卡在下面位置 此断言如下 所以打印看到的条件是0>=128,所以就while(1);卡在这里了 分析代码 这是获得ipsr寄存器的值,保存在ulCurrentInterrupt变量,那ipsr寄存器代表的是什么呢,这里有写htt

  • java.net.MalformedURLException异常的解决方法

    java.net.MalformedURLException at java.net.URL.<init>(URL.java:619) at java.net.URL.<init>(URL.java:482) at java.net.URL.<init>(URL.java:431) 代码中URL url = new URL(someUrl);这一行出现java.net.MalformedURLException异常 解决方法是,对someUrl中的参数名和参数值都URL

  • java 出现Zipexception 异常的解决办法

    java 出现Zipexception 异常的解决办法 1 异常描述 在从 SVN 检出项目并配置完成后,启动 Tomcat 服务器,报出如下错误: 2 异常原因 通过观察上图中被标记出来的异常信息,咱们可以知道 Java.util.zip.ZipException: error in opening zip file 此异常,为:打开zip文件异常. 实际上,咱们观察错误信息的上面一行,即警告部分的时候,就可以发现引起这个异常发现的原因很可能就是位于 Tomcat 安装文件目录中lib文件夹下

  • 使用nodejs中httpProxy代理时候出现404异常的解决方法

    在公司中使用nodejs构建代理服务器实现前后台分离,代码不能拿出来,然后出现httpProxy代理资源的时候老是出现404.明明被代理的接口是存在的.代码大概如下: var http = require('http'), httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({}); var server = http.createServer(function(req, res) { proxy.

  • java中double类型运算结果异常的解决方法

    问题: 对两个double类型的值进行运算,有时会出现结果值异常的问题.比如: System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100); 输出: 39.989999999999995 0.33999999999999997 3.3000000000000003 0.12300000000000001 解决方法: J

  • collection集合体系与并发修改异常的解决方法

    collection是单列集合的顶层接口,下面还包括了两个常用子接口  List.set List: list接口有两个实现的子类:特点是:有序且可重复 ArrayList的数据结构是数组结构 LinkedList的数据结构是链表结构 1.ArrayList:特点:查询快 增删慢  初始容量大小为10 扩充容量算法为    ((旧容量 * 3) / 2) + 1 如果你知道你的arrayList 会达到多少容量,可以在初始化的时候就指定,能节省扩容的性能开支 2.LinkedList:特点: 

  • layui表格 返回的数据状态异常的解决方法

    最近用到了layui表格组件,结果发现数据返回状态异常 在网上查询了下是因为需要转成固定个格式 然而layui的table默认返回的数据格式为: response: { //定义后端 json 格式,详细参见官方文档 code: 0, msg: "", count: 1000, data: [] } 网上看了有些方法是转成json数据 JSONObject obj=new JSONObject(); //前台通过key值获得对应的value值 obj.put("code&qu

  • vue 项目build错误异常的解决方法

    在生成vue项目的时候,出现如下错误 ERROR in static/js/index.d66d806fcdd72b36147b.js from UglifyJs Unexpected token: punc (() [src/components/Hello.vue:26,0][static/js/index.d66d806fcdd72b36147b.js:34,6] ERROR in static/js/cell.89bb6f1195b769a2c949.js from UglifyJs U

  • Android Studio 视频播放失败 start called in state1 异常怎么解决

    在使用MediaPlayer播放音频时报出 E/MediaPlayerNative: start called in state 1, mPlayer(0x0) @Override public void onClick(View v){ Bundle b = new Bundle (); switch(v.getId ()){ case R.id.start: //获取一个Message变量,用来传递点击状态的值 msg = myHandle.obtainMessage (); //把状态的值

  • Mysql 字符集不一致导致连表异常的解决

    目录 1. 解决方法 2. mysql字符集 字符集 校验规则 做一个简单的如下的连表查询,居然直接提示错误,居然是字符集不一致的问题,本文记录一下mysql的字符集类型,以及下面这个问题的解决方案 select a.id, b.id from tt as a, t2 as b where a.xx = b.xx -- Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT)

随机推荐