新建ETAS工程:
-
创建空工程
-
导入EBC
-
新建Component,并加入TopLevelComposition
-
创建System,设置System Category为SYSTEM_DESCRIPTION
-
在System下创建Mapping
-
System用MappingEditor打开,设置Root Composition,新建Partition,将新建的Component加入Partition
-
做EcuadorExtract。如果想删除已有的EcuExtract,可以删除工程里的XXX_FlatMap.arxml / XXX_FlatView_SWCD.arxml / System_XX_EcuExtract.arxml
-
Generate ECU Configuration
-
EcuC中创建多个EcucPatition,OS中设置多核,然后生成Bsw的时候会给每个核生成一个EcuM模块。EcucPartition_0的BswModuleExcution设置为True,其余设置为False。
-
OS 中创建多个OsApplication,OsApplication中引用EcucPartition。
-
生成Bsw.
-
System中创建多个EcuPatition,然后把Component mapping到Partition上。
-
Ecu抽取
-
创建OSTask并关联OsApplication
-
Runable匹配给Task
-
生成RTE
新建多核工程跑不起来可能的原因:
- 有些多核共享的变量存放在某个核独享的RAM或Flash中,导致程序运行过程中数据访问失败。
- 链接脚本中Flash、RAM的地址和大小与芯片实际大小不一致,导致程序编译出来的地址有误。
- OS运行起来后,需要有一个自动运行的Init Task,用来执行初始化流程,启动RTE,启动OS调度表。
关于RTAOS的中断配置
Category1
Category1的中断不经OS,直接由MCU处理。该类型中断寄存器的初始化由OS执行,OS在中断向量表中不会为其生成中断向量,即中断向量表中该位置的中断向量是空的,需要在代码中手动定义中断处理函数,demo如下:
CAT1_ISR(ISR_Name)
{
/* ISR handler */
}
CAT1_ISR的定义:
#define CAT1_ISR(x) void __interrupt(OS_ISRVEC_##x) \
__vector_table(OS_TABLE_##x) \
__bisr_(OS_CCPN_##x) x(void) /* [$TargetTT 96] [$TgtCore 55] */
OS会为每个配置的Category1中断生成优先级宏定义,如下:
#define OS_ISRVEC_TOM0IrqGtmTOMSR1 (8U)
#define OS_CCPN_TOM0IrqGtmTOMSR1 (8U)
#define OS_TABLE_TOM0IrqGtmTOMSR1 (0U)
#define OS_ISRVEC_CanIrqCanSR4 (9U)
#define OS_CCPN_CanIrqCanSR4 (9U)
#define OS_TABLE_CanIrqCanSR4 (0U)
#define OS_ISRVEC_CanIrqCanSR5 (10U)
……
如果使用MCAL自带的中断处理代码,需要注意MCAL中配置的中断优先级要和OS 生成 的中断优先级一致,注意这里是生成而不是配置,因为在ETAS的RTAOS中,配置的中断优先级只是一个相对的中断优先级,只表征中断优先级的高低,生成代码时会自动对所有中断进行排序,按顺序重新生成中断优先级数值。
Category2
Category2的中断由OS统一处理,中断触发时会进入统一的OS中断处理函数,在该函数中根据OS中配置的中断名称调用相应的中断处理函数。OS会为该类型中断在中断向量表中生成中断向量,统一指向OS中断处理函数。如果使用MCAL的中断处理代码,这种情况下MCAL中配置的优先级是不起作用的,以OS中配置的为准。