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)和其他中断仍需要特权模式的权限。如果中断服务程序试图访问受限区域,可能导致线程无法运行。