系统学习AutoSAR ETAS RTA-OS嵌入式操作系统(二)开发过程 Development Process

系统学习AutoSAR ETAS RTA-OS嵌入式操作系统(二)开发过程 Development Process

3. Development Process

本章提供了如何在应用程序中使用RTA-OS的简要概述。

该过程包括以下步骤:

  1. 配置您想要使用的操作系统功能
  2. 生成定制的RTA-OS内核库
  3. 编写使用操作系统的应用程序代码
  4. 将您的应用程序代码编译并链接到RTA-OS库
  5. 在目标上运行您的应用程序。

下面各节将介绍这些步骤:

3.1 Configuration配置

RTA-OS是静态配置的,这意味着在配置时必须声明所需的每个任务和中断,以及任何关键部分、同步点、计数器等。

所有配置都保存在符合AUTOSAR标准的XML文件中。XML并不特别容易阅读,因此建议使用工具来进行操作。RTA-OS包括rtaoscfg,一个用于配置RTA-OS应用程序的图形化配置编辑器。rtaoscfg接受任何AUTOSAR XML文件作为输入,并允许您编辑配置的操作系统特定部分。如果输入文件同时包含操作系统和非操作系统特定的配置,则只会修改操作系统配置部分。

集成指南3.1:由于XML解析器的特性,当使用不同工具进行编辑时,配置对象在文件中的顺序可能无法保留。

rtaoscfg有五个主要的区域窗格,如图3.1所示:

  1. 菜单/工具栏。
  2. 项目导航器。查看配置中的顶级对象概述,切换配置工作区并管理项目中的文件。
  3. 配置工作区。这是您进行大部分配置的地方。RTA-OS提供以下工作区:
    1. 操作系统配置
    2. RTA-TRACE配置
    3. 构建器
    4. 项目文件
  4. 错误查看器。显示当前加载的配置中的错误列表。
  5. 状态栏。

在这里插入图片描述

3.1.1 OS Configuration

操作系统配置导航器在左侧窗口中显示您的操作系统配置的逻辑结构,按OS对象分组。您可以展开每个对象以查看您创建的实例。单击对象的实例会在右侧窗口中显示配置面板。工作区上方向导航器右侧对项目进行配置。

要创建新的配置,请从菜单中选择“文件”>“新建项目”,或使用键盘快捷键。每个新配置都需要指定AUTOSAR XML配置的管理部分。这是必需的,因为OS配置的某些部分需要引用其他部分(例如,任务需要引用它们使用哪些资源),而这些引用形成了到AUTOSAR XML 配置项绝对路径。所需项包括:

AR-PACKAGE Name定义了AUTOSAR包的名称。所有AUTOSAR配置项都存在于一个AR-PACKAGE中,系统可以包含多个包。单个ECU的操作系统配置必须存在于一个单独的包中 - 不可能将操作系统配置拆分到多个包中。

ECU Configuration Name定义了该OS配置所属的ECU-CONFIGURATION的名称。一个ECU-CONFIGURATION包含了一个ECU的所有基本软件的配置元素。OS Configuration

OS Configuration Name定义了操作系统配置的名称。这是用来引用该操作系统时使用的名称。

Release 定义了应使用哪个版本的AUTOSAR OS变体。由于不同AUTOSAR版本之间存在一些差异,可能需要设置以符合其他配置文件要求。

在这里插入图片描述

图3.2显示了一个新项目的默认设置,并且展示了如何根据特定项目进行自定义,本例中是针对车辆平台“PlatformX”的EC“EngineManagementECU”。

**集成指南3.2:**除了AUTOSAR版本外,项目设置可以在以后通过选择项目属性进行修改。

点击项目导航器中的“Tasks”、“ISRs”、“Resources”等“根”对象,将带您进入该类型对象的配置工作区。点击单个对象将带您进入所选对象的配置工作区。图3.3显示了一个选择

操作系统配置分为三个主要部分:

  1. 系统范围的配置,用于目标中立的通用设置,例如您想要记录的调试信息级别、是否在运行时监视堆栈、您将使用哪些钩子(回调)等。
  2. 目标特定的设置,包括:
    • 您正在使用的目标设备。您可以使用 rtaoscfg 来配置任何已安装有许可RTA-OS端口的目标设备
    • 如果端口支持多个目标变体,则是目标设备的变体
    • 如果安装了多个特定RTA-OS端口版本,则是要使用的目标版本
    • “特定于目标”的配置方面
  3. 每个想要使用的操作系统对象都需要进行对象配置。这包括任务、中断、资源、事件、报警器、计数器和调度表。

这个用户指南的后面章节会涵盖配置的具体方面。

在这里插入图片描述

3.1.2 RTA-TRACE Configuration

RTA-TRACE配置视图(如图3.4所示)允许您配置RTA-OS以支持ETAS的RTA-TRACE运行时分析和监控工具。与操作系统配置视图类似,项目导航器中显示了RTA-TRACE配置的概述,并在工作区显示了配置窗口。您可以展开每个对象以查看已创建的实例。单击对象实例会在右侧窗口中显示配置面板。

通过配置RTA-TRACE参数,可以告诉RTA-OS包含所有必要的操作系统仪器化内容,以便让RTA-TRACE收集应用程序的运行时数据。如果没有安装RTA-TRACE来查看跟踪数据,则进行RTA-TRACE仪器化不会造成任何损害,但这将使得您的RTA-OS配置变得更大且速度较慢。

在这里插入图片描述

3.1.3 Build

RTA-OS库是使用命令行工具rtaosgen构建的。如果您喜欢在同一工具中进行配置和构建,则可以从图3.5所示的构建工作区进行操作。该构建器允许您配置构建过程并从rtaoscfg内部运行rtaos-gen

rtaoscfg将生成发送给rtaosgen的命令行。当您在Builder Setup中选择选项时,命令行将更新以反映您的更改。您可以通过在窗口中键入来添加自动生成的命令行内容。例如,您可以添加–env选项来指定编译器路径。添加的内容会保存在.rtaos文件中,在关闭程序后依然存在。这样做的一个副作用是,如果您在一台机器上打开项目,则之前保存的–output选项可能被解释为用户添加的选项,这意味着rtaoscfg不会删除它,并且会添加一个新冲突的自动生成–output选项。要解决此问题,请从“Command-line equivalent”窗口中删除旧版本即可。

“rtasogen”的详细信息请参见第3.3节

在这里插入图片描述

3.1.4 Project Files

按照惯例,rtaoscfg将工作配置称为项目。一个项目只是定义操作系统配置的一个或多个XML文件。默认项目包含一个单一的AUTOSAR XML文件。

AUTOSAR XML语言允许您根据构建和/或版本控制过程的要求将操作系统配置分割成多个文件。如果您正在使用其他生成操作系统配置片段并需要集成到主配置中的工具,这一点至关重要。如果您希望维护核心配置,并针对不同目标硬件进行多个定制,则这也非常有用。

项目查看器允许您管理这些复杂的项目。您可以轻松地添加/删除XML文件到/从项目中。当您使用多文件XML项目时,rtaoscfg会内部合并所有配置数据,使您能够同时处理多个配置文件,就像它们是一个单一的操作系统配置一样。这样,即使配置数据在物理上分离,您也可以看到整个模型并检查其一致性。

当保存项目时,rtaosgen会记住哪些部分的配置来自哪个XML文件,以便在保存配置时将每个元素的配置数据写回正确的文件中。

RTA-OS还会生成一个项目文件(扩展名为.rtaos)。项目文件是一种特殊的RTA-OS文件,列出了您项目中所有的AUTOSAR XML文件。图3.6展示了基本概念。每个XML文件都可以从“项目文件”工作区的上下文菜单中单独保存(即不需要保存整个项目)。

在这里插入图片描述

可移植性注释3.1:项目文件仅适用于RTA-OS。

The Working File

当您在配置中创建一个新的操作系统对象(例如任务)或属性(例如任务的优先级)时,rtaoscfg会将其写入工作文件。项目查看器会显示当前的工作文件,并允许您将工作文件切换为项目中的任何一个。

如果您创建了一个对象或属性,并意识到它被添加到了错误的文件中,那么您可以通过从当前的工作文件中删除它,切换到新的工作文件,然后重新创建该对象或属性来将其移动到项目中的另一个文件。

如果您在OS配置中使用多个XML文件片段,则每次想要进行修改时逐个文件可能会很繁琐。rtaosgen允许您直接打开项目本身。这样就会自动加载由项目文件引用的每个XML文件。

可以从主菜单(文件保存工作文件)快速保存当前正在使用的XML文件(无需保存项目)。

3.1.5 Error Checking

当您添加或删除配置项时,rtaoscfg会在错误查看器中报告配置错误。报告了三种类型的错误:

Information 信息包含有关配置的摘要信息,例如您已经配置了多少个对象。

Warnings 警告提示您的配置可能不会按预期运行,因为您可能在配置中缺少某些内容。

Errors 错误提示您的部分配置是不正确的。

您可以通过点击“立即检查”按钮来检查配置是否一致。找到的任何错误都将在错误窗口中报告。图3.7显示了如何报告错误。

在这里插入图片描述

Unresolved References

当的对象引用了另一个未在同一项目中声明的对象时,rtaoscfg会报告未解决的引用错误。未解决引用的示例包括:

  • 引用未声明资源的任务或ISR
  • 引用未声明事件的任务
  • 引用未声明任务或事件的闹钟或计划表
  • 引用未声明计数器的闹钟或计划表

通常情况下,引用可能无法解析是因为您正在编辑一个属于更大配置的单个XML文件,或者因为您正在从第三方来源导入XML。

未解决的引用将像正常情况下一样在错误窗口中报告为错误,如图3.8所示。

在这里插入图片描述

然而,当您尝试编辑导致未解决引用的对象时,rtaosgen将自动在名为MissingReferences.xml的XML文件中创建缺失的对象,并将该文件添加到项目中。图3.9显示了从TaskA引用的缺失StandardResource的创建过程。

在这里插入图片描述

您可以通过查看“项目文件”工作区中的MissingReferences.xml内容来查看已创建的缺失引用。图3.10显示了StandardResource已被创建。

集成指南3.3:如果缺失的引用在其他地方声明,并且在构建内核时将存在所引用的对象,那么您应该立即从项目中删除MissingReferences.xml,然后保存项目。

在这里插入图片描述

3.1.6 Generating Reports

您可以从菜单/工具栏生成有关配置的报告。报告提供了关于您的配置的摘要信息,可用于质量保证审计、部门间部沟通等。所提供的报告包括:

Configuration Summary 配置摘要 - 操作系统配置的概述。

OS API Reference 操作系统API参考 一个定制的参考指南,用于配置的操作系统。这可能包括针对特定目标功能的文档,例如额外的API调用和不属于标准参考指南的类型。

Options Reference 选项参考-目标和操作系统配置选项的概述。首先描述了目标选项(可以使用命令行设置–target_option)和操作系统选项(使用–os_option设置)。这两组选项也可以保存在AUTOSAR XML配置中。然后列出了可为活动目标变体配置的中断向量,最后显示支持该目标的每个芯片变体。

Stack Usage 堆栈使用情况 - 配置的操作系统的最坏情况下的堆栈使用量。这要求为每个任务和中断服务例程提供了堆栈分配。

IOC Summary IOC摘要 - 对操作系统配置中的IOC部分进行更详细的查看。

Os_BSWMD - 操作系统的BSW模块描述文件。

MISRA Deviations - 提供了配置的操作系统中MISRA-C 2012规范的偏差。其中包括适用的偏差,为何进行该偏差以及出现次数。MISRA偏差报告中报告的MISRA偏差被认为不会对开发造成风险,因为每个偏差都经过了审查和适当的测试。这意味着具有MISRARTA-OS库代码不需要采取任何减少开发风险的措施。然而,使用在RTA-OS头文件Os.h中RTA-OS API调用的用户代码应进行额外的MISRA检查以确保正确使用代码。导致Os.h中出现代码的MISRA偏差报告位置包括:Os_Safe_Cfg.h、OsMinusConfig.h、OsTrace.h、OsTargetTypes.h和 Os_Cfg.h.还应该检查包含操作中断硬件的目标特定头文件(如Os_ConfigInterrupts.h或 Os_DisableInterrupts .h) 的用户代码.

所有报都是以HTML格式生成的,并将在您的默认Web浏览器中显示。报告的生成实际上是由 rtaosgen 完成的,因此可以与构建过同时进行。

例如,您可能希望生成MISRADeviation报告以提供质量保证过程的证据。构建时生成报告还允许选择报的格式。通纯文本、XML和HTML格式的报告,但Os_BSWMD通常会被输出为ARXML。

图3.11显示了“配置摘要”报告中列出每个操作系统对象及其关联配置的摘录部分。

在这里插入图片描述

可以使用以下命令行获取可用于目标平台的完整报表列表:

rtaosgen --target:YourTarget --report:?

3.2 Assistants

rtaoscfg提供了助手插件,用于执行常用的活动。可以通过主菜单栏中的“Assistants”选项来访问它们。

  • Schedule Table Assistant用于轻松生成周期性的调度表。有关Schedule Table Assistant的更多详细信息,请参见第10.3节。
  • Example Application Generator用于生成、构建和加载每个目标端口提供的示例应用程序之一。
  • OIL Import Assistant用于将OSEK OIL文件(ISO 17356-6)转换为兼容AUTOSAR XML文件。

3.3 Library Generation

在您的应用程序中使用RTA-OS之前,您需要生成一个RTA-OS内核库和相关的头文件。rtaosgen通过以下方式生成一个定制化的、针对您操作系统配置进行优化的RTA-OS内核库:

  • 分析您的XML配置并自动优化RTA-OS内核,以仅包含您将使用的功能。这使得RTA-OS尽可能小而高效。
  • 根据目标插件提供的信息定制优化后的内核到您选择的目标上。
  • 使用与应用程序相同的第三方工具链构建内核库。这保证了RTA-OS和您自己代码之间的工具链兼容性。

该工具集成了核心操作系统内核,使您选择的可选内核功能与由端口插件提供的目标进行自定义。图3.12说明了基本过程,展示了为EDSAC目标生成内核的方式。

在这里插入图片描述

3.3.1 Preparing the Tool Chain

为了生成一个内核库,rtaosgen需要访问你的目标平台的编译器工具。rtaosgen知道如何运行编译器、汇编器和归档/图书馆管理程序以及使用哪些选项。你只需要关注两件事:

  1. 您的编译器工具链必须在您的PATH中可访问,或者您可以使用–env命令行选项。
  2. 您的编译器工具链必须与RTA-OS兼容。

您可以通过打开Windows命令提示符来查看编译器是否在PATH中。方法是点击开始菜单,选择运行,并输入cmd。

在命令提示符下键入C:>set将列出所有的Windows环境变量。您应该能够在路径上看到编译器的可执行目录。如果没有看到,则可以通过键入C:\> set PATH=<Path to your compiler executable>;PATH将编译器添加到路径中。

要检查是否使用兼容版本的编译工具链,请参考与您所用端口相关的目标/编译器指南,该指南会告知哪个版本(或多个版本)是兼容的。

3.3.2 Understanding AUTOSAR Dependencies

RTA-OS是一个AUTOSAR基本软件模块,因此它必须符合AUTOSAR基本软件模块构建概念。如果您已经了解这个工作原理,请直接跳到第3.3.4节。在AUTOSAR中,所有的基本软件模块都提供一个名为.h的单一包含文件。对于操作系统来说,这个文件是Os.h。每个头文件都依赖于其他AUTOSAR包含文件。AUTOSAR包含层次结构如图3.13所示。

在这里插入图片描述

Std_Types.h 为AUTOSAR提供了所有可移植(即目标硬件无关)的类型定义。Std_Types.h还包括另外两个AUTOSAR头文件:

  • Platform_Types.h 定义了用于目标硬件的AUTOSAR标准类型(uint8、uint16、boolean、float32等)。

  • Compiler.h 定义了一组宏,用于内部基本软件模块根据其可寻址的方式标记函数、数据和指针。

    • Compiler.h使用的内存和指针类由每个基本软件模块在名为Compiler_Cfg.h的文件中定义。AUTOSAR标准定义了一组最小名称,并且每个名称都以基本软件模块的名称作为前缀。对于操作系统来说,所有段名宏都以OS_开头。
    • 系统集成商必须合并所有基本软件模块的Compiler_Cfg.h文件,以创建一个“主”Compiler_Cfg.h,在编译系统之前。在RTA-OS中,操作系统模块的Compiler_Cfg为Os_Compiler_Cfg.h,并包含了RTA-OS使用的名称的完整列表。该文件可以轻松地#include到全局的Compiler_Cfg.h中。
    • 你应该特别注意RTA-OS部分中的OS_CALLOUT_CODE和OS_APPL_CODE。OS_CALLOUT_CODE用于引用导致操作系统调用你的代码的钩子和回调函数。可以使用指令FUNC(<typename>, OS_CALLOUT_CODE)将代码放置在这个部分中。例如,以下代码展示了如何将ErrorHook()放置在OS_CALLOUT:
    FUNC(void, OS_CALLOUT_CODE) ErrorHook(StatusType Error){
    /* Handle error */
    }
    
    • OS_APPL_CODE用于引用任务、中断服务程序和可信函数。对于和中断服务程序,这种映射。对于可信函数,您可以使用指令FUNC(<typename>, OS_APPL_CODE)将代码放置在此部分。

MemMap.h(或者从AUTOSAR版本4.1开始使用_MemMap.h)定义了数据和代码如何映射到内存段,并使用编译器的原语将代码和数据放置到不同类型的内中,根据以下过程:

  1. 每个基本软件模块使用宏在Compiler_Cfg.h中定义一系列的段名。

  2. 基本软件模块的供应商使用这些宏在实现过程中将代码放置在虚拟段中,例如:

    #define OS_START_SEC_CODE
    #include "MemMap.h"
    /* Some OS code here */
    #define OS_STOP_SEC_CODE
    #include "MemMap.h"
    
  3. 对于AUTOSAR版本4.0及更早版本,系统集成商开发一个MemMap.h文件,将基本软件的虚拟段名映射到系统范围内的段名,并从那里进一步映射到编译器对于段位置的原语。

    /* Map OS code into the section containing all BSW code */
    #ifdef OS_START_SEC_CODE
    #undef OS_START_SEC_CODE
    #define START_SECTION_BSW_CODE
    #endif
    ...
    /* Name the system section with a compiler primitive */
    #ifdef START_SECTION_BSW_CODE
    #pragma section code "bsw_code_section"
    #endif
    

    在RTA-OS中,可以指定用于Hooks、OsApplication Hooks、Tasks和ISRs的代码段名称。这是通过ARXML配置中的AUTOSAROSMemoryMappingCodeLocationRef元素完成的。这个功能在AUTOSAR 4.3.1中添加,但RTA-OS允许在任何AUTOSAR版本中使用它。在rtaoscfg文件中,OSMemoryMappingCodeLocationRef显示为’CodeLocation’。该条目应包含一个指向SwAddrMethod的AUTOSAR路径。RTA-OS使用路径的最后一部分来构建代码段名称。例如,如果将任务分配给代码位置/a/b/c/XYZ,则任务代码的声明将被MemMap定义 OS_START_SEC_XYZ 和_XYZ所包围。请注意,RTA-OS实际上不会检查Code Location中的值是否存在 - 它只是取路径的最后一部分并使用它来构建代码段名称。实际上,您可以跳过输入完整路径,并直接使用所需的代码段名称XYZ.

    给节段命名时可以包含修饰词,这些修饰词会影响它们的链接方式和位置。以_CODE结尾的节段应该包含可执行内容,并且通常位于闪存中。以_C_POWER_ON_INIT结尾的节段表示数据节段,在芯片重计会在启动代码中进行初始化。以_NO_INIT或_NOINIT结尾的节段表示不应由启动代码进行初始化的数据。这可以用来处理需要持续存在于重置过程中的数据。RTA-OS使用此功能来指示将由操作系统自身进行初始化的数据,从而使启动代码能够更快地运行而无。

    与Compiler_Cfg.h一样,每个基本软件模块还必须提供一个特定于该模块的版本的MemMap.h。在RTA-OS中,特定于模块的MemMap.h被称为Os_MemMap.h。对于AUTOSAR 4.0及更早版本,可以将Os_MemMap.h文件合并或#include到“主”MemMap.h中,在系统编译之前进行处理。

构建RTA-OS库需要使用所有标准AUTOSAR头文件作为构建过程的输入,而这些头文件不在操作系统的范围之内。然而,如果需要,RTA-OS可以生成AUTOSAR标准头文件的示例版本。

集成指南3.4:您必须增强或替换由rtaosgen生成的示例AUTOSAR标准头文件,以便在生产软件中使用。

3.3.3 Running rtaosgen

rtaosgen是一个命令行工具。您可以从Windows命令提示符、make脚本、Ant脚本或任何可以调用Windows应用程序的地方调用它。如果您更喜欢使用图形界面,rtaosgen工具也可以从rtaoscfg Builder中运行。

rtaosgen接受一个或多个配置文件作为输入。配置文件可以是:

  • AUTOSAR XML
  • RTA-OS project files
  • A mixture of both
3.3.4 Building the library

构建RTA-OS库需要将所有标准的AUTOSAR头文件作为构建过程的输入。在调用rtaosgen时,必须包含AUTOSAR标准头文件所在路径的位置。例如,要为RTA-OS目标构建Hello World示例应用程序的库,可以键入以下命令:

rtaosgen --include:PathToAutosarHeaderFiles HelloWorld.rtaos

如果您无法访问AUTOSAR包含文件(例如,如果您在完整的AUTOSAR系统之外使用RTA-OS),那么rtaosgen可以自动生成这些文件。

rtaosgen --samples:[Includes] --include:Samples\Includes HelloWorld.rtaos

请注意,rtaosgen不会强制您使用特定的扩展名 - 您可以使用任何您喜欢的扩展名。

rtaosgen在执行过程中生成四类消息:

**Information. **信息。这些消息向您提供有关配置的有用信息,例如您配置了多少个任务。

Warning. 警告。这些消息警告您,您的配置可能导致操作系统的行为与预期不符。

Error. 错误。这些消息告诉您,您的配置存在问题。rtaosgen将在方便的时候停止处理您的配置,并且不会生成任何输出文件。

Fatal. 致命错误。最多只会出现一条致命错误消息。它告诉您,无论是您的配置还是rtaosgen本身都存在根本性问题,rtaosgen会立即停止运行。

在构过程中,rtaosgen将检查项目目录(参见RTA_PROJECT_BASE)中是否存在_prebuild.bat和/或_postbuild.bat文件。如果这些文件存在,则它们将在构建之前(pre)或之后(post)运行。无论您从何处启动rtaosgen,它们都会从项目目录中运行。 postbuild步骤的典型用途是重命名一个或多个生成的文件,或将文件提交到源代码控制。您还可以提供一个名为_postsamples.bat的文件,在使用–samples选项生成任何文件后立即调用该文件。例如,可以使用此文件将特定于操作系统的.h文件移动到构建位置。此文件在操作系统编译之前被调用。

在这些.bat文件中,rtaosgen提供了以下环境变量,您可以根据需要使用:

  • RTA_PROJECT_BASE:这是项目目录,通常是.rtaos文件所在的目录。
  • RTA_PROJECT_NAME:这是项目名称,通常为.rtaos文件的名称去掉扩展名。
  • RTA_WORKING_FOLDER:这是构建过程运行的目录,通常为您运行rtaosgen时所在的目录。

你可以通过命令行做其他事情,比如改变生成文件的输出目录、抑制消息等。更多详细信息,请参考指南。

Building from rtaoscfg

还可以在“Builder”工作区中的rtaoscfg中构建RTA-OS。

请注意,如果您从rtaoscfg内部构建,则仍需要确保编译器工具链位于Windows路径上。在开始构建之前,您需要保存对项目所做的任何更改。

请注意,在开始构建之前,您可以修改传递给rtaosgen的命令行,因此可以手动添加任何GUI不直接支持的选项。

在“Builder”中配置的任何设置都将存储在您的RTA-OS项目文件中。

3.3.5 Generated Files

当rtaosgen运行并在没有报告任何错误或致命消息的情况下终止时,它将生成以下文件:

在这里插入图片描述

Generating sample code

rtaosgen代码生成器可以生成用作应用程序基础的示例代码。您在第3.3.4节中已经看到了一个案例,当使用--samples[Includes]来生成示例AUTOSAR标准头文件时。

提供的样本集是与端口相关的,但您可以使用以下命令行获取提供的样本列表:

rtaosgen --target:YourTarget --samples:?

大多数端口将提供示例,展示如何编写AUTOSAR OS钩子函数,例如ErrorHook()、StartupHook()等。例如,要生成默认的ErrorHook(),您可以使用以下命令行:

rtaosgen --samples:[ErrorHook] --include:PathToAutosarHeaderFiles
HelloWorld.rtaos

3.4 Integration集成

3.4.1 Accessing the OS in your Source Code 在你的源代码中访问操作系统

要在源代码中访问RTA-OS,只需在每个需要访问RTA-OS的C编译单元(即每个C源代码文件)中包含#include 。该头文件已经防止了多次包含。RTA-OS对于如何组织您的源代码没有任何限制 - 您可以将所有代码放入一个单独的源文件中,或者根据您(或配置控制过程)的要求将每个任务和中断实现放入其自己的源文件中。

3.4.2 Implementing Tasks and ISRs实任务和中断服务程序(ISRs)

Task

在配置时声明的每个任务都必须提供一个任务的实现。每个任务需要使用TASK(x)宏进行标记。任务通常具有以下结构:

#include <Os.h>
TASK(MyTask){
   /* Do something */
   TerminateTask();
}

Category 2 ISRs

每个你声明的Category 2 ISR都需要被实现。这也会被标记,这次是通过ISR(x)来标记:

#include <Os.h>
ISR(MyISR){
   /* Do something */
}

**集成指南3.5:**类别2的ISR处理程序不需要从中断调用返回 - RTA-OS会自动执行此操作。根据目标硬件上中断源的行为,您可能需要清除挂起的中断标志。请参考您芯片供应商提供的硬件文档以获取更多详细信息。

Category 1 ISRs

每个您声明的Category 1 ISR也需要被实现。您的编译器将使用一种特殊约定来标记C函数作为中断。RTA-OS提供了一个宏,该宏会展开为适合您编译器的正确指令。因此,您的Category 1处理程序将类似于这样:

#include <Os.h>
CAT1_ISR(MyCat1ISR) {
   /* Do something */
}
3.4.3 Starting the OS

RTA-OS不会控制您的硬件,因此您需要在主程序中使用StartOS() API调用手动启动操作系统。RTA-OS提供了一个名为OS_MAIN()宏,该宏会根据您的编译器工具链扩展到正确类型的main()定义

#include <Os.h>
OS_MAIN() {
   /* Initialize target hardware */
   ...
   /* Do any mode management, pre-OS functions etc. */
   ...
   /* Use RTA-OS to initialize interrupts */
   Os_InitializeVectorTable();
   StartOS();
   /* Call does not return so you never reach here */
}
3.4.4 Interacting with the RTA-OS 与RTA-OS进行交互

您可以通过进行内核API调用与RTA-OS进行交互。您可以在参考指南中找到完整的调用列表。

3.4.5 Compiling and Linking

当你编译代码时,必须确保Os.h和Os_Cfg.h可以在编译器的包含路径中找到。当你链接应用程序时,必须链接RTAOS.库,并且该库必须位于链接器的库路径上。

3.5 Memory Images and Linker Files 内存映像和链接器文件

当构建应用程序时,代码、数据、ROM和RAM等各种部分需要根据MemMap.h中定义的节的位置放置在正确的内存位置上。通常情况下,这是由链接器完成的,链接器解析用户提供的代码对RTA-OS库的引用,并将相关目标模块绑定在一起,在将生成的代码和数据分配到内存地址之前,将其放置在适当类型的内存中以生成可加载到目标设备上的映像。

链接器需要知道程序中哪些部分要放置在哪些类型的内存中,微控制器上ROM和RAM所处位置,并且如何将程序部分映射到正确类型的内存。

注: 一个历史注解:从技术上讲,这个工作是定位器的工作它通过将虚拟地址映射到物理地址来将部分加载到内存中。过去这些工具被称为链接器/定位器。在现代,定位器部分已经不常用了,这些工具通常被称为“链接器”。

3.5.1 Sections

编译器和汇编器生成的代码和数据输出通常被组织成不同的部分。有些部分只包含代码,有些既包含代码又包含数据,还有一些只包含数据。你可能会看到一个汇编程序片段,类似于CodeExample 3.1中所示的内容。

这意味着MYPROC的代码应该被汇编,并且目标代码应该假设它将位于内存中的一个名为的部分,我们稍后会在链接器控制文件中指定其位置。同样地,标记为FRED的数据将被放置:

.section CODE
.public MYPROC
mov
r1, FRED
add
r1, r1
ret
.end CODE
.section DATA
.public FRED
.word 100, 200, 300, 400
.end DATA
.section BSS
.public WORKSPACE
.space 200
.end BSS

Example 3.1: Example Assembler Output Showing Sections

在一个名为DATA的部分中,将会分配一个200字节大小的空间,并标记为WORKSPACE,在BSS部分。

C编译器通常将你的代码输出到一个称为code或text的部分,必须放入ROM中的常量放在一个类似const的部分,而变量则放在data中。通常还会有更多 - 请参考您所使用工具链的参考手册以了解这些部分被称为什么,并熟悉它们需要放置在哪里。

在AUTOSAR下,你的MemMap.h将定义需要定位的实际部分的名称。到目前为止,我们还没有将这些映射到“真实”内存中的地址上。因此,我们须看一下这些部分如何映射到内存镜像中。

‘Near’ and ‘Far’ Address Spaces

在一些处理器上,存在可以经济地寻址的内存空间区域(通常使用更短、更小的指令,并具有较简单的有效地址计算),这些区域位于芯片上而不是芯片外部,或者采用了一种技术来制造,使得访问效率更高。RTA-OS将这种内存称为近距离空间,并在这些处理器上将一些关键数据放置在这些区域中。在此类平台上,您将获得关于必须将近距离空间定位在ROM和/或RAM中的信息,并且在Target/Compiler端口指南中会告知其中放置了哪些数据。远距离空间指整个内存范围。

Program and Data Space on Harvard Architectures

到目前为止,关于内存的大部分讨论都假设了传统的冯·诺伊曼架构,在这种架构中,数据和代码占据一个地址空间,ROM和RAM位于其中不同的偏移量上。一些处理器(通常是像PIC这样非常小型的微控制器或高性能数字信号处理器)采用哈佛架构,在这种架构中,代码和数据有着独立的地址空间(尽管在编程方面存在一些劣势,但也有一些性能优势)。在哈佛架构处理器上,RTA-OS可能会使用数据空间(通常是RAM)来存储通常在冯·诺伊曼架构处理器上作为ROM储的数据,并且启动代码通常包含将常数数据复制到数据空间中的代码。如果您正在使用哈佛结构处理器,则目标/编译器端口指南将包含有关使用RAM存储副本常量的任何信息。

3.5.2 The Linker Control File

链接器控制文件管理着下载到目标微控制器的图像中代码、数据和保留空间的位置。链接器文件在不同平台和目标之间有很大差异,但通常至少包括以下内容:

  • 芯片上ROM和RAM的位置声明-这些可能因CPU系列的不同变体而有所不同。
  • 可以放置在每个内存空间中的部分列表。
  • 堆栈指针、复位地址、中断向量等的初始化。

示例3.2展示了一个假设的链接器控制文件:上述文件定义了四个独立的内存部分 - ONCHIPRAM、RAM、ROM和VECTBL。

根据注释,适当的数据被放置在每个部分中。RTA-OS嵌入式端口提供的用程序将包含一个完全注释过的链接器控制文件;请参考此文件以及目标/编译器端口指南,了解如何正确定位您目标平台上的这些部分的详细信息。

ONCHIPRAM start 0x0000 {
   Section .stack size 0x200 align 16 # system stack
   Section .sdata align 16      # small data
   Section bsw_near align 16    # near data

}

def __SP = start stack # initialize stack ptr

RAM start 0x4000 {
   Section .data align 16  # compiler data
   Section .bss align 16   # compiler BSS
   Section bsw_zero_init align 16      # Basic Software zeroed RAM
   Section bsw_startup_init align 16      # Basic Software initialized RAM
   Section swc_startup_init align 16     # Application initialized RAM
}

ROM start 0x8000 {
   Section .text        # compiler code
   Section .const          # compiler constants
   Section swc_data align 16        # Application static data
   Section swc_init align 16        # Application initial data
   Section bsw_init align 16        # Basic Software initial data
}

VECTBL start 0xFF00 {
   Section OsVectorTable         # RTA-OS’s vector table
}
def __RESET = __main          # reset to __main

Example 3.2: A Linker Control File

3.6 Summary 总结

  • 将RTA-OS与您的应用程序集成有5个步骤:
    1. 配置您想要使用的操作系统的功能。
    2. 生成一个定制的RTA-OS内核库。
    3. 编写使用该操作系统的应用程序代码。
    4. 将您的应用程序代码编译并与RTA-OS库进行链接。
    5. 在目标设备上运行您的应用程序。
  • 有两个离线工具:rtaoscfg用于配置RTA-OS,rtaosgen用于生成和构建内核库。
  • RTA-OS是一个AUTOSAR基础软件模块,并且依赖于AUTOSAR头文件。如果需要,可以通过rtaosgen生成这些头。
  • RTA-OS的链接和定位取于Os_MemMap.h文件的内容,该文件由rtaosgen用来构建内核库。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾格北峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值