欢迎访问学兔兔标准下载网,学习、交流 分享 !

返回首页 |
当前位置: 首页 > 行业标准>航空航天民航 > 高清可复制 HB 8572-2020 民用飞机航空电子应用软件接口扩展要求

高清可复制 HB 8572-2020 民用飞机航空电子应用软件接口扩展要求

收藏
  • 大小:649.7 KB
  • 语言:中文版
  • 格式: PDF文档
  • 类别:航空航天民航
  • 更新日期:2026-05-12
本站推荐: 升级会员 无限下载,节约时间成本!
关键词:接口   复制   民用   扩展   航空
资源简介

  ICS 49.020 V 07

  HB 8572-2020

  民用飞机航空电子应用软件

  接口扩展要求

  Extended requirements for civil aircraft avionics

  application software interface

  2020-09-14 发布 2021-01-01 实施

  中华人民共和国工业和信息化部 发 布

  前 言

  本标准的附录 A 和附录 B 为资料性附录。

  本标准按照 GB/T 1.1-2009 给出的规则起草。

  本标准由中国航空工业集团有限公司提出。

  本标准由中国航空综合技术研究所归口。

  本标准起草单位:中国航空工业集团公司西安航空计算技术研究所、中国航空综合技术研究所、中国航空工业集团公司西安飞机设计研究所、中国航空工业集团公司成都飞机设计研究所。

  本标准起草人:韩 炜、陈 福、王 宁、崔西宁、周南明、魏学杭、牟 明、母方欣。

  民用飞机航空电子应用软件

  接口扩展要求

  1 范围

  本标准规定 了民用飞机机载嵌入式操作系统与航空电子应用软件接口扩展要求, 定义了对GJB 5357-2005 所描述的 API 的扩展(如:可选服务),描述了接口和服务的行为。

  本标准适用于民用飞机航空电子系统软件产品的开发,包括机载设备中的软件、独立的软件产品。

  2 规范性引用文件

  下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件, 仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。

  GJB 5357-2005 航空电子应用软件接口要求

  ARINC653 PART 2 航空电子应用软件标准接口扩展服务

  3 术语和定义、缩略语

  3.1 术语和定义

  下列术语和定义适用于本文件。

  3.1.1

  文件 file

  文件系统的存储元素,由数据组成。

  3.1.2

  文件系统 file system

  为了达到管理数据存储目的而采用的抽象方法。

  3.1.3

  日志 logbook

  用来存储消息,保留运行期间的信息。

  3.1.4

  模块调度 module schedule

  分配给某一组分区的偏移持续时间的数组。模块调度是分区分配运行时间的依据, 模块调度周而复始地每次从其开始时间运行,在调度表的结尾结束(即,主时间框架)。

  3.1.5

  服务访问点 service access point (SAP)

  给出了协议提供的一些服务。

  3.1.6

  卷标 volume

  存储设备(如 Ram disk ,FLASH)的标识。

  3.2 缩略语

  下列缩略语适用于本标准。

  AEEC——Airlines Electronic Engineering Committee,航空电子技术委员会;

  AFDX——Avionics Full Duplex Switched Ethernet,航空电子全双工交换式以太网;

  APEX——Application Executive Interface,应用执行接口;

  API——Application Program Interface,应用程序接口;

  APP——Application,应用;

  BCD——Binary Coded Decimal,二进制编码的十进制;

  BNR——Binary,二进制;

  CRC——Cyclic Redundancy Check,循环冗余校验;

  DS——Data Set,数据集;

  FDS——Functional Data Set,基本数据集;

  FS——Function Status,函数状态;

  FSS——Functional Status Set,函数状态集;

  HM——Health Monitor,健康监控;

  IP——Internet Protocol,网络协议;

  MAC——Media Access Control,介质访问控制;

  NVM——Non-Volatile Memory,非易失性存储器;

  O/S——Operating System,操作系统;

  POSIX——Portable Operating System Interface Standard,可移植操作系统接口标准;

  PVB——Parameter Validity Bit,参数有效性位;

  SAP——Service Access Point,服务访问点;

  SDI——Source/Destination Identifier,源/目的标识符;

  UDP——Universal Datagram Protocol,通用数据报协议;

  XML——Extensible Mark-up Language,可扩展标记语言。

  4 一般要求

  4.1 概述

  该文档定义的应用软件接口是对 GJB 5357-2005 的扩展,这些扩展服务中某一扩展服务的运行不依赖于其他扩展服务。如果扩展服务之间有相互依赖性, 那么这些依赖性将会在这里特别说明。这些扩展服务有可能依赖于 GJB 5357-2005 中定义的服务,但是这部分依赖关系并没有详细说明,因为扩展服务默认是符合 GJB 5357-2005 相关规定的。

  4.2 目的

  ARINC653 的原始发布为安全关键的嵌入式应用软件定义了服务的最小子集。当ARINC653 的使用扩展到新的系统时,对 ARINC653 的升级将覆盖一个更加广泛的需求范围,这包括可选的扩展服务的定义。

  4.3 扩展服务描述

  4.3.1 扩展服务概述

  本文定义了如下服务:

  a) 文件系统

  b) 采样端口数据结构

  c) 多模块调度表

  d) 日志记事本系统

  e) 采样端口扩展

  f) 服务访问点

  g) 命名服务

  h) 内存块

  i) 健康监控扩展

  j) 队列端口列表服务

  k) 多核处理扩展

  4.3.2 文件系统

  文件系统是一种通用的、抽象的数据存储管理方式, 提供对文件和目录进行打开、关闭、创建、读、写和删除等操作的一组服务。每个类型的实现应提供支持一组(包含一种或多种类型)存储介质(如: RAM,Flash,EPROM,基于网络的介质等)的集合,文件系统允许多个分区通过服务来访问存储介质。

  每个文件系统服务包括:检查与使用存储介质相关的参数错误、潜在的输入/输出错误。输入/输出错误的具体原因与介质相关。

  文件系统不能违反时间和空间分区需求。空间分区考虑应包括防止修改不属于分区的文件数据。分区可以使用文件系统从一个文件读数据和向一个文件写数据。文件可以被多个分区读取, 但是只能由一个分区写入。文件系统还包含一个认证机制,用于保证文件只能被在配置表中定义的,由文件所有者授权的分区访问。当介质当前处于只读状态时,写访问也应该被限制(如:可移动介质可以配置为只读)。

  配置表的项目包括:存储设备标识、访问权限、空间分配(配额)、文件描述符分配、卷名(应用用来访问卷的名字)。这些属性是存储设备作为卷访问的一部分。卷的创建和初始化(例如:装载)与实现有关,不作为文件系统提供的服务。在配置表中已定义的卷,在应用启动时是可以使用的。

  一个打开文件的每一个实例都有一个唯一的文件标识,每个文件标识包含一个唯一的位置指示器。在某个时刻,一个文件标识只允许执行一个文件系统操作。同一个分区内的多个进程允许使用一个文件标识。

  当分区停止、分区冷/热启动时,文件系统收到的分区以前发出的所有读请求全被丢弃。对于写操作,在这种情况下是否完成其执行是由具体的实现决定的,但是写操作的完成必须是原子的。属于被重启动分区的文件标识将不再有效。

  4.3.3 采样端口数据结构

  4.3.3.1 目的

  本节的目的是提供一个用于交换参数数据的标准的数据结构集合。该定义中包含了一个传送数据的状态的标准的方法,目的是减少不必要的参数格式可变性,并降低定制 I/O 处理的必要。这将提供应用软件的可移植性,并改善核心软件的效率。

  对于典型的数据总线(如,ARINC429,ARINC629,ARINC664 P7 等)这是类似的,即消息部署格式与标准类似那个与状态指示规则集合相兼容。因为分区间通信需要满足数据总线通讯的大部分或者全部目标,因此使得让它们具有相似的规则集合变得有意义。这也通过简化数据在网络中的传输,使得ARINC653 分区间消息在航空网络中的通信变得容易。这些数据结构可以应用于队列端口。

  4.3.3.2 假定

  以下是在使用这些数据结构时已经确定的假定和/或者约束:

  a) 数据的标识通过端口映射来解决。也就是说, 不明确地定义任何数据标记。这也意味着每个端口的数据结构通常是静态的。尽管如此, 在大小固定的情况下,一个端口内的可变的数据结构是允许的。

  b) 这些数据结构和服务支持的通信是“开环”的。不提供数据使用者和数据源之间交换状态的特定的方法。

  c) 特定消息的数据类型,参数和状态之间的关系,或者其他参数都没有包含在一个消息中。我们假定系统集成者通过其他手段提供这些关系。

  4.3.3.3 位/字节序

  所有的数据都应以大端(网络)的顺序呈现给应用软件。所有的应用软件都应以大端的顺序为分区间通信(如,SAMPLING_PORT_WRITE)提供数据。

  4.3.3.4 参数类型

  4.3.3.4.1 数据原型

  采样端口数据由一个或者更多的状态指示器组成,这些状态指示器遵从表 1 中的类型的参数并包括一个 CRC 码。

  表 1 数据原型

  4.3.3.4.2 数字离散量

  数字离散量数据类型用来表述二进制状态信息(如,开/关,真/假,使能/禁止,等)。大部分情况下使用一位的离散量,在需要增加数据完整性是使用两位的离散量。

  一个一位离散量精确地表述两个状态(0 和 1)。每个状态的含义是实现中定义的。

  一个两位离散量有四个可能的值,其中的两个被认为是有效的。0 或者 3 应被认为是无效的,1 和

  2 是有效的并且每个的含义都是由实现者定义的。1 对应于一位离散量中的“0”状态,2 对应于一位离散量中的“1”状态。两位离散量应是偶数位对齐的(如,0,2,4 位,等)。

  不同于本节中定义的其他数据类型,多位离散量参数应封装为一个 32 位字。离散量数据块也应该是 32 位对齐的,不使用的位应设置为 0。

  4.3.3.4.3 无符号整数

  无符号整数包括 8,16,32 和 64 位,这取决于所选择的数据类型。

  4.3.3.4.4 有符号整数

  有符号整数为 2 的补数表示,包括 8,16,32 和 64 位,这取决于所选择的数据类型。

  4.3.3.4.5 枚举

  枚举数据与有符号整数具有相同的基本类型,有 16 和 32 位大小。数字表现与整数相同。不同之处在于使用的目的。枚举类型用于表示特定数值的集合, 而不是一个范围的数据。对于通用枚举数据是不能够算术操作的。

  4.3.3.4.6 浮点

  定义了两个浮点类型,32 位和 64 位。32 位的 APEX_FLOAT 是一个IEEE754 兼容的单精度格式。 64 位的 APEX_DOUBLE 是一个 IEEE754 双精度格式。没有定义 APEX 单精度扩展或者双精度扩展类型。

  4.3.3.4.7 字符串

  字符串被用于保存从 0 到一个特定 ISO646 字符的最大数。一个字符串由两个元素组成。第一个是一个 32 位的长度标识,第二个是每个元素为 1 字节的字符数组。对于一个给定的参数,字符数组的大小是固定的,并且必须足够大以便保存预期字符的最大数。长度参数标识了有效字符的当前长度, 范围为从 0 到字符数组的最大长度。

  4.3.3.4.8 保留

  “保留”类型为与 ARINC653 定义的参数类型不兼容的数据。它用于支持一个应用软件之内(如,相同应用软件之内的两个分区之间)的数据传输,或者用于传输不需要系统之外使用的数据。唯一的限制是长度固定。

  4.3.3.5 循环冗余检查(CRC)

  CRC 用于提供被传输数据的附加完整性,它的使用是可选的,然而在所有消息中该域应是存在的。如果它被使用了,那么它包含了 CRC 余数,如果它没有使用,必须被设置为 0。

  4.3.3.6 总体结构

  4.3.3.6.1 总体数据格式

  每一个对 READ_SAMPLING_MESSAGE 或者 WRITE_SAMPLING_MESSAGE 调用包括一个消息数据缓冲的传输。该缓冲由 MESSAGE_ADDR 指针指向。该缓冲包含了一个或者多个“功能状态集合”,一个或者多个参数,以及一个可选的 CRC。图 1 为总体数据格式示例。

  图 1 总体数据格式示例

  从软件的视角来看,支持图 1 中的数据结构如下(伪代码);

  类型 GENERIC_MESSAGE 为结构

  RESERVED : APEX_UNSIGNED ;

  FSS : FSS_TYPE ;

  PARAM1 :

  PARAM2 :

  PARAM3 :

  LAST_PARAM :

  CRC : APEX_CRC

  结构体结束;

  4.3.3.6.2 数据对齐

  没有对齐的数据将降低运行时的性能。数据应该保持与参数大小一致的边界对齐。一个参数的位置应该是参数大小的精确倍数。例如,8 位的整数应该是字节对齐的。16 位的整数可以被存储在 4,6,8等字节位置(由一个 FS 保证)。64 为参数可以被存储在 8,16,24 等字节位置。

  4.3.3.7 功能状态

  4.3.3.7.1 概述

  功能数据集(FDS)是在消息中组合原始数据的一个方法。一个 FDS 由一个 FSS 和四个数据集(DS)组成。每个 DS 由一个或者多个原始数据组成,代表了飞行器参数或者其他数据,并且有一个通用的功能状态。

  FSS 用于评估一条消息内四个数据集的状态。FSS 为 32 位的最多有 8 位枚举参数的记录。每个 FSS参数,或者功能状态(FS)有一个相关的数据集,FS 反映的该数据集得状态。一个数据集由一个单独的消息中的一个或者多个连续的参数组成。一个数据集中所有的参数必须呈现相同的状态和失效特性。换句话说,因为一个数据集中的所有的参数携带相同的有效性指示(如,FS),如果其中一个是无效的,那么其他所有的将都是无效的。以下是数据集定义及相关的 FS。

  a) 一个消息中的每个参数必须与一个数据集相关联。

  b) 一个数据集可以由一个或者多个参数组成。

  c) 一个数据集中的所有的参数应具有相同的有效级别。

  d) 每个数据集必须有一个明确的 FS 与其关联。

  e) 当一个数据集由多余一个的参数组成,那么相关的参数必须在消息中是连续的。参数之间可以插入填充,以便与对齐规则相适应。

  f) FS 与数据集的联合应该以数据集在消息中存在的顺序完成。

  图 2 提供了一个图形化的例子来呈现消息,数据集定义以及 FS 关联。需要注意的是如果需要多余

  四个 FS,将会在与之前的 FSS 关联的数据集之后插入附加的 FSS 字。

  表 2 为 FS 定义了可能的值,含义,并且以此类推到典型的数据总线标准状态指示器。这些类比是逻辑的(如,它们转达了相同的含义,但没有数值)。它们可以被核心系统用来在状态指示和相连的数据总线间互相转换。

  图 2 采样端口消息示例

  在一条消息中必须有一个或者多个 FSS。FSS 的数目取决于映射到 FS 的参数。第一个 FSS 必须位于表 2 中显示的位置。参数到 FS 参数的关联必须是明确的。也就是说, 一个参数集必须明确地和一个FS 相关联。一个 DS 也可以包括空闲(如果需要增长)和填充区域(为了数据对齐)。一个 FS 参数必须设置为表 2 中的一个数值。

  表 2 功能状态(FS)数值

  4.3.3.7.2 NO_DATA 状态

  NO_DATA 表示一个失效或者多个失效的发生从而使有效的数据不被计算或/和发送的状态。当这样一个条件存在时,数据源应通过为关联的数据设置 FS 参数为 NO_DATA 来说明其检测到了一个失效。该条件表示参数数据是无效的。

  4.3.3.7.3 NORMAL_OPERATION 状态

  一个设置为 NORMAL_OPERATION 的 FS 参数表示相关联的参数是有效的,与数据源指定的值一致。所有与该 FS 参数关联的参数都可以被一个接收者使用。

  4.3.3.7.4 FUNCTIONAL_TEST 状态

  一个设置为 FUNCTIONAL_TEST 的 FS 参数表示源正在执行一个功能测试。相关联的数据有可能被该测试影响。使用或者不适用该关联的数据的决定是和实现相关的。

  4.3.3.7.5 NO_COMPUTED_DATA 状态

  一个设置为 NO_COMPUTED_DATA 的 FS 参数表示源因为一个系统失效而不能够计算可靠的数据。相关联的数据不应该被一个接收者使用。

  4.3.3.8 服务

  本节没有定义特定的服务。

  4.3.3.9 推荐的数据总线映射

  4.3.3.9.1 概述

  在典型的大规模系统中,大量的分区内通信数据将通过一个或者多个数据总线进行传输。在大部分或者所有情形下,一个数据总线上的数据表现形式是和本文档中定义的表现形式不同的。为了确保可移植性,有必要提供一个一致的数据和 ARINC653 端口以及数据总线的映射。本节提供了一些在经典航空数据总线上映射这些数据的建议。归纳这些建议是非常困难的, 因为网络体系结构的多样化以及数据表现形式在特定网络中是不一致的。本节中包含的信息应被认为是一个指导。系统集成者应为数据映射建立特定的指导。

  4.3.3.9.2 ARINC429 映射

  表 3 为 ARINC429 总线到ARINC653 端口的映射。

  4.3.3.9.3 ARINC629 映射

  表 4 为 ARINC629 总线到ARINC653 端口的映射。

  表 3 ARINC429 映射

  表 4 ARINC629 映射

  表 5 为 ARINC629 SSW 和 PVW 映射。

  表 5 ARINC629 SSW 和 PVW 映射

  表 6 为 ARINC629 SSW 和 PVW 反向映射。

  表 6 ARINC629 SSW 和 PVW 反向映射

  4.3.3.9.4 ARINC664 第七部分(AFDX)

  该映射确保端口映射遵循 ARINC664 规范第七部分中的指导。它也确保消息结构(IP/UDP)已经剥离并且保留下的是 UDP 有效数据。表 7 为 AFDX 总线到ARINC653 端口的映射。

  表 7 AFDX 映射

  4.3.3.10 示例

  4.3.3.10.1 概述

  以下是采样端口消息以及相应的数据类型定义的例子。这些例子以 Ada 和 C 语言呈现,并假定GJB 5357-2005 和附录 A 、B 中的定义。

  4.3.3.10.2 最小消息

  本节中定义的最小消息包含一个 FSS,无参数,以及一个 CRC。这是允许的,但可能是无用的。

  Ada:

  type MIN_MESSAGE_TYPE is record

  reserved : APEX_UNSIGNED ;

  status : FSS_TYPE ;

  crc : APEX_CRC ;

  end record ;

  for MIN_MESSAGE_TYPE use record

  reserved at mod 0 range 0..31;

  status at mod 4 range 0..31;

  crc at mod 8 range 0..31;

  end record ;

  C:

  typedef

  struct

  {

  APEX_UNSIGNED reserved ;

  FS_TYPE status ;

  APEX_CRC crc ;

  }MIN_MESSAGE ;

  4.3.3.10.3 简单双整数消息

  该消息包含两个参数,两个参数都是 32 位整数。因为所有的数据元素都是 32 位长度的,因此数据对齐是保证的。

  Ada:

  type TWO_PARM_MESSAGE_TYPE is record

  reserved : APEX_UNSIGNED ;

  status : FSS_TYPE ;

  param1 : APEX_INTEGER;

  param2 : APEX_INTEGER;

  crc : APEX_CRC ;

  end record ;

  for TWO_PARAM_MESSAGE_TYPE use record reserved at mod 0 range 0..31;

  status at mod 4 range 0..31;

  param1 at mod 8 range 0..31;

  param2 at mod 12 range 0..31;

  crc at mod 16 range 0..31;

  end record ;

  C:

  typedef

  struct

  {

  APEX_UNSIGNED reserved

  FSS_TYPE status ;

  APEX_INTEGER param1;

  APEX_INTEGER param2;

  APEX_CRC crc ;

  }TWO_PARM_MESSAGE ;

  4.3.3.10.4 混合参数类型和大小

  在本示例中,参数由一个 32 位整数,一个 16 位整数和一个 64 位双精度整数组成。为了满足数据对齐规则,必须包含“pad”参数。

  Ada:

  type COMPLEX_MESSAGE_TYPE is record reserved : APEX_UNSIGNED ;

  status : FSS_TYPE ;

  param1 : APEX_INTEGER;

  param2 : APEX_SHORT_INTEGER;

  pad1 : APEX_SHORT_INTEGER;

  pad2 : APEX_INTEGER;

  pad3 : APEX_INTEGER;

  param3 : APEX_DOUBLE ;

  crc : APEX_CRC ;

  end record ;

  for COMPLEX_MESSAGE_TYPE use record reserved at mod 0 range 0..31;

  status at mod 4 range 0..31;

  param1 at mod 8 range 0..31;

  param2 at mod 12 range 0..15;

  pad1 at mod 14 range 0..15;

  pad2 at mod 16 range 0..31;

  pad3 at mod 20 range 0..31;

  param3 at mod 24 range 0..63; -- Multiple of 64-bit offset

  crc at mod 32 range 0..31;

  end record ;

  C:

  typedef

  struct

  {

  APEX_UNSIGNED reserved

  FSS_TYPE status ;

  APEX_INTEGER param1;

  APEX_SHORT_INTEGER param2;

  APEX_SHORT_INTEGER pad1;

  APEX_INTEGER pad2;

  APEX_INTEGER pad3;

  APEX_DOUBLE param3;

  APEX_CRC crc ;

  }COMPLEX_MESSAGE_TYPE ;

  注意如果参数 1 和 2在相同的模式中是无效的,它们将会有一个与其相关联的FS 参数(如,status.fs1将用于表示两个参数的状态)。如果参数 3 在不同的模式中分别是有效的和无效的,它将会有不同的 FS参数与其相关联(如,status.fs2)。

  4.3.4 多模块调度表

  GJB 5357-2005 定义了一个单一的静态模块调度表。该调度表在配置表中定义,并在处理器执行时间的每个主帧重复。

  对于一些设备来说,一个单一的模块调度表具有很大的限制。以下列举了多模块调度表使用的例子:

  a) 初始化/程序细节-每个分区都需要一段特定长度的时间来初始化其变量,数据,结构,以及相关的硬件。分区完成初始化所需要的时间与正常操作所需要的时间基本上没有关系。如果正常操作所需要的时间比完成初始化所需要的时间短,为两种情形构造的一个单一的调度表可能会导致更长的初始化时间(根据正常操作优化)或者多余的分区窗口时间(为快速初始化优化)。通过定义为初始化定义一个调度表,一个系统可以同时满足初始化和正常运行的优化目的而不用在两者之间折中。

  b) 组件失效-在一个机柜结构中,持续飞行关键的程序在其主处理器失效时可以被安排在另外一个处理器上运行(替换一个非关键应用软件)。在这种情况下,就需要一个调度表来将失效的处理器上的应用软件包含进来。

  这些服务对模块调度表进行扩展,允许在配置表中定义多个调度表。一个授权的分区可以请求操作系统来切换当前正在运行的调度表。模块调度表在下一个主帧的开始完成切换。新的调度表中定义的分区将替代旧的调度表中的分区运行(如,以新的主帧周期和窗口持续时间运行)。

  配置表也进行了扩展来包含对每个分区的重启动动作(冷启动,热启动,忽略,空闲)。

  4.3.5 日志记录本系统

  日志记录本的抽象的概念是用来存储消息。日志记录本在一个电源失效之后保持存储的数据;这些数据在模块的电源恢复时可以被恢复。日志记录本的内容和状态不会被分区重启动更改。

  每个日志记录本只能够被一个分区访问。

  日志记录本包含了一个位于 RAM(随机存储器)的缓冲和一个 NVM(非易失存储器)区域。因为低层的非易失存储器或许具有写/读/擦出的延迟,日志记录本中记录的消息首先被存储在缓冲(称为“正在使用”的区域)中,然后才会被写入 NVM。RAM 缓冲允许应用软件快速连续的写入多个消息而不用象在 NVM 中一样需要在每个消息之间等待写入时间。

  4.3.6 采样端口扩展

  GJB 5357-2005 定义了采样端口使用的基本服务。航空电子应用软件接口扩展要求通过增加以下采样端口服务进行了扩展:

  a) READ_UPDATED_SAMPLING_MESSAGE

  b) GET_SAMPLING_PORT_CURRENT_STATUS

  c) READ_SAMPLING_MESSAGE_CONDITIONAL

  这些服务的主要目的是为应用软件读取采样端口消息提供更大的便利。通过提供这些便利, 强调了以下的 GJB 5357-2005 的约束:

  a) GJB 5357-2005 中的 GET_SAMPLING_PORT_STATUS 服务返回了接收到的消息被分区内的

  任何进程上次读取时的有效性,并不提供该服务被调用时的当前消息状态。GET_SAMPLING_ PORT_CURRENT_STATUS 服务允许应用软件判断该服务调用时消息是否有效。

  b) GJB 5357-2005 中的 READ_SAMPLING_MESSAGE 服务将总是读取采样端口消息除非端口中没有数据,而不考虑该消息是否已经被分区内的一个或者多个进程读取过。考虑到一些采样端口消息可能会很大,可能仅仅需要读取在上一次读取之后更新过的消息。

  c) READ_UPDATED_SAMPLING_MESSAGE 服务将返回分区内的任何进程上次读取之后更新过的消息。该服务计算并返回一个端口的消息读取标识。

  d) READ_SAMPLING_MESSAGE_CONDITIONAL 服务仅仅在给定的引用时间之后有更新才会返回消息。

  e) 一个采样端口的 REFRESH_PERIOD 属性适用于分区内的所有进程,即使分区内的不同进程需要以不同的频率来读取消息。这允许分区内的多个进程根据每个进程的读取数据的频率来决定数据是否是“新”的,而不是依据一个唯一的分区级的 REFRESH_PERIOD 属性。这样以来就可以通过从当前时间减去本地刷新率,并且为READ_SAMPLING_MESSAGE_CONDITIONAL传入计算后的时间戳作为参考时间戳,为多个函数(有可能位于多个进程中)提供“有新数据才读取”的能力支持。这将特别有效地支持多个进程读取在进程的刷新周期内到达的消息(对于非周期进程该刷新周期可能是无限大)。

  如表 8 中所示,读取采样端口的服务都不影响其他服务的行为。

  表 8 采样端口读取服务特性

  4.3.7 服务访问点

  4.3.7.1 总要求

  服务访问点(SAP)是一种特殊的队列端口,与普通队列端口的区别在于,使用 SAP 端口发送和接收消息时可以包含地址信息。SAP 服务接口与队列端口服务接口类似,但是 SAP 服务接口提供了支持地址信息的参数。

  SAP 端口通常用于客户机/服务器模式的应用,这些应用有一些地址信息,但是对于一个特定的消息来说必须指定一个唯一的接受者。这个信息可以实时更改, 因此有利于为应用软件提供一个控制寻址的机制。

  本文定义了两种类型的 SAP 服务。第一种或者标准的 SAP 服务提供有限的寻址能力。这个有限的能力确保发送者的标识不能够被发送者更改以及接受者是明确的。这就与在同一平台运行高关键级别和不同关键级别的应用的需求保持一致。

  第二种或者扩展的 SAP 端口服务提供完整的寻址能力。当分区在不同的网络域之间扮演网关的角色并且必须执行地址转换时,将会使用扩展 SAP 端口。我们期望扩展服务在有限的情况下使用,并且系统集成者对其使用具有控制能力。为了实现这个目的,SAP 的配置包含了允许使用扩展服务的端口标识。

  4.3.7.2 SAP 寻址

  寻址与传输消息的底层协议紧密结合,因此,不可能单独定义一个寻址标准,这将对应用程序在不同网络媒介之间的可移植性带来影响。下面是推荐的寻址标准。这些寻址标准基于以太网 UDP/IP 地址转换标准, 因为该标准在当前使用中占据主导地位,同时这些寻址标准也符合 ARINC664 第七部分(AFDX)为 SAP 端口定义的约定。第三章中定义的 SAP 地址数据结构允许使用其他的寻址规则。

  图 3 描述了以太网 UDP/IP 协议栈寻址的所有元素,标准的 SAP 端口只提供访问和更改部分元素的功能,这些可更改的元素在图中用“X”标识。对于源 SAP 端口,端口的目的 IP 地址和 UDP 端口号可以被应用程序更改。对于目的 SAP 端口,端口的源 IP 地址和 UDP 端口号对每一个接收到的消息都是可见的,并且可以更改。地址空间的其他元素是不可见或者不可更改的,并且需要在配置时确定。

  图 3 SAP 端口可操作性(标准服务)

  逻辑寻址在底层平台构造中是可见的并且是可更改的。

  4.3.7.3 SAP 端口配置

  4.3.7.3.1 概述

  SAP 端口配置与队列端口类似,但在配置上与队列端口区别对待,也就是说,调用 CREATE_ QUEUING_PORT 来创建一个配置为 SAP 端口的端口,或者调用 CREATE_SAP_PORT 创建一个配置为队列端口的端口,都会返回失败。

  4.3.7.3.2 SAP 端口属性

  SAP 端口属性与队列端口类似,以下描述 SAP 端口独有的属性。

  传输方式

  对于 SAP 端口通常设置为队列模式。

  协议类型

  该属性定义了传输时使用的协议,是 SAP 端口独有的,用以验证应用程序输入的地址信息。

  扩展的端口

  该属性标识该端口是否支持扩展服务。SAP 端口支持标准服务或者扩展服务中的一种。

  映射需求

  ARINC653 规范并不完整的为 SAP 端口定义有效的地址空间。因为寻址和消息流与底层的传输层相结合,ARINC653 规范不包括特定的寻址属性。端口和通道之间的映射与队列端口类似。

  在图 4 的示例中,O/S 不负责实时地址的管理,它只负责根据静态配置将数据从网络接口传输到分区。当通讯是位于一个单独的模块之内(如,一个单独的模块内的分区之间)时,在配置数据中可以表现为连接到一个源和一个或者多个目的的一个通道,并且是实现相关的。由一个内部通道在相同模块上的分区之间映射的 SAP 端口的可用性和行为是实现相关的,本标准不定义也不要求这些内容。

  对于整个系统来说,以下的内容或许需要被支持:

  a) SAP 端口可以向队列端口发送消息;

  b) 队列端口可以向 SAP 端口发送消息。

  图 4 SAP 端口通道映射示例

  4.3.8 命名服务

  4.3.8.1 总要求

  命名服务是 SAP 服务的一个伙伴,它允许分区根据名字获取一个地址或根据地址获取相应的分区名。底部实现也许很简单, 例如利用一个查找表,或者比较复杂,例如运用网络命名服务,这个标准并不限制实现的具体方式。

  命名服务被设计成可以或者不可以在实时环境下运行,如何不在实时环境下运行,正在调用的进程被加锁直到另一请求被完成,或者用户提供一个超时协定,超时隐含的只提供一个在实时环境下的实现。

  规范允许多个独立的服务。每个服务通过在创建服务的初始化过程中配置保留名被定义。

  4.3.8.2 命名服务配置

  标准中定义的配置没有明确实际的名字和地址迁移的配置。此外, 其他属性配置必须支持底层的实现,并且不改变标准中定义的服务的接口和行为。

  4.3.9 内存块

  内存块为分区提供了一个访问为模块定义的具体物理内存块的方法。分区被允许依据配置表中定义的访问权限访问内存块,分区可以被允许以只读或只写的方式访问内存块。

  4.3.10 健康监控扩展

  健康监控扩展为分区提供了一个在初始化过程中用错误处理进程管理错误的手段,ARINC653 的第一部分明确指出错误处理进程只有当错误在分区初始化过程中发生时才以正常的模式被触发,并在一个模块或者分区水平上被处理。

  健康监控扩展提供 ENABLE_ERROR_HANDLER 服务能够在初始化过程中触发错误处理进程。这个服务在错误进程被创建后调用,随后,如果在初始化过程中发生了错误并且健康配置表为这个错误明确了进 程 恢复动 作 ,健康 监 控将触 发 错误处 理 进程, GET_ERROR_STATUS 服务将返 回MAIN_PROCESS_ID 作为失败进程标识。当服务的行为没有在分区初始化过程中被定义时,错误进程不能够调用 STOP_SELF 而返回到主进程,所以,在 COLD_START 或者 WARM_START 模式下,错误

  处理进程应该停止或者重启分区。

  4.3.11 队列端口列表服务

  4.3.11.1 概述

  这个服务的目的是允许多个进程通过一个信号进程接收队列端口而无需进程持续查询每个端口。这对一个从大量端口接收数据并且希望每个端口服务的时间间隔相对低的应用很有用。ARINC 653 给出了两种实现选择,一种是为每个端口创建一个进程,另一种是通过一个信号进程查询每个端口。第一种选择可能会受到平台资源的限制,第二种选择可能在执行时间方面比较低效。尽管标准并不保证列表进程服务比应用查询更高效,但它确实提供给操作系统或者平台管理接收端口比其他方式更有效的能力。

  4.3.11.2 列表行为

  无论底层如何实现,从应用角度来看,端口列表是一个被操作系统以轮询调度的方式服务的顺序列表。列表中端口的顺序是由它们被加入列表的顺序决定的。第一个端口被放置列表的第一个位置,最后一个端口被放置列表的最后一个位置。

  列表的创建是由 CREATE_QUEUING_PORT_LIST 服务和一系列 ADD_PORT_TO_LIST 服务完成的。

  每一个列表都由操作系统单独管理,一个给定的端口只能被加入一个列表。

  有两个服务用来处理一个列表。

  RECEIVE_MESSAGE_FROM_QUEUING_PORT_LIST 服务从列表中含有有效消息的第一个端口返回一条消息。

  RECEIVE_QUEUING_MESSAGE,服务将返回消息从端口队列中移除。

  WAIT_FOR_MESSAGE_FROM_QUEUING_PORT_LIST 服务并不返回一个消息,而只是返回列表中第一个包含有效消息端口的标识。RECEIVE_QUEUING_MESSAGE 服务必须用于实际的接收消息。

  对于一个给定的列表,对于上述两种服务,无论那个第一个被请求,操作系统进程都启动端口列表中的第一个端口。依据 RESET_LIST 参数值,持续请求处理两个服务中的一个返回的最后的端口或从RESET 开始处理端口列表。当列表到达到最后,继续处理列表中的第一个端口。这保证了所有包含有效数据的端口都能被处理并且行为是确定的。

  可以通过 SET_PORT_ACTION_IN_QUEUING_PORT_LIST 服务可以确认列表中的一个端口是激活的还是未激活的。 一个激活的端口将被 RECEIVE_MESSAGE_FROM_QUEUING_PORT_LIST 或者WAIT_FOR_MESSAGE_FROM_QUEUING_PORT_LIST 服务监控和处理。一个没有被加入到列表中的未激活的端口不会被任何服务处理。这种能力对基于模式或者基于会话的通信,冗余,失败非常有用。这仅适用于端口列表服务,对标准 ARINC 653 中定义的队列端口服务不影响。

  4.3.11.3 列表配置

  此服务不包含标准中定义的配置数据。

  4.3.12 多核处理扩展

  支持多核处理器的额外能力被提供,每个进程被配置和初始化为可以在任何一个内核处理器上运行,此外,如果配置表授权的话,一个进程的密切关系可以在正常模式中被改变。

  当每一个进程和一个确定的内核处理器有密切关系。对于一个内核处理器,一个固定的进程集按优先级顺序执行,在这种配置下,一个就绪进程在处理器上执行直到完成或者有更高优先级的进程进入就绪。

  当一个进程可以运行在任何一个内核处理器上,那么对于一个内核处理器来说,可以运行的进程数就不是一个固定的集合。

  当进程可以运行在任何处理器上,那么处理器将严格选择 N 个优先级最高的就绪进程(N 是分配给分区的处理器数),一个进程将持续执行直到它完成或者他不再属于N 个最高优先级的就绪进程的集合。

  当一些进程被配置为只和某个具体的处理器亲密关系,而其他的进程和任何处理器都由亲密关系,那么在内核调度进程是,进程的优先级和与内核的亲密关系都应考虑在内。

  一些一个分区被分配两个内核的例子。

  进程 A 以 130 的优先级运行在内核处理器 0 上(可以运行在任何内核处理器上),进程 B 以 120 的优先级运行在内核处理器 1 上,进程 C 以 125 的优先级进入就绪(只可以运行在内核处理器 0 上),此时进程 A 和进程 C 成为优先级最高的两个进程,进程 C 被调度到内核 0 上运行,而进程 A 则转变的内核 1 上运行。

  5 服务请求

  5.1 服务请求分类

  5.1.1 服务请求类别

  本章详细描述了第 4 章里的功能的服务请求,这些请求主要分为以下几类:

  a) 文件系统

  b) 采样端口数据结构

  c) 多模块调度表

  d) 日志记录本系统

  e) 采样端口扩展

  f) 服务访问点

  g) 命名服务

  h) 内存块

  i) 健康监控扩展

  j) 队列端口列表服务

  k) 多核处理扩展

  5.1.2 返回值数据类型

  扩展服务的返回值类型与 GJB 5357-2005 中的定义相同,出了下面定义的内容。请查阅其他文件以获取详细信息。

  NOT_AVAILABLE 请求不能够被执行

  5.2 文件系统

  5.2.1 概述

  本部分详细说明与 ARINC653 文件系统相关的类型、文件名定义规则以及服务请求, 在这部分中,描述文件系统时使用的术语包括:

  SIZE 是从文件开始到所写的最后一个数据的字节数(如,End_Of_File 的位置)。

  LENGTH 是读/写操作的字节数。

  POSITION 是当文件被打开进行读/写操作时的位置离文件起始位置的字节数,对于每一个打开的文件标识 Position 是唯一的。

  5.2.2 文件系统类型

  本节定义文件系统服务的通用类型。

  类型 FILE_ID_TYPE 和 DIRECTORY_ID_TYPE 用于定义打开文件和目录的标识符,打开文件和目录的标识符在文件关闭或分区重启动之前一直有效。当标识符所代表的文件或目录不存在(例如:文件被删除或重命名)时该标识符将变得不可用。只有关闭文件服务可以使用一个不可用标识符。

  类型 FILE_STATUS_TYPE 作为一个数据结构,用于描述一个文件和一个具体的与 FILE_ID_TYPE相关的该文件的打开实例。FILE_STATUS_TYPE 中描述的属性多为文件自身的属性,并在伪代码中作为文件的 ATTRIBUTE 引用。POSITION 属性只与一个打开实例相关,但是在伪代码中被作为文件的POSITION 引用。

  类型 FILE_MODE_TYPE 为(READ ,READ_WRITE);

  类型 MESSAGE_ADDR_TYPE 为由起始地址开始的一个连续的数据区(参考

  GJB 5357-2005);

  类型 MESSAGE_SIZE_TYPE 为一个数字类型;--字节数

  类型 FILE_ERRNO_TYPE 为一个数字类型;

  类型 FILE_NAME_TYPE 为一个字符串类型;

  类型 FILE_ID_TYPE 为一个数字类型;

  类型 DIRECTORY_ID_TYPE 为一个数字类型;

  类型 FILE_SIZE_TYPE 为一个数字类型;--实现相关

  类型 FILE_SEEK_TYPE 为(SEEK_SET ,SEEK_CUR ,SEEK_END);

  类型 ENTRY_KIND_TYPE 为(FILE_ENTRY,

  DIRECTORY_ENTRY,

  OTHER_ENTRY,

  END_OF_DIRECTORY);类型 TIME_SET_TYPE 为(UNSET,SET);

  类型 MEDIA_TYPE 为(VOLATILE ,NONVOLATILE ,REMOTE);

  类型 COMPOSITE_TIME_TYPE 为结构

  TM_SEC 数字类型; -- 秒[0,59]

  TM_MIN 数字类型; -- 分[0,59]

  TM_HOUR 数字类型; -- 时[0,23]

  TM_MDAY 数字类型; -- 日[ 1,31]

  TM_MON 数字类型; -- 月[0, 11]

  TM_YEAR 数字类型; -- 年从 1900 开始

  TM_WDAY 数字类型; -- 星期从星期日开始[0,6]

  TM_YDAY 数字类型; -- 一年中的天数从 1 月 1 日开始[0,365]

  TM_ISDST 数字类型; -- 时间节约标识

  TM_IS_SET TIME_SET_TYPE; -- 时间已被设置标志结构结束;

  类型 FILE_STATUS_TYPE 为结构

  CREATION_TIME :COMPOSITE_TIME_TYPE;

  LAST_UPDATE :COMPOSITE_TIME_TIME;

  POSITION :FILE_SIZE_TYPE; -- 局部于一个文件标识

  SIZE :FILE_SIZE_TYPE; -- 对所有 id 均可见

  NB_OF_CHANGES 数字类型; --对所有 id 均可见

  NB_OF_WRITE_ERRORS 数字类型; --对所有 id 均可见

  结构结束;

  类型 VOLUME_STATUS_TYPE 为结构

  ACCESS_RIGHTS:FILE_MODE_TYPE; -- 配置中定义的访问权限

  MEDIA :MEDIA_TYPE; -- 配置中定义的介质类型

  结构结束;

  块是文件系统分配的单元。块大小与实现相关,不由应用开发者直接管理。

  注:文件(除了元数据)使用的块数一般定义为:(文件大小+(BLOCK_SIZE – 1)) / BLOCK_SIZE

  5.2.3 文件系统命名规定

  ARINC653 文件系统命名约定包括对商用(例如:POSIX ,Windows)规定的考虑。ARINC653 文件系统命名约定包括卷、目录和文件名。

  卷、目录和文件名应遵照以下规定:

  由“a -z ,A-Z,0-9”(字母和数字),‘_ ’(下划线),‘—’(破折号),和‘.’(点)组成。由数字和字母和下划线开始

  大小写无关

  1~63 个字符长度(不包括分割符)

  Volume(卷)是对存储设备(如:RAM 磁盘,FLASH)的一个分配及/或一部分的访问允许。卷名是对应于物理存储设备(如磁盘或目录)入口点的虚拟表示。对于不同的安装, 卷名可保持不变而相应的物理设备可各不相同。

  卷名应同时遵守以下规定:

  可使用冒号“:”作为最后一个字符,如果包含,冒号作为卷名的一部分。

  在每个卷下,可以创建文件和目录。目录是集一组文件或其他子目录一起的集合。使用目录允许相同的文件名存在于不同的目录下。目录是层次结构的,一个目录可包含其他子目录。

  文件是文件系统的存储单元。每个文件包括元数据(文件名, 文件大小等)和数据。数据对用户来说以连续的数据字节块表示。在物理存储设备上,数据可以是连续的也可以是不连续的。

  当在文件系统服务中使用名字时,应使用全名字(例如:全部描述)。

  全目录名由以下连接构成:

  卷名由一个可选的初始分割符‘/’或‘\’开始。

  路径名前缀由一组目录名组成(0 到 29 级),每个目录名由一个‘/’或‘\’分割符开始。

  可选的目录名可由一个‘/’或‘\’分割符开始。

  可选的‘/’或‘\’分割符作结束。

  空字符(用于标记名字的结束)。

  全文件名由以下连接构成:

  卷名由一个可选的初始分割符‘/’或‘\’开始。

  路径名前缀由一组目录名组成(0 到 30 级),每个目录名由一个‘/’或‘\’分割符开始。

  文件名由一个‘/’或‘\’分割符开始。

  空字符(用于标记名字的结束)。

  全名不能超过 511 个字符(不包括空字符)

  例如:

  /usr/data_bases/airports/LAX.dat (POSIX 格式)

  usr/data_bases/airports/LAX.dat (同上)

  usr :/data_bases/airports/LAX.dat (不同的卷)

  C:\DataBases\Aiports\LAX.dat (Windows 格式)

  Ram._Disk:\Airports.US-A/LAX.dat.10 (ARINC653 允许的格式)

  A:\LAXdat (卷级的文件)

  /usr/data-bases/10Sep_2005/ (目录名)

  usr/data-bases/10Sep_2005 (同上)

  D : (不带分割符的卷名)

  5.2.4 文件系统访问权限

  访问权限在一个分区内的卷级别被应用。对于不同的分区, 对卷的访问权限不同。分配给卷的访问权限将应用到所有卷上的文件和目录。缺省情况下, 对于任何 ARINC653 分区,卷是不可访问(只读或读写访问)。这些访问权限可以在配置表中明确的定义。对一个卷具有读写访问权限的分区可以以任何访问模式打开文件。

  对于访问控制,配置表将包括:

  唯一的 ARNINC653 分区表识,如果存在,包括对每个卷的读写访问权限。

  唯一的 ARNINC653 分区表识,如果存在,包括对每个卷的只读访问权限。

  对卷的配额(独占的存储设备空间)分配。对特殊的卷,文件的存储消费将被限制到最大限定值。

  目录文件 的内容(如果访问权 限允许)可以通过 OPEN_DIRECTORY 打开 目录并使用READ_DIRECTORY 读取。读目录提供下一个目录入口(就象 POSIX 的 readdir()函数),也就是下一个文件或子目录的名字。目录内容的顺序与实现有关。

  5.2.5 文件系统错误码

  文件系统提供两类错误:通用瞬间类(ARINC653 返回码)和详细的锁定类(错误号 ERRNO)

  出错时,设置服务的返回码(RETURN_CODE),同时设置服务的错误码(ERRNO)来标识错误的种类。没有错误时,服务的返回码相应的设置为 NO_ERROR,但是服务的文件错误码保持不变。

  ERRNO 是一个锁定的错误码,也就是,如果随后的服务成功它将保持不变,但是如果随后的服务出错(返回码不是 NO_ERROR)并是一个新的错误时,ERRNO 将被新的错误值代替。ERRNO 的锁定特点可以用于一口气测试文件系统的一系列请求的执行是否有错误。

  每个 ERRNO 参数由应用初始化为零,并可以由应用在测试完成后自由的复位为零。ERRNO 参数不会被 ARINC653 文件系统的任何服务清除。

  由于 ERRNO 可以由应用设置,也可以由文件管理服务设置,所以 ERRNO 是一个“输入输出”参数。如果返回码为没有错误,服务返回的 ERRNO“输出”值就是用户给定的“输入值”。否则“输出”值由服务设置。

  例如:

  Procedure CLOSE_ALL (F1, F2, F3, F4, F5: FILE_ID_TYPE) is RC : RETURN_CODE TYPE ;

  EN : FILE_ERRNO_TYPE ;

  begin

  EN := 0;

  CLOSE_FILE (F1, RC, EN);

  CLOSE_FILE (F2, RC, EN);

  CLOSE_FILE (F3, RC, EN);

  CLOSE_FILE (F4, RC, EN);

  CLOSE_FILE (F5, RC, EN);

  if EN = 0 then -- all is ok

  else

  -- at least one file is not correctly closed

  end if;

  end CLOSE_ALL ;

  可分配给 ERRNO 的错误码如表 9 所示。

  表 9 分配给 ERRNO 的错误码

  5.2.6 文件系统服务

  5.2.6.1 概述

  文件系统服务包括:

  a) OPEN_NEW_FILE

  b) OPEN_FILE

  c) CLOSE_FILE

  d) READ_FILE

  e) WRITE_FILE

  f) SEEK_FILE

  g) REMOVE_FILE

  h) RENAME_FILE

  i) GET_FILE_STATUS

  j) GET_VOLUME_STATUS

  k) RESIZE_FILE

  l) SYNC_FILE

  m) OPEN_DIRECTORY

  n) CLOSE_DIRECTORY

  o) READ_DIRECTORY

  p) REWIND_DIRECTORY

  q) MAKE_DIRECTORY

  r) REMOVE_DIRECTORY

  5.2.6.2 OPEN_NEW_FILE 服务

  OPEN_NEW_FILE 服务请求创建并打开由全文件名指定的文件,并为新文件提供用于后续读写的文件描述符。为了创建文件,该分区必须具有对所请求的文件卷的写许可。

  通过该服务创建的文件不能是已经存在的文件。

  当有复合时间资源且文件的源数据支持创建时间,文件的创建时间设置为当前的复合时间值。当没有可用的复合时间资源或不支持创建时间时,创建时间的 TM_IS_SET 域设为 UNSET,表示该文件的创建时间不可获得或不支持。

  注:本服务相当于 POSIX 的 creat ()函数。

  函数 OPEN_NEW_FILE

  (FILE_NAME :输入参数 FILE_NAME_TYPE;

  FILE_ID :输出参数 FILE_ID_TYPE;

  RETURN_CODE :输出参数 RETURN_CODE_TYPE;

  ERRNO :输入输出参数 out FILE_ERRNO_TYPE)

  错误

  when(达到当前分区的最大打开文件/目录数时)

  RETURN_CODE := INVALID_CONFIG;

  ERRNO := EMFILE; -- POSIX

  when(文件名或其组成之一超过最大字符长度)

  RETURN_CODE := INVALID_PARAM;

  ERRNO := ENAMETOOLONG; -- POSIX when (FILE_NAME 不是有效的名字)

  RETURN_CODE := INVALID_PARAM; ERRNO := EINVAL; when(如果 FILE_NAME 中的路径前缀不是一个目录)

  RETURN_CODE := INVALID_PARAM;ERRNO := ENOTDIR; -- POSIX when(如果分区对于要访问的 FILE_NAME 所在的卷没有读-写访问权限) RETURN_CODE := INVALID_CONFIG; ERRNO := EACCES; -- POSIX

  when(如果包含 FILE_NAME 的存储设备当前处于写保护状态)

  RETURN_CODE := INVALID_PARAM; ERRNO := EROFS; -- POSIX when(如果 FILE_NAME 是一个已存在的文件)

  RETURN_CODE := INVALID_PARAM; ERRNO := EEXIST; when(如果 FILE_NAME 是一个已存在的目录)

  RETURN_CODE := INVALID_PARAM; ERRNO := EISDIR; -- POSIX when(如果卷上没有足够的空间可使用)

  RETURN_CODE := INVALID_CONFIG; ERRNO := ENOSPC; -- POSIX when(如果包含 FILE_NAME 的存储设备报告故障)

  RETURN_CODE := NOT_AVAILABLE; ERRNO := EIO; when(如果当前禁止调度或当前进程是错误处理进程)

  RETURN_CODE := INVALID_MODE; ERRNO := EACCES;

  正常

  创建并打开 FILE_NAME 文件;

  设置该文件的访问权限为 read/write;

  请求进程调度—进程调度的需要与实现有关;

  为当前进程提供 FILE_NAME 文件的文件 FILE_ID;

  设置文件的大小 SIZE := 0

  设置文件的位置 POSITION := 0;

  设置文件的写错误数 NB_OF_WRITE_ERRORS := 0;

  设置文件的修改数 NB_OF_CHANGES := 0;

  if(文件的元数据支持创建时间)then

  if(复合时间源可用)then

  文件的 CREATION_TIME := 当前复合时间;

  文件的 CREATION_TIME.TM_IS_SET := SET; else

  --需要的时间不可用

  文件的 CREATION_TIME.TM_IS_SET := UNSET; end if;

  end if;

  if(文件的元数据支持最近修改时间)then

  if(复合时间可用) then

  文件的 LAST_UPDATE := 当前复合时间;

  文件的 LAST_UPDATE.TM_IS_SET := SET; else

  -- 需要的时间不可用

  文件的 LAST_UPDATE.TM_IS_SET := UNSET; end if;

  end if;

  RETURN_CODE := NO_ERROR; end OPEN_NEW_FILE;

  OPEN_NEW_FILE 服务返回码:

  5.2.6.3 OPEN_FILE 服务

  打开新文件 OPEN_FILE 服务请求打开由全路径名指定的文件,并为该文件提供用于后续读写的文件描述符。

  通过本服务打开的文件必须已经存在。文件的位置指示初始设置为文件的开始。同一时刻只能有一个用于文件写访问的打开实例。

  注:本服务相当于 POSIX 的 open()函数。文件访问权限预先在配置数据中定义。

  函数 OPEN_FILE

  (FILE_NAME :输入参数 FILE_NAME_TYPE;

  FILE_MODE :输入参数 FILE_MODE_TYPE;

  FILE_ID :输出参数 FILE_ID_TYPE;

  RETURN_CODE :输出参数 RETURN_CODE_TYPE;

  ERRNO :输入输出参数 FILE_ERRNO_TYPE)

  错误

  when(达到当前分区的最大打开文件/目录数)

  RETURN_CODE := INVALID_CONFIG; ERRNO := EMFILE; -- POSIX when(文件名或其组成之一超过最大字符长度)

  RETURN_CODE := INVALID_PARAM; ERRNO := ENAMETOOLONG;

  -- POSIX

  when (FILE_NAME 不是有效的名字时)

  RETURN_CODE := INVALID_PARAM; ERRNO := EINVAL; when (FILE_NAME 串中的路径前缀不是一个目录时)

  RETURN_CODE := INVALID_PARAM; ERRNO := ENOTDIR; -- POSIX when(前 FILE_MODE 表示的不是一个存在的访问模式)

  RETURN_CODE := INVALID_PARAM; ERRNO := EINVAL; when(文件名 FILE_NAME 是一个已存在的目录)

  RETURN_CODE := INVALID_PARAM; ERRNO := EISDIR; -- POSIX when(文件名 FILE_NAME 不是一个已存在的文件)

  RETURN_CODE := INVALID_PARAM; ERRNO := ENOENT; -- POSIX

  when (FILE_NAME 是一个当前存在的并以写保护方式打开的文件,同时要求的 FILE_MODE 是读-写

  RETURN_CODE := INVALID_PARAM; ERRNO := EACCES;

  when(对于包含 FILE_NAME 文件的卷,当前分区没有 FILE_MODE 所表示的

  文件访问权限

  RETURN_CODE := INVALID_PARAM; ERRNO := EACCES; -- POSIX when(包含 FILE_NAME 的存储设备当前处于写保护状态)

  RETURN_CODE := INVALID_PARAM; ERRNO := EROFS; -- POSIX when(包含 FILE_NAME 的存储设备报告故障)

  RETURN_CODE := NOT_AVAILABLE; ERRNO := EIO; when(当前禁止调度或当前进程是错误处理进程)

  RETURN_CODE := INVALID_MODE; ERRNO := EACCES;

  正常

  打开文件 FILE_NAME;

  请求进程调度;

  -- 是否进程调度与实现有关

  设置该文件的访问模式为 FILE_MODE;

  if (文件未打开)then

  文件的 NB_OF_CHANGES := 0;

  文件的 NB_OF_WRITE_ERRORS := 0; end if;

  向当前进程提供 FILE_NAME 文件的文件标识;

  文件的 POSITION := 0;

  RETURN_CODE := NO_ERROR;

  end OPEN_FILE;

  OPEN_FILE 服务返回码:

  5.2.6.4 CLOSE_FILE 服务

  关闭文件服务 CLOSE_FILE 表示读/写行为的结束。相关的文件 ID 被回收。注:该服务对应于 POSIX 的 close()函数。

  函数 CLOSE_FILE

  (FILE_ID :输入参数 FILE_ID_TYPE;

  RETURN_CODE :输出参数 RETURN_CODE_TYPE;

  ERRNO :输入输出参数 FILE_ERRNO_TYPE)

  错误

  when (FILE_ID 不是任何一个当前分区的已打开的文件 ID)

  RETURN_CODE := INVALID_PARAM; ERRNO := EBADF; -- POSIX when (FILE_ID 的文件正在操作中)

  RETURN_CODE := NOT_AVAILABLE; ERRNO := EBUSY; when(包含 FILE_ID 的存储设备报告故障)

  RETURN_CODE := NOT_AVAILABLE; ERRNO := EIO; when(当前禁止调度或当前进程是错误处理进程)

  RETURN_CODE := INVALID_MODE; ERRNO := EACCES;正常

  if(文件的打开模式是读-写)then

  完成 FILE_ID 的数据和元数据的传输请求进程调度

  --是否执行进程调度与实现有关end if;

  关闭 FILE_ID 文件;

  --例如,不再用 FILE_ID 访问文件;

  RETURN_CODE := NO_ERROR; end CLOSE_FILE;

  CLOSE_FILE 服务返回码:

  5.2.6.5 READ_FILE 服务

  读文件 READ_FILE 服务请求从指定的文件的位置指示器开始的地方,读取给定字节的消息。返回

  实际读取的字节数,这可能与要读取的字节数不符(当遇到文件结束标志 End_Of_File 时)。在文件结束End_Of_File 之后不存在要传输的数据。如果起始位置在 End_Of_File 之后,读取的字节数为零。位置指示器根据所读取的字节数向前移动。

  函数 READ_FILE

  (FILE_ID :输入参数 FILE_ID_TYPE;

  MESSAGE_ADDR :输入参数 MESSAGE_ADDR_TYPE; -- 传入的消息地址,用于存放传出的消息。

  IN_LENGTH :输入参数 MESSAGE_SIZE_TYPE; -- 要读的最大字节数

  OUT_LENGTH :输出参数 MESSAGE_SIZE_TYPE; -- 实际读到的字节数

  RETURN_CODE :输出参数 RETURN_CODE_TYPE;

  ERRNO :输入输出参数 FILE_ERRNO_TYPE)

  错误

  when (FILE_ID 不是任何一个当前分区的已打开的文件 ID)

  RETURN_CODE := INVALID_PARAM; ERRNO := EBADF; -- POSIX when (FILE_ID 的文件正在操作中)

  RETURN_CODE := NOT_AVAILABLE; ERRNO := EBUSY; when (FILE_ID 由于文件所有者的动作不再有效)

  RETURN_CODE := NOT_AVAILABLE; ERRNO := ESTALE; when(输入的长度 IN_LENGTH 是零或者负数)

  RETURN_CODE := INVALID_PARAM; ERRNO := EINVAL; when(输入的长度 IN_LENGTH 大于最大的原子数)

  RETURN_CODE := INVALID_PARAM; ERRNO := EFBIG; when(包含 FILE_ID 的存储设备报告故障)

  RETURN_CODE := NOT_AVAILABLE; ERRNO := EIO; when(文件的位置大于文件的大小)

  RETURN_CODE := NOT_AVAILABLE; ERRNO := EOVERFLOW; when(当前禁止调度或当前进程是错误处理进程)

  RETURN_CODE := INVALID_MODE; ERRNO := EACCES;

  正常

  if(文件 POSITION + IN_LENGTH > 文件 SIZE)then

  OUT_LENGTH := 文件的 SIZE – 文件的 POSITION; else

  OUT_LENGTH := IN_LENGTH; end if;

  初始化并将 OUT_LENGTH 长度的数据由 FILE_ID 描述的位置拷贝到

  MESSAGE_ADDR 所指的存储单元内;

  请求进程调度

  -- 是否执行进程调度与实现有关

  if(产生 I/O 错)then

  OUT_LENGTH := 0;

  RETURN_CODE := NOT_AVAILABLE; ERRNO := EIO; -- POSIX else

  文件 POSITION := 文件 POSITION + OUT_LENGTH;

  RETURN_CODE := NO_ERROR;

  end if;

  end READ_FILE;

  READ_FILE 服务返回码:

  5.2.6.6 WRITE_FILE 服务

  WRITE_FILE 服务请求写指定字节数的消息到指定文件的位置指示器所确定的位置。在写操作完成之后,文件的位置指示器向前移动所写的字节数目。如果位置指示器的增加超过了文件的大小, 文件的大小被设置为该文件指示器的值。当复合时间源可用并且文件的元数据支持最后一次更新时间,那么文件的更新时间被设置为当前的复合时间源。当没有复合时间源可用的情况下,更新时间的域 TM_IS_SET被标记为 UNSET 以说明该文件的更新时间不可用。

  函数 WRITE_FILE

  (FILE_ID :输入参数 FILE_ID_TYPE;

  MESSAGE_ADDR :输入参数 MESSAGE_ADDR_TYPE;

  LENGTH :输入参数 MESSAGE_SIZE_TYPE;

  RETURN_CODE :输出参数 RETURN_CODE_TYPE;

  ERRNO :输入输出参数 FILE_ERRNO_TYPE)

  错误:

  when (FILE_ID 不是当前分区内的一个打开文件)

  RETURN_CODE := INVALID_PARAM;ERRNO := EBADF; -- POSIX when (FILE_ID 有一个进程在操作)

  RETURN_CODE := NOT_AVAILABLE;ERRNO := EBUSY; when (FILE_ID 不是以读写模式打开)

  RETURN_CODE := INVALID_PARAM;ERRNO := EACCES; when (LENGTH 为 0 或负值)

  RETURN_CODE := INVALID_PARAM;ERRNO := EINVAL; when(写 LENGTH 字节的空间要求对于该卷不可使用)

  RETURN_CODE := INVALID_PARAM;ERRNO := ENOSPC; -- POSIX when (LENGTH 大于最大原子数)

  RETURN_CODE := INVALID_PARAM;ERRNO := EFBIG; when(包含 FILE_ID 的存储设备报告故障)

  RETURN_CODE := NOT_AVAILABLE;ERRNO := EIO; when(抢占被禁止或当前的进程是错误处理进程)

  RETURN_CODE := INVALID_MODE;ERRNO := EACCES;

  正常:

  初始化 FILE_ID 所描述的文件,并且将长度为 LENGTH 的字节数据写到文件位置POSITION 偏移 MESSAGE_ADDR 开始的位置;

  请求进程调度;

  --是否进程调度与实现有关;

  if(产生 I/O 错)the

下载地址
高清可复制 HB 8572-2020 民用飞机航空电子应用软件接口扩展要求资源截图