Os

目标

本文档以S32K148芯片平台为例,用于指导客户进行OS集成,文档主要包括的内容为:OS集成指导、基于普通应用的集成示例讲解、项目集成特殊说明。

通过阅读本文档,用户可以了解代码集成过程,ORIENTAIS配置工具的配置过程,以及如何应用配置工具生成的配置文件。由于各项目的需求不同,集成示例不会针对于特定的商业项目做详细讲解。特定商业项目的主要集成问题,将在项目集成特殊说明章节讲述。

缩写词和术语

缩写词/术语

描述

AUTOSAR OS

Specification of Operating System

ECU

Electronic Control Unit:电控单元

MCAL

Microcontroller Abstraction Layer:微控制器抽象层

MCU

Micro Controller Unit:微处理器

参考文档

  1. AUTOSAR_SWS_OS.pdf

  2. ORIENTAIS_OS_用户手册.pdf

  3. ORIENTAIS_Studio_OS_用户手册.pdf

  4. OSEK/VDX Operating System.pdf

软件架构

image1

图 ORIENTAIS OS 软件架构

OS对外部模块的依赖

编号

类别

约束限制

1

MCAL - MCU

用户需正确配置MCAL中MCU模块,在启动OS前,用户应调用MCU初始化以确保系统时钟的准确性。

协议栈集成

普华交付的内容为:协议栈源码和ORIENTAIS Configurator配置工具。

本章节仅描述ORIENTAIS Configurator建立配置工程的方法,不描述如何配置OS,配置示例请参考本文档的章节(集成示例)。

表 OS模块分类

模块名

模块分类

Os.h

ORIENTAIS OS 的内核模块。

Os_Alarm.c

Os_Appl.c

Os_Core.c

Os_Counter.c

Os_ECode.h

Os_Err.h

Os_Event.c

Os_Hook.c

Os_Hook.h

Os_Internal.h

Os_Interrupt.c

Os_Ioc.c

Os_Kernel.c

Os_LoadRatio.c

Os_LoadRatio.h

Os_Marcos.h

Os_MemMap.h

Os_Monitor.c

Os_Monitor.h

Os_Mprot.c

Os_Panic.c

Os_Peripheral.c

Os_Resource.c

Os_Rpc.c

Os_ScheduleTable.c

Os_Spinlock.c

Os_Sprot.c

Os_StackMonitor.c

Os_Task.c

Os_Tprot.c

Os_Trace.c

Os_Trace.h

Os_Types.h

Os_Extend.c

扩展功能

Os_Extend.h

Mcu_Core.c

移植相关

Mcu_Core.h

Mcu_Irq.h

Mcu_Timer.c

Mcu_Timer.h

Os_MemmapImp.h

Arch_Context.s

Arch_Define.h

Arch_Extend.c

Arch_Extend.h

Arch_Irq.c

Arch_Irq.h

Arch_Mpu.c

Arch_Mpu.h

Arch_Processor.c

Arch_Processor.h

Arch_Trap.c

Ioc.c

配置文件

Ioc.h

Os_Cfg.c

Os_Cfg.h

Os_CfgData.h

Os_Cfg_S.h

Os_CoreCfg.c

Os_CoreCfg.h

Os_DataSection.lsl

Os_Intvet.c

Os_Kdata.c

Os_Linker.ld

Os_Mp_MemMap.h

Os_MprotCfg.c

Os_MprotCfg.h

Os_Trace.orti

Os_UserInf.c

表 协议栈集成的步骤

步骤

操作

说明

1

ORIENTAIS Configurator配置工具工程搭建和协议栈模块加载

若配置工具已经搭建,则仅需进行协议栈模块的加载操作。

2

模块配置及配置文件生成

NA

3

代码集成

现有工程、协议栈源代码和配置生成文件的集成。

4

验证测试

NA

新建ORIENTAIS Configurator配置工程

  1. 安装ORIENTAIS Configurator软件后,双击软件图标打开软件。

    image2

    图 新建工程-1

  2. 菜单栏File🡪New🡪Project,新建工程。

    image3

    图 新建工程-2

  3. 在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next。

    image4

    图 新建工程-3

  4. 在弹出的窗口中输入工程名,选择Finish。

    image5

    图 新建工程-4

  5. 选择[Bsw_Builder],右键单击,选择New ECU Configuration。

    image6

    图 新建ECU

  6. 在弹出的窗口中输入ECU名,选择S32K148芯片,然后选择Next。

    image7

    图 选择芯片平台

  7. 在弹出的窗口中勾选需添加的模块,点击Finish。

    image8

    图 完成ECU配置

  8. 新建工程如下图所示。

    image9

    图 完成新建工程

模块配置及生成代码

模块配置

模块的具体配置,取决于具体的项目需求。OS各模块配置项的详细介绍,请参考ORIENTAIS OS_用户手册.pdf。

配置代码生成

  1. 在ORIENTAIS Configurator主界面左方,选择对应的协议栈,单击右键弹出Validate和Generate菜单。

    image10

    图 代码生成

  2. 选择Validate 对本协议栈各配置选项进行校验,没有错误提示信息即校验通过。若有错误信息,请按照错误提示修改。

  3. 选择Generate,生成配置文件。右下角的Console窗口输出生成的配置文件信息。

    image11

    图 代码生成提示界面

  4. 在ORIENTAIS Configurator主界面左方,即可查看生成的配置文件。

    image12

    图 生成的配置文件

功能集成

此章节用于指导用户在集成OS过程中应注意一些事项。

代码集成

协议栈代码包括两部分:普华提供的协议栈源码和ORIENTAIS Configurator配置生成代码。

用户须将协议栈源码和章节(模块配置及生成代码)生成的源代码添加到集成开发工具的对应文件夹。

Note

OS集成之前,需确保MCU时钟的正确性。

集成注意事项

对于集成过程中,OS特殊要求和用户经常出现的问题,归类总结形成表 协议栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。

表 协议栈集成约束清单

编号

类别

约束限制

1

堆栈

用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间

2

头文件

  • 添加协议栈代码之后,用户需更新集成开发工具中的头文件路径

  • 调用协议栈API的源文件,需要包含协议栈的头文件

3

MCU初始化

用户应调用Mcu_Init()以初始化系统时钟

4

启动OS

用户应调用StartOS()以启动OS

集成示例

本章节通过OS为例,向用户展示OS的集成过程。用户可以据此熟悉OS配置工具的配置过程,以及如何应用配置工具生成的配置文件。

Note

本示例配置为1核且可扩展类为SC1模式。该示例仅包含基础配置,故下面配置为部分OS配置。

集成目标

通过搭建基础工程,实现OS的基本功能(即:任务调度功能)。

表 配置目标

TASK

Name

Priority

Preemptive Poilcy

Activation Limit

Core0_Task

1

FULL

1

Auto start

False

Alarm

Name

Activate

Counter

Task

Core0_Alarm

Activate Task

SystemTimer_Core_0

Core0_Task

ISR

Name

Category

Priority

Nested Enable

CAN0_ORed_ADDR

GATEGORY_2

1

False

模块的配置

  1. OsOS界面配置如下:

    image13

    图 OsOS 配置

    配置项名

    描述

    Cores Number

    配置OS为1核。

    Map CPU

    将单核OS映射至核0运行。

    Scalability Class

    将OS功能裁减为SC1下的功能。

    Os Status

    设置OS的状态为EXTENED模式。

    Error Hook

    开启错误钩子函数

    Shutdown Hook

    开启关闭钩子函数

    Startup Hook

    开启启动钩子函数

  2. SystemTimer配置界面如下:

    image14

    图 SystemTimer配置

    配置项名

    描述

    STM_Frequency[MHZ]

    系统时钟频率:48MHZ

    Priority

    设置系统中断的优先级为:10

    Nest Enable

    设置该系统中断是否支持嵌套功能

    TickTime[s]

    设置系统中断周期时间为:0.001s

  3. OsCounter配置界面如下:

    image15

    图 OsCounter配置

    配置项名

    描述

    Max Tick

    设置系统Counter的最大tick值为:65535 Tick。

    Min Cycle

    设置系统Counter的最小tick值为:1 Tick。

  4. OsAppMode配置如下:

    image16

    图 OsAppMode配置

    配置项名

    描述

    OsAppMode

    设置OS的工作模式:OSDEFAULTAPPMODE。

  5. OsTask配置界面如下:

    image17

    图 OsTask配置-1

    image18

    图 OsTask配置-2

    配置项名

    描述

    Activation Limit

    设置该任务能被连续激活的次数:允许连续激活1次

    Priority

    设置任务的优先级为:1

    Preemptive Policy

    设置该任务的抢占策略为:FULL

    Stack Size

    设置任务的堆栈为:256(单位:4bytes)

  6. OsAlarm界面配置如下:

    image19

    图 OsAlarm配置-1

    image20

    图 OsAlarm配置-2

    配置项名

    描述

    Counter Ref

    选择驱动Alarm的Counter:SystemTimer_Core_0。

    OsAlarmActivateTask

    选择Alarm到期后的动作为:激活Core0_Task。

    OsAlarmAutostart

    设置Alarm启动方式:自启动。

    Start Time[tick]

    设置Alarm的启动偏移tick值为:100 Tick。

    Autosar Type

    设置该Alarm的启动方式为:相对启动。

    Cycle Time[tick]

    设置该周期Alarm的tick值为:100 Tick。

    AppMode

    设置该Alarm的启动模式为:OSDEFAULTAPPMODE

  7. OsIsr配置界面如下:

    image21

    图 OsIsr配置

    配置项名

    描述

    Category

    配置CAN0_ORed_ADDR中断为:CATEGORY_2

    Stack Size

    设置CAN0_ORed_ADDR中断栈空间为:128(单位:4bytes)

    Priority

    设置CAN0_ORed_ADDR中断的优先级为:1

    Nested Enable

    设置中断嵌套功能:不开启总的嵌套。

配置代码生成

请参考本文档的章节(模块配置及生成代码)。

源代码集成

普华交付给用户的工程结构如下:

image22

图 目录结构

  • BSW_Config目录,这个目录用来存放配置工具生成的配置文件。

  • SystemServices目录,存放模块相关的源代码。

集成步骤

OS代码集成步骤如下:

  1. 将章节(模块配置及生成代码)中ORIENTAIS Configurator生成的配置文件复制到BSW/Config/BSW_Config文件夹中。

  2. 将普华提供的协议栈源代码文件复制到BSW/SystemServices文件夹中。

协议栈调度集成

OS调度集成步骤如下:

  1. 协议栈调度集成,需要逐一排查并实现表 协议栈集成约束清单所罗列的问题,以避免集成出现差错。

  2. 执行编译、链接操作生成elf文件,并将elf文件烧写到目标板中。

MCU初始化相关的代码,在下方的main.c文件中给出重点标注。

 1// 初始化MCU时钟
 2int main(void)
 3{
 4    Mcu_Init(Mcu_ConfigRoot);  // 初始化MCU模块,加载配置参数
 5    Mcu_InitClock(0);          // 初始化时钟,参数0表示使用默认时钟配置
 6
 7    /* 等待PLL锁定 */
 8    while (MCU_PLL_UNLOCKED == Mcu_GetPllStatus());  // 循环等待PLL稳定
 9
10    Mcu_DistributePllClock();  // 分发PLL时钟到各外设
11
12    StartOS(OSDEFAULTAPPMODE);  // 启动操作系统,使用默认应用模式
13
14    /* 无限循环(理论上不会执行到此处) */
15    while (1)
16    {
17    }
18    return 1;
19}

验证结果

在调试软件界面点击全速运行,周期任务能够按照周期时间执行,达到了集成目标的要求。