概述
这是关于为基于 MCU 的系统实现高安全性的系列文章中的第二篇。在这篇文章中涉及的安全基础,划分MCU软件,父/子任务,utasks和ptasks的优势。在本文中,我们将详细介绍 MPU 管理。如第一篇文章所述,这不是教程。为此,建议参考文章末尾的参考资料。
图 1 显示了任务控制块 (TCB)、内存保护阵列 (MPA)和MPA 模板之间的关系。
图 1:模板、MPA 和 TCB 关系。(来源:作者)
请注意,MPA 模板可能适用于单个 MPA 和任务,也可能在任务及其 MPA 之间共享。通常,在后一种情况下,任务将在同一分区中。还有一个不需要模板的默认 MPA。当没有为任务创建 MPA 时使用它。在接下来的部分中,我们将讨论如何定义模板。
定义区域
正如本系列的第一篇文章中所讨论的,定义分区的第一步是定义分区需要的代码、数据和 IO 区域以及某些标准区域,这些区域将在下面讨论。为此,第一步是定义部分。
部分
为了定义部分,没有必要重新组织包含来自其他分区的代码或数据的模块。为此,可以使用编译指示,如下(注意:所有代码和说明均针对 IAR EWARM 工具套件):
#pragma default_function_attributes = @ ".t2a_text"
无效 ttCD18_t2a(无效)
{
…
}
#pragma default_function_attributes =
同样,对于数据:
#pragma default_variable_attributes = @ ".t2a_data"
u32 irq;
TCB_PTR 父级;
u32 tskctr;
#pragma default_variable_attributes =
分散在许多模块中的同一节 pragma 定义由链接器合并为一个节。如果模块在各处的编译指示变得过于混乱,那么可以将一个分区的代码和数据分组到相同的分区模块中。然后,可以使用命令行选项,而不是编译指示。例如,在一个分区模块的项目文件中的 Options / C/C++ Compiler / Extra Options 中,如下:
--section.bss=.t2a_bss
--section.data=.t2a_data
--section.text=.t2a_text
--section.rodata=.t2a_rodata
--section.noinit=.t2a_noinit
只需重命名编译器分配的节名称。(一定要覆盖Inherited settings。)如果一个分区的几个模块被分组到一个项目文件节点中,那么上面的内容只需要放在那个节点的选项中。或者,代替上述内容,将以下内容放入额外选项中:
-f $PRO
最后
以上就是可靠板栗为你收集整理的实现完全 MCU 分区隔离:MPU 管理的全部内容,希望文章能够帮你解决实现完全 MCU 分区隔离:MPU 管理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复