日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

使用FreeRTOS遇到死等異常的解決_操作系統

作者:jiang_2018 ? 更新時間: 2022-06-09 編程語言

問題場景:

在使用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
如下說明

在這里插入圖片描述

原文鏈接:https://blog.csdn.net/weixin_41572450/article/details/109604927

欄目分類
最近更新