1、 文檔目標
在嵌入式開發領域,尤其是在使用ARM Cortex-M系列微控制器時,MDK(Keil Microcontroller Development Kit)是開發者最常用的集成開發環境之一。而RTX(Real-Time eXecutive)作為一款輕量級實時操作系統內核,廣泛應用于需要高效任務調度和資源管理的場景中。然而,在某些復雜的應用環境中,例如啟用了MPU(Memory Protection Unit)后,可能會遇到RTX線程無法正常啟動的問題。這種問題不僅會影響系統的功能實現,還可能對項目的開發進度造成顯著影響。因此,深入分析該問題的成因并提出有效的解決方案,具有重要的實踐意義。
2、 問題場景
在Keil MDK中,用RTOS2后,在Main函數中開啟MPU初始化后,RTX5的線程無法正常啟動,如圖2-1所示:


圖2-1
3、軟硬件環境
1)、軟件版本:Keil MDK5.41
2)、電腦環境:Windows 11
3)、外設硬件:無
4、解決方法
方法1:
打開工程的main函數中的MPU的初始化代碼,把“MPU_InitStruct.Size“設置為”MPU_REGION_SIZE_4GB”,如圖4-1所示:

圖4-1
注:當MPU的區域大小設置為MPU_REGION_SIZE_4GB時,它覆蓋了一個非常大的內存區域,這通常包括了整個地址空間,因此不太可能限制到RTX線程所需的特定內存區域。而當設置為MPU_REGION_SIZE_512KB時,覆蓋的內存區域較小,如果這個區域沒有正確覆蓋RTX線程的棧空間或需要訪問的內存區域,就可能導致線程無法正常啟動。
方法2:
如果不修改“MPU_InitStruct.Size”的值,打開RTX的配置文件把默認線程的模式修改為特權模式,如圖4-2所示:

圖4-2
注:在非特權模式下運行線程時,系統定時器(SysTick)和其他中斷仍需要特權模式的權限。如果中斷服務程序試圖訪問受限區域,可能導致線程無法運行。

首頁 > 資源中心 > FAQ
