μC/OS-MPU基于 ?C/OS-II,增加了内存保护扩展,这种保护称为“空间保护”,隔离 μC/OS-II 内核与任务。基于μC/OS-MPU,为任务提供了一个受保护的运行环境,其他任务不会干扰或损坏任务的内存,避免非法访问。
空间保护
空间保护旨在保护应用程序的内存不被其他任务破坏。下图展示了一个包含三个进程的系统,以说明空间保护的实现。通常,μC/OS-II 内部变量和线程(任务)放到进程#0。进程#1包含 2个线程。进程#2包含 3个线程,线程可以访问共享内存区域(shared memory)。进程#3是2个线程的集合,并且有权访问共享内存区域。
? 段的组织
在基于μC/OS-MPU的应用中,进程中的所有全局数据位于同一个段。下图展示了单个段的数据组织:在启动阶段,运行环境的启动函数将初始化数据(initialized data)从 ROM 复制到 RAM ,并清零未初始化数据(uninitialized data)。事实上,每个进程都有自己的段,在项目中,该组织结构可能存在多次。
未初始化数据
使用宏SP_MEM()放置变量,基于GCC链接器命令文件,将变量放置到段”.sec.bss”中。
示例:全局变量 Task1Stk[] 和 SyncSem 放置到段”sec01”中未初始化数据域。
将已有代码集成到μC/OS-MPU系统时,可以基于文件放置数据,仅需调整链接命令文件。
示例:基于提供的GCC链接命令文件模板,红色部分的行表示将文件 myfile.c中未初始化数据放置到段”secA0”中的未初始化数据域。
在启动阶段,我们需要清零段中未初始化数据域。为了简化实现,系统提供了一些有用的宏SP_INIT_()。
示例:在调用函数 MyInitData()时,段” sec01”和”secA0”中未初始化数据域清零。注意:函数”_zero_init”可能是启动环境外部提供的:
? 初始化数据
使用SP_MEM()将变量放置在段”.sec.data”中。
将已有代码集成到μC/OS-MPU系统时,也可以基于文件放置数据,仅需调整链接器命令文件。
示例:根据提供的GCC链接命令文件模板,红色显示的行表示将文件 myfile.c中的初始化数据放置到段” secA0”中的初始化数据域。
在启动阶段,我们需要复制段中的初始化数据域。为了简化实现,系统提供一些有用的宏SP_INIT_()。
示例:调用函数 MyInitData()时,段” sec01”和” secA0”中的初始化数据域,将从 ROM 复制到 RAM。
注意:函数"_data_init"可能不是启动环境提供的: