久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
一個(gè)跟STM32中斷優(yōu)先級有關(guān)的話題
[打印本頁]
作者:
taoran
時(shí)間:
2016-6-17 01:38
標(biāo)題:
一個(gè)跟STM32中斷優(yōu)先級有關(guān)的話題
近日有人咨詢問題如下:
“我用
STM32F7
MCU
開發(fā)產(chǎn)品,用到
STemwin
。在桌面有一個(gè)圖標(biāo),點(diǎn)擊圖標(biāo)后創(chuàng)建一個(gè)窗口,窗口中
3
個(gè)按鈕,和
1
個(gè)
listbox
。點(diǎn)擊窗口中的
CANCEL
按鈕窗口關(guān)閉。當(dāng)我多次打開關(guān)閉這個(gè)窗口時(shí),程序就會死!經(jīng)調(diào)試,程序是死在了硬件
I2C
的
while
循環(huán)中,如下代碼中:
static
HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t
Flag, FlagStatus Status, uint32_t Timeout)
{
uint32_t tickstart = HAL_GetTick();
/* Wait until flag is set */
if(Status == RESET)
{
while(__HAL_I2C_GET_FLAG(hi2c, Flag) ==
RESET)
{
/* Check for the Timeout */
if(Timeout != HAL_MAX_DELAY)
{
if((Timeout == 0)||((HAL_GetTick() -
tickstart ) > Timeout))
{
hi2c->State= HAL_I2C_STATE_READY;
/* Process Unlocked */
__HAL_UNLOCK(hi2c);
return HAL_TIMEOUT;
}
}
}
}...........
省略
或者
static
HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t
Timeout)
{
uint32_t tickstart = 0x00;
tickstart = HAL_GetTick();
if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) ==
SET)
{
/* Wait until STOP Flag is reset */
/* AutoEnd should be initiate after AF */
while(__HAL_I2C_GET_FLAG(hi2c,
I2C_FLAG_STOPF) == RESET)
{
/* Check for the Timeout */
if(Timeout != HAL_MAX_DELAY)
{
if((Timeout == 0)||((HAL_GetTick() -
tickstart ) > Timeout))
{
hi2c->State= HAL_I2C_STATE_READY;
/* Process Unlocked */
__HAL_UNLOCK(hi2c);
return HAL_TIMEOUT;
}
}
}...........
省略
該
I2C
程序是操作電阻觸摸屏芯片的,由
TIMER3
定時(shí)器定時(shí)調(diào)用它。
timer3
中斷優(yōu)先級是
[
0,1
。
I2C
程序中超時(shí)檢測是用的
SYSTICK,
其中斷優(yōu)先級是
[
0x0f,0
(
第一個(gè)數(shù)字為搶占優(yōu)先級,第二個(gè)數(shù)字為響應(yīng)優(yōu)先級
)。
調(diào)試發(fā)現(xiàn),程序死掉后,
HAL_GetTick()
返回值始終不變,這樣才進(jìn)入死循環(huán)!
懷疑是
systick
優(yōu)先級低,將其改為
[
0,0
最高優(yōu)先級后,依然會進(jìn)入上面的死循環(huán)!”
很明顯,上面用戶代碼是基于
STM32cube
庫
實(shí)現(xiàn)的。根據(jù)上面用戶反饋的問題描述,他是說程序有時(shí)會死掉,而且總死在
I2C
通信代碼里。這個(gè)
I2C
通信代碼是通過
TIM3
的中斷調(diào)用的,其中
I2C
通信中的
TIMEOUT
超時(shí)檢測又是依據(jù)
SYSTICK
中斷計(jì)時(shí)實(shí)現(xiàn)。【注:用戶設(shè)計(jì)的合理性,這里暫且不談】
應(yīng)該說用戶已經(jīng)意識到問題的原因了。如果
SYSTICK
優(yōu)先級低于
TIM3
中斷優(yōu)先級,而
I2C
通信又是在
TIM3
中斷里執(zhí)行,那在
I2C
程序運(yùn)行過程中
SYSTICK
中斷就沒法響應(yīng),無法進(jìn)行
TICK
計(jì)數(shù)的加減。如果此時(shí)
I2C
通信出現(xiàn)故障,
TIMOUT
超時(shí)檢測條件就永遠(yuǎn)不會成立。程序當(dāng)然就卡死在那里面了。
后來用戶將
SYSTICK
的優(yōu)先級從之前的【
0x0f,0
】調(diào)整為【
0,0
】后現(xiàn)象仍未改善。他認(rèn)為【
0,0
】是最高了。其實(shí),此時(shí)
SYSTICK
的搶占優(yōu)先級與
TIM3
搶占優(yōu)先級是一樣的,只是二者響應(yīng)優(yōu)先級不一樣。如果這樣的話,在
TIM3
中斷服務(wù)程序里,
SYSTICK
仍然無法響應(yīng)中斷進(jìn)行計(jì)數(shù),也就無法通過
TIMEOUT
檢測退出死循環(huán)。
如果反過來,將
SYSTICK
的搶占優(yōu)先級設(shè)置得比
TIM3
的搶占優(yōu)先級高,情況就不同了。比方將
SYSTICK
的優(yōu)先級配置為【
0,0
】,
TIM3
的優(yōu)先級配置為【
1,0
】
。如果這樣,
TIM3
中斷里調(diào)用
I2C
通信程序,如果
I2C
通信出現(xiàn)故障,
TIMEOUT
超時(shí)檢測就不會受阻卡死。因?yàn)榇藭r(shí)
SYSTICK
的搶占優(yōu)先級高于
TIM3
的
,
它可以打斷
TIM3
中斷程序進(jìn)行
TICK
的計(jì)數(shù)計(jì)時(shí),當(dāng)
I2C
程序檢測到
TIMEOUT
成立時(shí)就可以全身而退了。后來建議用戶如此調(diào)整的確改善。
小結(jié)下,問題源于用戶對中斷優(yōu)先級的理解不到位。在
MCU
開發(fā)應(yīng)用中因?yàn)橹袛鄡?yōu)先級處理不當(dāng)而導(dǎo)致困擾其實(shí)還挺多的,而且問題往往還比較隱蔽。
順便提醒下:對于
STM32F7/F4/F3/F1/L1/L4
系列芯片的中斷優(yōu)先級往往分為搶占優(yōu)先級和響應(yīng)優(yōu)先級。只有搶占優(yōu)先級不同時(shí)才會發(fā)生中斷的打斷和嵌套。如果搶占優(yōu)先級一樣的話,在同時(shí)發(fā)生中斷事件時(shí),響應(yīng)優(yōu)先級高的中斷源優(yōu)先得到響應(yīng)。如果搶占優(yōu)先級和響應(yīng)優(yōu)先級也一樣,同時(shí)發(fā)生中斷時(shí)根據(jù)其中斷向量表的序號決定。
對于基于
CORTEX M0/M0+
的
STM32F0/L0
系列,它們的中斷優(yōu)先級只有搶占優(yōu)先級,不分響應(yīng)優(yōu)先級。
相關(guān)話題:
STM32
系列
MCU
芯片
開關(guān)
總
中斷
的話題
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
福利精品
|
天天在线操
|
久久精品日
|
新超碰97
|
国产成人精品一区二区三区在线观看
|
91日b
|
国产大片黄色
|
欧美一级淫片007
|
黄色片免费
|
中文字幕高清av
|
国产成人精品一区二区三区四区
|
久久人人爽人人爽人人片av免费
|
久久久精品网站
|
黑人巨大精品欧美一区二区免费
|
日本成人中文字幕在线观看
|
国产美女在线观看
|
精品国产一二三区
|
91电影
|
777zyz色资源站在线观看
|
亚洲国产情侣
|
中文字幕在线网
|
精品国产乱码一区二区三区a
|
成人免费视频网站在线看
|
aa级毛片毛片免费观看久
|
国产精品久久久久久久免费观看
|
成人免费日韩
|
超碰在线97国产
|
天天干夜夜操
|
亚洲综合一区二区三区
|
国产精品一区二区在线播放
|
男人影音
|
天天色天天射天天干
|
国产成人一区二区三区
|
亚洲综合色视频在线观看
|
国产精品无码久久久久
|
国产日韩欧美一区二区
|
狠狠操狠狠操
|
国产精品久久久久久久久久免费看
|
欧美综合在线视频
|
国内精品一区二区
|
国产日韩欧美一区二区
|