RT-Thread 內核部分最后一個點 中斷管理,順帶著對前面所學知識做個小結。
目錄
前言
一、RT-Thread 中斷管理
1.1 Cortex-M架構
1.1.1 內核的中斷管理
1.1.2 嵌套向量中斷控制器
1.1.3 中斷向量表
1.1.4 中斷測試
1.2 RISC-V 架構
(待更新……)
1.3 中斷管理API
二、RT-Thread 記錄階段小結
結語
前言
在前面的內核基礎學習記錄中,我們所有的示例都沒有使用中斷,實際項目中斷使用不可或缺,本文我們就來看看在 RT-Thread 中是如何響應中斷,如何處理中斷的。
(說明一下,此時我們還沒有學習 RT-Thread 的設備模型。)
本 RT-Thread 專欄記錄的開發環境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發環境 及 配合CubeMX開發快速上手)
RT-Thread記錄(二、RT-Thread內核啟動流程 — 啟動文件和源碼分析
RT-Thread 內核篇系列博文鏈接:
RT-Thread記錄(三、RT-Thread 線程操作函數及線程管理與FreeRTOS的比較)
RT-Thread記錄(四、RT-Thread 時鐘節拍和軟件定時器)
RT-Thread記錄(五、RT-Thread 臨界區保護)
RT-Thread記錄(六、IPC機制之信號量、互斥量和事件集)
RT-Thread記錄(七、IPC機制之郵箱、消息隊列)
RT-Thread記錄(八、理解 RT-Thread 內存管理)
一、RT-Thread 中斷管理
本節主要目的在于說明在使用 RT-Thread 操作系統的時候如何處理中斷,中斷來了我們怎么寫程序。
中斷大家都不陌生,當 CPU 正在處理內部數據時,外界發生了緊急情況,要求 CPU 暫停當前的工作轉去處理這個 異步事件。處理完畢后,再回到原來被中斷的地址,繼續原來的工作,這樣的過程稱為中斷。
中斷是一種異常!
RT-Thread 中斷管理中,將中斷處理程序分為中斷前導程序、用戶中斷服務程序、中斷后續程序三部分:
RT-Thread 雖然提供了統一的中斷管理接口,但實際上在不同的架構上,會有一些區別。
1.1 Cortex-M架構
在官網是用的Cortex-M 架構的內核作為說明,而本專欄記錄也是使用的 Cortex-M 架構的 STM32,要了解 RT-Thread 在 Cortex-M 內核上的中斷管理,就得首先知道 Cortex-M 內核的中斷管理。
1.1.1 內核的中斷管理
Cortex-M 內核的中斷管理在《Cortex-M3與Cortex-M4權威指南》這個文檔里有詳細的說明。
在我的博文中,我已經多次提及這個文檔了,實際上我們學習芯片所有的資料官方都有,官方的資料不僅全還權威,只不過大部分人都忽略了官方手冊。
所以不管是學習什么芯片,官方手冊才是我建議的第一參考資料!!
說明一下類似于這種官方文檔,官網可以下載,還有一般正規點的開發板比如原子,野火,百問科技都會有配套資料里面都能找到。
在我講 RTOS任務調度原理解析 的文章中也有對于 Cortex-M架構 內核中斷管理的說明:
只要是基于 Comtex-M 內核,那么都得以內核的中斷管理為標準,RT-Thread也不例外,所有 RT-Thread 中斷管理的相關內容在上面推薦博文都能找到,可以結合官方說明查看。
1.1.2 嵌套向量中斷控制器
在Cortex-M 內核中,有一個專門的中斷控制器 NVIC(嵌套向量中斷控制器),支持中斷嵌套功能。
當一個中斷觸發并且系統進行響應時,處理器硬件會將當前運行位置的上下文寄存器自動壓入中斷棧中,這部分的寄存器包括 PSR、PC、LR、R12、R3-R0 寄存器(在上面推薦博文有過說明)。
NVIC 這個我們就很熟悉了,在 RT-Thread 操作系統上也是使用的內核的 NVIC 作為中斷管理,在系統啟動的時候肯定會有 NVIC 的初始化,我們看一下 NVIC在哪里初始化的,如下圖:
NVIC 設置的問題我們這里就不過多的說明了,這個就算不明白網上資料也很多。
1.1.3 中斷向量表
在 Cortex-M 內核上,所有中斷都采用中斷向量表的方式進行處理,即當一個中斷觸發時,處理器將直接判定是哪個中斷源,然后直接跳轉到相應的固定位置進行處理,每個中斷服務程序必須排列在一起放在統一的地址上(這個地址必須要設置到 NVIC 的中斷向量偏移寄存器中)。
還是在系統啟動的時候,我們講到過啟動文件里面有中斷向量表,對應著芯片上所有的異常:
如果使用過 STM32CubeMX 開發的朋友應該知道,生成的工程中會有stm32xxxx_it.c
和stm32xxxx_it.h
這兩個文件,在這個文件中就是我們 用戶 中斷處理的函數,和中斷向量表是一一對應的,如下圖所示:
如果使能了中斷不實現中斷響應函數,發生中斷后都會進入 Default_Handler這個死循環。
在使用 RT-Thread 的時候也需要遵循這個中斷向量表,雖然我們之前的講解中,我們自己并沒有使用中斷作為示例,但是有些中斷還是需要用到,而且系統已經實現了。
比如我們講到過的滴答定時器的的中斷響應函數:
再比如我們打印日志的串口1:
不僅如此,我們可以通過跳轉的方式查看 RT-Thread 都做了哪些中斷函數的處理,比如 GPIO外部中斷:
總的來說,RT-Thread 在 Cortex-M 內核上的管理還是遵從內核本身的 NVIC,所有中斷都采用中斷向量表的方式進行處理,用戶如果想要響應中斷,直接實現中斷向量表中定義的函數即可。
1.1.4 中斷測試
通過上面的學習,我們已經知道了如何在 RT-Thread 中使用中斷處理,其實說白了和裸機一樣,自己實現中斷向量表中的中斷響應函數。
基本上學習 STM32CubeMX 生成的stm32xxxx_it.c中的方式一樣就可以,我們簡單的來測試一下:
使能一個定時器,開啟定時器中斷,每次中斷發生打印系統當前 tick 的值
OK!一切正常!
我們如果使用 RT-Thread Nano 版本,那么這就是我們常用的 中斷處理方式,后面我們會學習到RT-Thread 的設備模型,我們或許不需要自己去實現這些中斷響應函數,但是并不代表我們不是按照內核的中斷管理方式來進行,而是系統已經在底層為我們實現了這些函數。
1.2 RISC-V 架構
(待更新……)
( 對于 RISC-V 架構博主還在學習過程中,需要等等!= =!)
1.3 中斷管理API
雖然我們在 Cortex-M 內核上有些接口并沒有實現,而且我們已經知道了 程序中斷的處理方式了,但是這里也記錄一下中斷管理對應的API函數,方便以后使用其他架構也需要用到。
RT-Thread 把中斷和異常封裝的抽象接口如下:
其中 中斷鎖API 我們在將臨界區的時候,已經講到過;
中斷通知,我們以前也有接觸到,只是沒有加以說明,在進入中斷的時候,RT-Thread就會調用,比如滴答定時器中斷響應函數,和我們用來看 LOG 的串口1:
這里記錄API,還是老規矩:
/*
中斷服務程序掛接 Cortex-M上沒有
參數 描述
vector vector 是掛載的中斷號
handler 新掛載的中斷服務程序
param param 會作為參數傳遞給中斷服務程序
name 中斷的名稱
返回
return 掛載這個中斷服務程序之前掛載的中斷服務程序的句柄
*/
rt_isr_handler_t rt_hw_interrupt_install(int vector,
rt_isr_handler_t handler,
void *param,
char *name);
/*
屏蔽中斷源 Cortex-M上沒有
參數 描述
vector 要屏蔽的中斷號
*/
void rt_hw_interrupt_mask(int vector);
/*
打開被屏蔽的中斷源 Cortex-M上沒有
參數 描述
vector 要打開屏蔽的中斷號
*/
void rt_hw_interrupt_umask(int vector);
/*
中斷鎖
全局中斷關
返回值 描述
中斷狀態 rt_hw_interrupt_disable 函數運行前的中斷狀態
*/
rt_base_t rt_hw_interrupt_disable(void);
/*
中斷鎖
全局中斷開 與上面函數配合使用
參數 描述
level 前一次 rt_hw_interrupt_disable 返回的中斷狀態
*/
void rt_hw_interrupt_enable(rt_base_t level);
/*
中斷通知
進入
退出
詳細使用見上文例子
*/
void rt_interrupt_enter(void);
void rt_interrupt_leave(void);
/*
獲取中斷深度
返回 描述
0 當前系統不處于中斷上下文環境中
1 當前系統處于中斷上下文環境中
大于 1 當前中斷嵌套層次
*/
rt_uint8_t rt_interrupt_get_nest(void);
二、RT-Thread 記錄階段小結
到目前為止,RT-Thread 專欄已經有了 9篇文章(算上本文),我們來看一下目錄:
回頭來看一下我在第一篇文章中對 RT-Thread Nano 版本的介紹:
我們內核的線程管理,時間管理,中斷管理,內存管理,和線程同步與通信的IPC機制都已經記錄完了,這不就是我們已經完成了對 RT-Thread Nano 的學習記錄。
確實到這篇文章為止,我們確實是掌握了 RT-Thread Nano 所有的知識,我們已經可以使用 RT-Thread Nano 實現一些項目了。
雖然我們的專欄記錄還不止于此,但是我還是注重我們學習是為了快速的應用,所以我們標準版后期的組件,設備等一些知識先等一小會,先更新一篇實戰篇,使用 RT-Thread Nano 完成一個實際的小項目。
結語
本文的很多知識在以前相關博文都有過說明記錄,所以本文簡單過了一遍 RT-Thread 中斷的處理,通過本文學習,我們已經學會在 Cortex-M架 上使用 RT-Thread 時候的中斷處理。
然后同時也說明了一下,我們前面的記錄等于把 RT-Thread Nano 所有的知識全部學過了一遍,我們已經可以使用 RT-Thread Nano 做一些實際的應用。
所以下面一篇博文博主會更新一篇實例,在 STM32L051 上使用 RT-Thread Nano 做一個實際的應用。
(想想還有點小激動,終于要實戰用起來!~ ~)
好了,本文就到這里,謝謝大家!
審核編輯:湯梓紅
-
內核
+關注
關注
3文章
1363瀏覽量
40228 -
中斷
+關注
關注
5文章
895瀏覽量
41394 -
RTT
+關注
關注
0文章
65瀏覽量
17086 -
RT-Thread
+關注
關注
31文章
1272瀏覽量
39923
發布評論請先 登錄
相關推薦
評論