空间隔离操作系统µC/OS-MPU中段的定位

描述

介绍

本应用笔记描述了使用 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()放置变量,基于GCC链接器命令文件,将变量放置到段”.sec.bss”中。

示例:全局变量 Task1Stk[] 和 SyncSem 放置到段”sec01”中未初始化数据域。

操作系统

将已有代码集成到µC/OS-MPU系统时,可以基于文件放置数据,仅需调整链接命令文件。

示例:基于提供的GCC链接命令文件模板,红色部分的行表示将文件 myfile.c中未初始化数据放置到段”secA0”中的未初始化数据域。

操作系统

在启动阶段,我们需要清零段中未初始化数据域。为了简化实现,系统提供了一些有用的宏SP_INIT_)。

示例:在调用函数 MyInitData()时,段” sec01”和”secA0”中未初始化数据域清零。注意:函数”_zero_init”可能是启动环境外部提供的:

操作系统

·  初始化数据

使用SP_MEM()将变量放置在段”.sec.data”中。

示例:全局变量”MyNumber”和”MyValue”放到段” sec01”中的初始化数据域。此外,数据的值被放置在ROM中的数据区域。

操作系统

将已有代码集成到µC/OS-MPU系统时,也可以基于文件放置数据,仅需调整链接器命令文件。

示例:根据提供的GCC链接命令文件模板,红色显示的行表示将文件 myfile.c中的初始化数据放置到段” secA0”中的初始化数据域。

操作系统

在启动阶段,我们需要复制段中的初始化数据域。为了简化实现,系统提供一些有用的宏SP_INIT_)。

示例:调用函数 MyInitData()时,段” sec01”和” secA0”中的初始化数据域,将从 ROM 复制到 RAM。

注意:函数"_data_init"可能不是启动环境提供的:

操作系统

审核编辑 :李倩

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分