OS_集成手册

目标

本文档用于指导客户进行OS集成,文档主要包括的内容为:OS集成指导、基于应用的集成示例讲解。

由于各项目的需求不同,集成示例不会针对于特定的商业项目做详细讲解。

缩写词和术语

表 2-1 缩写词和术语

** 缩写词/术语**

描述

MCAL

Microcontroller Abstraction Layer 微控制器抽象层

MCU

Micro Controller Unit 微处理器

MPU

Memory Protection Unit 内存保护单元

参考文档

  1. OSEK/VDX Operating System.pdf

  2. ARC_V2_ProgrammersReference_em22fs.pdf

  3. DDI0403D_armv7m_arm.pdf

协议栈集成

项目交付的内容为:协议栈源码和ORIENTAIS Studio配置工具。

本章节仅描述ORIENTAIS Studio建立配置工程的方法,不描述如何配置OS,配置示例请参考本文档的第5,6章节。

表 4-1 OS模块分类

模块名

模块分类

Os_Alarm.c

ORIENTAIS OS 的内核模块。

Os_Appl.c

Os_Core.c

Os_Panic.c

Os_Counter.c

Os_Peripheral.c

Os_Rpc.c

Os_StackMonitor.c

Os_Err.h

Os_Event.c

Os_Hook.c

Os_Internal.h

Os_Interrupt.c

Os_Ioc.c

Os_Kernel.c

Os_Marcos.h

Os_MemMap.h

Os_Mprot.c

Os_Resource.c

Os_ScheduleTable.c

Os_Spinlock.c

Os_Sprot.c

Os_Task.c

Os_Tprot.c

Os_Types.h

Os.h

Os_Extend.c

扩展功能

Os_Extend.h

Arch_Processor.c

移植相关

Arch_Processor.h

Arch_Define.h

Arch_Extend.c

Arch_Extend.h

Arch_Irq.c

Arch_Irq.h

Arch_Mpu.c

Arch_Mpu.h

Arch_Timer.c

Arch_Trap.c

Os_Cfg.c

配置文件

Os_Cfg.h

Os_CfgData.h

Os_Intvet.c

Os_Mp_MemMap.h

Os_UserInf.c

Ioc.c

Ioc.h

Os_Cfg_S.h

Os_Kdata.c

Os_Link.ld

表 4-2 协议栈集成的步骤

步 骤 *

操作

说明

1

ORIENTAIS Stuido配置工具 工程搭建和协议栈模块配置

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

2

模块配置及配置文件生成

NA

3

代码集成

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

4

验证测试

NA

新建ORIENTAIS Studio配置工程

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

../../_images/image1181.png

图 4-1 新建工程-1

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

../../_images/image2138.png

图 4-2 新建工程-2

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

../../_images/image3104.png

图 4‑3 新建工程-3

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

../../_images/image4102.png

图 4-4 新建工程-4

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

../../_images/image580.png

图 4-5 新建工程-5

  1. 在弹出的窗口中输入ECU名,然后选择Next。

../../_images/image676.png

图 4-6 新建工程-6

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

../../_images/image760.png

图 4-7 新建工程-7

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

../../_images/image856.png

图 4-8 新建工程8

模块配置及生成代码

模块配置

模块的配置,取决于项目需求。OS各模块配置项的详细介绍,请参考《参考手册_OS.pdf》。

配置代码生成

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

../../_images/image955.png

图 4-9 模块检验和代码生成

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

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

../../_images/image1047.png

图 4-10

  1. config下就是生成的配置文件。

../../_images/image1182.png

图 4-11 生成文件示例

功能集成

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

代码集成

协议栈代码包括两部分:项目提供的协议栈源码和ORIENTAIS Studio配置生成代码。

用户须将ORIENTAIS OS 的内核模块文件和4.2章节生成的配置文件添加到集成开发工具的对应文件夹。协议栈集成的文件结构,见章节5.3。

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

集成注意事项

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

表 4-3协议栈集成约束清单

编 号 *

类别

约束限制

** 1**

堆栈

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

** 2**

头文件

  • 添加协议栈代码

之后,用户需更新集成开发工具中的头文件路径。

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

** 3**

MCU初始化

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

** 4**

启动OS

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

** 5**

A pplication配置

多核和SC3/SC4场景下,必须配置Application。

SC1集成示例

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

集成目标

通过配置和集成表 5-1配置目标所示的OS SC1配置,实现每隔100毫秒激活一次任务OsTask_Core0。

表 5-1配置目标

TASK

Name

Priority

Stack Size

Activation Limit

OsTask_Core0

1

128

1

OsTaskAutostart

Preemptive Poilcy

False

FULL

Alarm

Name

Activate

Counter

Task

OsAlarm_Core0

Activate Task

SystemTimer_Core

OsTask_Core0

O sAlarmAutostart

Start Time

Cycle Time

Autosar Type

True

100

100

ABSOLUTE

ISR

Name

Category

Stack Size

Nested Enable

OS_INT0_IRQn

GATEGORY_2

128

False

Priority

1

模块的配置

  1. OsOS界面配置如下:

../../_images/image1246.png

图 5-1 OsOS 配置

表 5-2 OsOS配置项描述

配置项名

描述

Cores Number

配置OS为1核。

Map CPU

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

Scalability Class

OS功能配置为SC1

Os Status

设置OS的状态为EXTENED模式。

Error Hook

开启错误钩子函数

Shutdown Hook

开启关闭钩子函数

Startup Hook

开启启动钩子函数

  1. OsAlarm界面配置如下:

../../_images/image1341.png

图 5-2 OsAlarm配置-1

../../_images/image1439.png

图 5-3 OsAlarm配置-2

表 5-3 OsAlarm配置项描述

配置项名

描述

Counter Ref

选择驱动Alarm的Counter:SystemTimer_Core。

OsAlarmActivateTask

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

OsAlarmAutostart

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

Start Time[tick]

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

Autosar Type

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

Cycle Time[tick]

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

AppMode

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

  1. OsAppMode配置如下:

../../_images/image1538.png

图5-4 OsAppMode配置

表 5-4 OsAppMode配置项描述

配置项名

描述

OsAppMode

设置OS的工作模式:OSDEFAULTAPPMODE。

  1. OsCounter配置界面如下:

../../_images/image1634.png

图 5-5 OsCounter配置

表 5-5 OsCounter配置项描述

配置项名

描述

Max Tick

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

Min Cycle

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

  1. OsIsr配置界面如下:

../../_images/image1735.png

图 5-6 OsIsr配置

表 5-6 OsIsr配置项描述

配置项名

描述

Category

配置OS_INT0_IRQn中断为:CATEGORY_2。

Stack Size

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

Priority

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

Nested Enable

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

  1. OsTask配置界面如下:

../../_images/image1833.png

图 5-7 OsTask配置-1

../../_images/image1930.png

图 5-8 OsTask配置-2

表 5-7 OsTask配置项描述

配置项名

描述

Activation Limit

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

Priority

设置任务的优先级为:1

Preemptive Policy

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

Stack Size

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

OsTaskAutostart

关闭自启动

  1. SystemTimer配置界面如下:

../../_images/image2028.png

图 5-9 SystemTimer配置-1

../../_images/image2139.png

图 5-10 SystemTimer配置-2

表 5-8 SystemTimer配置项描述

配置项名

描述

STM_Frequency[MHZ]

系统时钟频率:120MHz

Priority

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

Nest Enable

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

TickTime[s]

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

源代码集成

项目交付给用户的工程结构如下:

../../_images/image2231.png

图 5-11 目录结构-1

../../_images/image2328.png

图 5-12 目录结构-2

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

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

协议栈调度集成

OS调度集成步骤如下:

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

  2. 编译链接代码,将生成的elf文件烧写进芯片。

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

#include “Mcu.h”

#include “Os.h”

#include “Arch_Processor.h”

#include “Os_Extend.h”

int main(void)

{

uint32 flag = (uint32)0;

StatusType test_core1;

StatusType test_core2;

StatusType rv;

/*Get physical core id*/

uint8 coreID = GetCoreID();

/*OS_CORE_ID_MASTER is physical core id 0*/

if (OS_CORE_ID_MASTER == coreID)

{

Mcu_Init(Mcu_Config);

Mcu_InitClock(McuConf_McuClockSettingConfig);

while (MCU_PLL_UNLOCKED == Mcu_GetPllStatus())

{

/* wait for PLL locked */

}

Mcu_DistributePllClock();

#if(TRUE == CFG_CORE1_AUTOSAROS_ENABLE)

StartCore(OS_CORE_ID_1, &rv);

#endif

#if(TRUE == CFG_CORE2_AUTOSAROS_ENABLE)

StartCore(OS_CORE_ID_2, &rv);

#endif

StartOS(OSDEFAULTAPPMODE);

/* infinite loop */

while (1)

{

}

}

/*OS_CORE_ID_0 is physical core id 1*/

#if(TRUE == CFG_CORE1_AUTOSAROS_ENABLE)

else if (OS_CORE_ID_1 == coreID)

{

/* Start AUTOSAR OS. */

StartOS(OSDEFAULTAPPMODE);

/* infinite loop */

while (1)

{

}

}

#endif

#if(TRUE == CFG_CORE2_AUTOSAROS_ENABLE)

else if (OS_CORE_ID_2 == coreID)

{

/* Start AUTOSAR OS. */

StartOS(OSDEFAULTAPPMODE);

/* infinite loop */

while (1)

{

}

}

#endif

else

{

while(1)

{

}

}

return 1;

}

验证结果

当全速运行时,周期任务能够按照周期时间执行,达到了集成目标的要求。

SC3集成示例

  1. 集成目标

通过配置和集成OS SC3,实现No Trusted Application间数据访问的隔离。

  1. OsApplication子模块配置如下:

表 6-1 SC3配置目标-Application

A pplication Name

OsApp DataMpuRegionSize

OsAppC odeMpuRegionSize

T rusted

Prote ction

App lication_0

MPU_2_KB

MPU_2_KB

×

App lication_1

MPU_2_KB

MPU_2_KB

×

N/A

App lication_2

MPU_2_KB

MPU_2_KB

×

N/A

App lication_3

MPU_2_KB

MPU_2_KB

Application_0配置为Trusted且不开启Protection,该Application下的Task对内存的访问不受MPU的限制。

Application_3配置为Trusted且开启Protection,该Application下的Task运行对内存的访问受MPU的限制(实现定义)。

Application_1和Application_2配置为No Trusted,该Application下的Task对内存的访问受MPU的限制。

  1. OsTask子模块配置如下:

表 6-2 SC3配置目标-Task

Task Name

Stack Si ze[4Bytes]

OsTas kMpuRegionSize

OsTaskAutostart

OsTa sk_App0Init

128

MPU_512_BYTES

OSDEFAULTAPPMODE

OsTa sk_App1Init

128

MPU_512_BYTES

OSDEFAULTAPPMODE

OsTa sk_App2Init

128

MPU_512_BYTES

OSDEFAULTAPPMODE

OsTa sk_App3Init

128

MPU_512_BYTES

OSDEFAULTAPPMODE

模块的配置

  1. OsOS界面配置如下:

../../_images/image2426.png

图 6-1 OsOS配置

  1. OsApplication界面配置如下:

../../_images/image2524.png

图 6-2 OsApplication配置-1

../../_images/image2623.png

图 6-3 OsApplication配置-2

../../_images/image2722.png

图 6-4 OsApplication配置-3

表 6-3 OsApplication配置项描述

配置项名

描述

Trusted

配置Application为Trusted Application

Protection

Trusted Application的写权限是否被限制

CoreRef

指定运行该Application的核。

OsAppDataMpuRegionSize

Application下所有数据组合后的对齐策略。

OsAppCodeMpuRegionSize

Application代码对齐策略。

OsAppTaskRef

Application下管理的Task。

  1. OsTask界面配置如下:

../../_images/image2820.png

图 6-5 OsTask配置-1

../../_images/image2920.png

图 6-6 OsTask配置-2

图 6-5 OsTask配置-1中的OsTaskMpuRegionSize用于控制生成的链接文件中该Task下所有数据的对齐策略,一般与栈大小保持一致。

源代码的集成

  1. SC3下,ORIENTAIS Stuido配置工具会根据编译器生成特定格式的链接文 件,需将链接文件添加至编译工程中;以S32DS-GCC10.2编译器为例,项目OS工具生成的链接文件名为Os_Link.ld,将该文件添加Build过程的方式如 图所示:

../../_images/image3015.png

图 6-7 S32DS-GCC10.2添加链接文件

  1. 实现Application_1的变量无法被Application_2访问的限制,需要采用如下 方 式定义变量:

../../_images/image3123.png

图 6-8 划分变量时变量声明方式

引用的宏符号OS_START_SEC_CORE0_OSAPPLICATION_1_PRI_DATA和OS_STOP_SEC_CORE0_OSAPPLICATION_1_PRI_DATA可以在下图所示的文件Os_Mp_MemMap.h中找到

../../_images/image3221.png

图 6-9 Os_Mp_MemMap.h生成示例

验证结果

图 6-10 测试MPU功能中的代码为Application_2下的OsTask_App2Init访问Application_1的私有变量,代码运行图中所示的位置后,MPU会检测到写访问超出访问权限,并触发异常。

../../_images/image3320.png

图 6-10 测试MPU功能

该平台的现象为进入HardFault_Handler,如下图所示;

../../_images/image3419.png

图 6-11 内存保护异常现象

MPU异常触发原因的定位

Armv7-M

支持的MCU:NXP S32Kxxx, FlagChip FC7300Fx, Cypress

CYTxxx等

内核手册中的描述如下

../../_images/image3519.png

图 6-12 MPU故障地址寄存器

  1. 寄存器MMFAR(0xE000ED34),当发生内存保护异常时,该寄存器的会存记 录触发内存保护异常的内存地址;

../../_images/image3619.png

图 6-13 Armv7-M内存保护异常地址寄存器(S32DS)

  1. 由于该内核支持硬件上下文保存机制,可以通过暂时删除HardFault中的内容,采用汇编单步运行的方式快速定位到触发异常的指令,但是对于发生在Exception Entry 或者 Exit处的内存保护异常该策略会失效;

  2. 对于S32K312平台,当使用PEMicro调试时,会在console窗口输出以下信息协助定位问题;

图 6-14 S32DS + PEMicro的相关Debug支持

ARC-EM22FS

支持的MCU: Calterah Alps,Alps-Pro

该寄存器指示触发MPU异常的Region Number和访问方式(读、写、执行、内存交换等)

../../_images/image3814.png

图 6-15 ARC-EM22FS MPU异常原因寄存器

实际项目开发中,ERET寄存器更常用,该寄存器用于记录异常返回地址(即:导致异常的指令的地址),可根据相关编译生成文件确定触发异常代码位置。