Matrix653 实现

更新时间:
2024-02-28
下载文档

Matrix653 实现

本节介绍 Matrix653 分时分区操作系统中内存块的实现原理。

内存块简介

Matrix653 支持 ARINC 653 P2-4 规范中的内存块服务(Memory Block Services)。内存块服务为分区提供了访问模块定义的特定物理内存块的方法。根据配置表中定义的访问权限,分区被授予(或拒绝)对内存块的访问权限。分区可以被授予对内存块的只读或读写访问权限。

注: 当使用内存块交换数据时,应用程序负责解决同步、内存一致性问题。内存块的潜在用途包括:

  • 使只读数据库(如预加载的导航数据库)对核心模块上的一个或多个分区可用。
  • 内存块可以映射到只读或读写内存映射的输入/输出设备。

Memory Block 的使用,需要 XML、BSP、Application 配置使用。

内存块的属性包括:名称、访问权限、cache 设置。

BSP 注册物理内存块时,调用 mx_memory_block_register() 接口,申请内存块结构体,加入 memory_block_list 链表。分区在创建时会遍历当前分区配置的内存块,会进行如下操作:

  • 根据名字查找 BSP 是否有注册;
  • 在本分区内的虚拟空间申请一块大小和注册时相同的内存区;
  • 在本分区页表内建立映射;

应用程序中通过 GET_MEMORY_BLOCK_STATUS() 获取内存块的属性,并通过获取到的 MEMORY_BLOCK_ADDR 属性直接读写该地址空间的数据。

XML 内存块配置

分区使用前,需要分区对内存块的配置,详细的内存块的 XML 配置详见 《Matrix653-IDE使用手册》 文档。最后生成类似以下 XML 配置:

<MemoryBlocks>
    <MemoryBlock AccessRights="READ_WRITE" CacheSetting="Cache_Off" Name="test_memblock"/>
</MemoryBlocks>

BSP 内存块注册

需要先在 BSP 中为内存块预留物理内存空间,根据需要,在 config.h 文件中增加如下配置:

/**********************************************************************************************
  RAM
**********************************************************************************************/

#define MX_CONFIG_BSP_RAM_BASE              (0)
#define MX_CONFIG_BSP_RAM_SIZE              (256 * 1024 * 1024)

#define MX_CONFIG_BSP_TEXT_BASE             (16 * 1024 * 1024)
#define MX_CONFIG_BSP_TEXT_SIZE             (16 * 1024 * 1024)

#define MX_CONFIG_BSP_DATA_BASE             (MX_CONFIG_BSP_TEXT_BASE + MX_CONFIG_BSP_TEXT_SIZE)
#define MX_CONFIG_BSP_DATA_SIZE             (32 * 1024 * 1024)

#define MX_CONFIG_BSP_MEM_BLOCK_BASE        (MX_CONFIG_BSP_DATA_BASE + MX_CONFIG_BSP_DATA_SIZE)
#define MX_CONFIG_BSP_MEM_BLOCK_SIZE        (64 * 1024)

接着向内核注册内存块,在bsp_init.c中增加如下代码:

void _mx_hook_memory_block_init(void)
{
    mx_memory_block_register("test_mem_blcok", MX_CONFIG_BSP_MEM_BLOCK_BASE, MX_CONFIG_BSP_MEM_BLOCK_SIZE);
}
文档内容是否对您有所帮助?
有帮助
没帮助