OS_集成手册¶
目标¶
本文档用于指导客户进行OS集成,文档主要包括的内容为:OS集成指导、基于应用的集成示例讲解。
由于各项目的需求不同,集成示例不会针对于特定的商业项目做详细讲解。
缩写词和术语¶
缩写词/术语 |
描述 |
MCAL |
Microcontroller Abstraction Layer 微控制器抽象层 |
MCU |
Micro Controller Unit 微处理器 |
MPU |
Memory Protection Unit 内存保护单元 |
参考文档¶
OSEK/VDX Operating System.pdf
ARC_V2_ProgrammersReference_em22fs.pdf
DDI0403D_armv7m_arm.pdf
协议栈集成¶
项目交付的内容为:协议栈源码和ORIENTAIS Studio配置工具。
本章节仅描述ORIENTAIS Studio建立配置工程的方法,不描述如何配置OS,配置示例请参考本文档的第5,6章节。
模块名 |
模块分类 |
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 |
步骤 |
操作 |
说明 |
1 |
ORIENTAIS Stuido配置工具工程搭建和协议栈模块配置 |
若配置工具已经搭建,则仅需进行协议栈模块的加载操作。 |
2 |
模块配置及配置文件生成 |
NA |
3 |
代码集成 |
现有工程、 协议栈源代码和配置生成文件的集成。 |
4 |
验证测试 |
NA |
新建ORIENTAIS Studio配置工程¶
安装ORIENTAIS Studio软件后,双击软件图标打开软件。

图 4-1 新建工程-1¶
菜单栏File🡪New🡪Project,新建工程。

图 4-2 新建工程-2¶
在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next。

图 4‑3 新建工程-3
在弹出的窗口中输入工程名,选择Finish。

图 4-4 新建工程-4
选择[Bsw_Builder],右键单击,选择New ECU Configuration。

图 4-5 新建工程-5¶
在弹出的窗口中输入ECU名,然后选择Next。

图 4-6 新建工程-6¶
在弹出的窗口中勾选需添加的模块,点击Finish。

图 4-7 新建工程-7¶
新建工程如下图所示。

图 4-8 新建工程8¶
模块配置及生成代码¶
模块配置¶
模块的配置,取决于项目需求。OS各模块配置项的详细介绍,请参考《参考手册_OS.pdf》。
配置代码生成¶
在ORIENTAIS Studio主界面左方,选择对应的协议栈,单击右键弹出Validate All和Generate All菜单。

图 4-9 模块检验和代码生成¶
选择Validate All对本协议栈各配置选项进行校验,没有错误提示信息即校验通过。若有错误信息,请按照错误提示修改。
选择Generate All,生成配置文件。右下角的Console窗口输出生成的配置文件信息。

图 4-10¶
config下就是生成的配置文件。

图 4-11 生成文件示例¶
功能集成¶
此章节用于指导用户在集成OS过程中应注意一些事项。
代码集成¶
协议栈代码包括两部分:项目提供的协议栈源码和ORIENTAIS Studio配置生成代码。
用户须将ORIENTAIS OS 的内核模块文件和4.2章节生成的配置文件添加到集成开发工具的对应文件夹。协议栈集成的文件结构,见章节5.3。
注意:OS集成之前,需确保MCU时钟的正确性。
集成注意事项¶
对于集成过程中,OS特殊要求和用户经常出现的问题,归类总结形成表 4-3协议栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。
编号 |
类别 |
约束限制 |
1 |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
2 |
头文件 |
|
3 |
MCU初始化 |
用户应调用Mcu_Init()以初始化系统时钟; |
4 |
启动OS |
用户应调用StartOS()以启动OS。 |
5 |
Application配置 |
多核和SC3/SC4场景下,必须配置Application。 |
SC1集成示例¶
本章节向用户展示OS的集成过程。用户可以据此熟悉OS配置工具的配置过程,以及如何应用配置工具生成的配置文件。
集成目标¶
通过配置和集成表 5-1配置目标所示的OS SC1配置,实现每隔100毫秒激活一次任务OsTask_Core0。
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 |
模块的配置¶
OsOS界面配置如下:

图 5-1 OsOS 配置¶
配置项名 |
描述 |
Cores Number |
配置OS为1核。 |
Map CPU |
将单核OS映射至核0运行。 |
Scalability Class |
OS功能配置为SC1 |
Os Status |
设置OS的状态为EXTENED模式。 |
Error Hook |
开启错误钩子函数 |
Shutdown Hook |
开启关闭钩子函数 |
Startup Hook |
开启启动钩子函数 |
OsAlarm界面配置如下:

图 5-2 OsAlarm配置-1¶

图 5-3 OsAlarm配置-2¶
配置项名 |
描述 |
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 |
OsAppMode配置如下:

图5-4 OsAppMode配置¶
配置项名 |
描述 |
OsAppMode |
设置OS的工作模式:OSDEFAULTAPPMODE。 |
OsCounter配置界面如下:

图 5-5 OsCounter配置¶
配置项名 |
描述 |
Max Tick |
设置系统Counter的最大tick值为:65535 Tick。 |
Min Cycle |
设置系统Counter的最小tick值为:1 Tick。 |
OsIsr配置界面如下:

图 5-6 OsIsr配置¶
配置项名 |
描述 |
Category |
配置OS_INT0_IRQn中断为:CATEGORY_2。 |
Stack Size |
设置OS_INT0_IRQn中断的栈空间为:128(单位:4bytes) |
Priority |
设置OS_INT0_IRQn中断的优先级为:1 |
Nested Enable |
设置中断嵌套功能:不开启总的嵌套。 |
OsTask配置界面如下:

图 5-7 OsTask配置-1¶

图 5-8 OsTask配置-2¶
配置项名 |
描述 |
Activation Limit |
设置该任务能被连续激活的次数:允许连续激活1次。 |
Priority |
设置任务的优先级为:1 |
Preemptive Policy |
设置该任务的抢占策略为:FULL |
Stack Size |
设置任务的堆栈为:128(单位:4bytes) |
OsTaskAutostart |
关闭自启动 |
SystemTimer配置界面如下:

图 5-9 SystemTimer配置-1¶

图 5-10 SystemTimer配置-2¶
配置项名 |
描述 |
STM_Frequency[MHZ] |
系统时钟频率:120MHz |
Priority |
设置系统中断的优先级为:10 |
Nest Enable |
设置该系统中断是否支持嵌套功能 |
TickTime[s] |
设置系统中断周期时间为:0.001s |
源代码集成¶
项目交付给用户的工程结构如下:

图 5-11 目录结构-1¶

图 5-12 目录结构-2¶
Config->BSW_Config目录,这个目录用来存放配置工具生成的配置文件。
SystemServices->Os目录,存放Os模块相关的源代码。
协议栈调度集成¶
OS调度集成步骤如下:
协议栈调度集成,需要逐一排查并实现表 4-3协议栈集成约束清单所罗列的问题,以避免集成出现差错。
编译链接代码,将生成的elf文件烧写进芯片。
MCU初始化相关的代码,在下方的main.c文件中给出重点标注。


验证结果¶
当全速运行时,周期任务能够按照周期时间执行,达到了集成目标的要求。
SC3集成示例¶
集成目标
通过配置和集成OS SC3,实现No Trusted Application间数据访问的隔离。
OsApplication子模块配置如下:
Application Name |
OsAppDataMpuRegionSize |
OsAppCodeMpuRegionSize |
Trusted |
Protection |
Application_0 |
MPU_2_KB |
MPU_2_KB |
√ |
× |
Application_1 |
MPU_2_KB |
MPU_2_KB |
× |
N/A |
Application_2 |
MPU_2_KB |
MPU_2_KB |
× |
N/A |
Application_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的限制。
OsTask子模块配置如下:
Task Name |
Stack Size[4Bytes] |
OsTaskMpuRegionSize |
OsTaskAutostart |
OsTask_App0Init |
128 |
MPU_512_BYTES |
OSDEFAULTAPPMODE |
OsTask_App1Init |
128 |
MPU_512_BYTES |
OSDEFAULTAPPMODE |
OsTask_App2Init |
128 |
MPU_512_BYTES |
OSDEFAULTAPPMODE |
OsTask_App3Init |
128 |
MPU_512_BYTES |
OSDEFAULTAPPMODE |
模块的配置¶
OsOS界面配置如下:

图 6-1 OsOS配置¶
OsApplication界面配置如下:

图 6-2 OsApplication配置-1¶

图 6-3 OsApplication配置-2¶

图 6-4 OsApplication配置-3¶
配置项名 |
描述 |
Trusted |
配置Application为Trusted Application |
Protection |
Trusted Application的写权限是否被限制 |
CoreRef |
指定运行该Application的核。 |
OsAppDataMpuRegionSize |
Application下所有数据组合后的对齐策略。 |
OsAppCodeMpuRegionSize |
Application代码对齐策略。 |
OsAppTaskRef |
Application下管理的Task。 |
OsTask界面配置如下:

图 6-5 OsTask配置-1¶

图 6-6 OsTask配置-2¶
图 6-5 OsTask配置-1中的OsTaskMpuRegionSize用于控制生成的链接文件中该Task下所有数据的对齐策略,一般与栈大小保持一致。
源代码的集成¶
SC3下,ORIENTAIS Stuido配置工具会根据编译器生成特定格式的链接文 件,需将链接文件添加至编译工程中;以S32DS-GCC10.2编译器为例,项目OS工具生成的链接文件名为Os_Link.ld,将该文件添加Build过程的方式如 图所示:

图 6-7 S32DS-GCC10.2添加链接文件¶
实现Application_1的变量无法被Application_2访问的限制,需要采用如下方式定义变量:

图 6-8 划分变量时变量声明方式¶
引用的宏符号OS_START_SEC_CORE0_OSAPPLICATION_1_PRI_DATA和OS_STOP_SEC_CORE0_OSAPPLICATION_1_PRI_DATA可以在下图所示的文件Os_Mp_MemMap.h中找到

图 6-9 Os_Mp_MemMap.h生成示例¶
验证结果¶
图 6-10 测试MPU功能中的代码为Application_2下的OsTask_App2Init访问Application_1的私有变量,代码运行图中所示的位置后,MPU会检测到写访问超出访问权限,并触发异常。

图 6-10 测试MPU功能¶
该平台的现象为进入HardFault_Handler,如下图所示;

图 6-11 内存保护异常现象¶
MPU异常触发原因的定位¶
Armv7-M¶
支持的MCU:NXP S32Kxxx, FlagChip FC7300Fx, Cypress
CYTxxx等
内核手册中的描述如下

图 6-12 MPU故障地址寄存器¶
寄存器MMFAR(0xE000ED34),当发生内存保护异常时,该寄存器的会存记 录触发内存保护异常的内存地址;

图 6-13 Armv7-M内存保护异常地址寄存器(S32DS)¶
由于该内核支持硬件上下文保存机制,可以通过暂时删除HardFault中的内容,采用汇编单步运行的方式快速定位到触发异常的指令,但是对于发生在Exception Entry 或者 Exit处的内存保护异常该策略会失效;
对于S32K312平台,当使用PEMicro调试时,会在console窗口输出以下信息协助定位问题;

图 6-14 S32DS + PEMicro的相关Debug支持¶
ARC-EM22FS¶
支持的MCU: Calterah Alps,Alps-Pro
该寄存器指示触发MPU异常的Region Number和访问方式(读、写、执行、内存交换等)

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