介绍
本应用笔记描述了使用 GCC 环境时,数据段的定位实现。
µC/OS-MPU介绍
µ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(
示例:全局变量 Task1Stk[] 和 SyncSem 放置到段”sec01”中未初始化数据域。
将已有代码集成到µC/OS-MPU系统时,可以基于文件放置数据,仅需调整链接命令文件。
示例:基于提供的GCC链接命令文件模板,红色部分的行表示将文件 myfile.c中未初始化数据放置到段”secA0”中的未初始化数据域。
在启动阶段,我们需要清零段中未初始化数据域。为了简化实现,系统提供了一些有用的宏SP_INIT_
示例:在调用函数 MyInitData()时,段” sec01”和”secA0”中未初始化数据域清零。注意:函数”_zero_init”可能是启动环境外部提供的:
· 初始化数据
使用SP_MEM(
示例:全局变量”MyNumber”和”MyValue”放到段” sec01”中的初始化数据域。此外,数据的值被放置在ROM中的数据区域。
将已有代码集成到µC/OS-MPU系统时,也可以基于文件放置数据,仅需调整链接器命令文件。
示例:根据提供的GCC链接命令文件模板,红色显示的行表示将文件 myfile.c中的初始化数据放置到段” secA0”中的初始化数据域。
在启动阶段,我们需要复制段中的初始化数据域。为了简化实现,系统提供一些有用的宏SP_INIT_
示例:调用函数 MyInitData()时,段” sec01”和” secA0”中的初始化数据域,将从 ROM 复制到 RAM。
注意:函数"_data_init"可能不是启动环境提供的:
审核编辑 :李倩
-
操作系统
+关注
关注
37文章
6801浏览量
123280 -
GCC
+关注
关注
0文章
107浏览量
24835 -
线程
+关注
关注
0文章
504浏览量
19675
原文标题:空间隔离操作系统µC/OS-MPU中段的定位
文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论