你好,团队、
李尔的问题如下
-------------------------------------------------------------------------------------
我们正在单核 ECU (S32K311) 上实施多分区,在 SPI 驱动程序初始化过程中遇到了一个问题。
观察结果:
SPI 驱动程序调用 OsIf_timer.c 中的 OsIf_GetPartitionID(),以获取当前分区 ID 并将其用作 SpiID。但是,该 ID 与 SpiCorePartitionUse 中的值不匹配,尽管两者都是为同一个 ECUC 分区配置的。由于这种不匹配,驱动程序会触发信号 DET 错误,无法初始化外围设备。
调试时发现的问题:
函数 OsIf_apxMultiPartitionPredefinedConfig 返回一个 SPI 驱动程序不期望的值。这似乎是造成不匹配的原因。
初步分析表明,该问题可能与 Vector DaVinci/Tresos 工具的配置生成有关。
影响
SPI 在多分区模式下无法完成初始化,导致通信功能受阻。
-------------------------------------------------------------------------------------
BR
Stefano
因为他们提到了OsIf_apxMultiPartitionPredefinedConfig,所以我认为他们使用的是 ASR OS。
那么,在这种情况下,函数 GetApplicationID() 返回的是什么值?
请将它们的配置发送给我,包括EcuC、Os、Spi、BaseNXP。
生成以下结构的输出
他们使用的是什么软件包?
顺祝商祺!
Nhi
请帮助我读取 SPI_Init() 函数中的以下参数:
- SpiId?
- 他们向函数 Spi_Init() 传递了什么配置?
像这样:
顺祝商祺!
Nhi
您好 Nhi_Nguyen,
请告诉我附件是否足够。
BR
Stefano
您好 Nhi_Nguyen,
李尔回答道:
Spi_Init(&Spi_Config_EcucPartition_C0_B);
这是我们在 Init 函数中传递的信息,SPI_ID 从分区 ID api 中读取,但没有正确链接到操作系统应用程序 ID。
BR
Stefano
这是他们申请中的操作系统:
他们将Spi_Config_EcucPartition_C0_B传递给了Spi_Init(),因此 SPI_ID 必须是下面的值:
在这种情况下,u32AppId 必须为 1 才不会出现 Det 错误。但 OS_GetApplicationID() 函数属于 RTOS 而非 RTD,因此请标记 RTOS,以便有人能帮助获取该函数。
顺祝商祺!
Nhi
您好 Nhi_Nguyen,
下面是李尔的答复:
在我们的案例中,SPI ID 和操作系统应用程序不匹配。我们认为,就 ASIL 而言,它应该返回 1,但它却返回 0,导致配置不匹配。请看下面的快照。
如果你愿意,我们可以开个短会,我可以向你详细介绍。
BR
Stefano
我不知道 RTOS 是如何工作的,也不知道在 RTOS 中如何从函数 GetCurrentApplicationID() 返回值。但如果想保持 u32AppID = 0 为当前值,避免出现 Det 错误,则可以按下面的方法操作:
然后,生成的文件是
这意味着,如果 u32AppId = 0,SpiID = 0;
u32AppId = 1,SpiID = 1;
在 SPI 中,生成的文件是
这意味着 Spi_Config_EcucPartition_C0_QM->u32SpiCorePartitionUse = 1;
Spi_Config_EcucPartition_C0_B->u32SpiCorePartitionUse = 0;
在另一种情况下,他们想将 u32AppID 更改为其他值,那么@StefanoGattazzo请添加 RTOS 标记并移除 RTD 标记,以便 RTOS 的人员可以帮助您。
顺祝商祺!
Nhi
抱歉,我对此一无所知。
顺祝商祺!
Nhi
HI Nhi_Nguyen,
我能问谁?
BR
Stefano
请删除 RTD,我看到您添加了 RTOS 标签,我们团队会有人回答您的问题。
顺祝商祺!
Nhi
您好 Nhi_Nguyen,
如果您认识某个人,我可以直接询问--现在情况紧急。
BR
Stefano
你好,团队、
李尔正在写作:
不,我们使用的不是恩智浦操作系统,而是矢量操作系统。OSIF 参考来自基础元器件。
我们目前正在开发一个 POC,其中 SPI 驱动程序被分区,这样 LPSPI2 是专用的,用于质量管理应用程序,而其余的 LPSPI 模块则用于 ASIL B 应用程序。
根据 RTD 用户手册,这要求每个分区分别调用两次 Spi_Init()。因此,我们首先从 ASIL B Os Application 调用 Spi_Init()函数,然后再从 QM Os Application 调用 Spi_Init()函数,并为每个函数传递正确的配置指针。
我们看到,在 Spi_Init()函数中调用了 Spi_GetID(),然后又调用了 GetCurrentApplicationID()(如下截图所示)
下面是 Os 生成的枚举。ASIL B Os 应用程序调用 GetCurrentApplicationID() 时,返回 0。 QM Os 应用程序调用 GetCurrentApplicationID() 时,返回 1。
在 OsIf_GetPartitionID 中,Os 返回的值用于获取在数组 OsIf_apxMultiPartitionPredefinedConfig 中配置的分区编号。
OsIf_apxMultiPartitionPredefinedConfig 中的值如下
当 QM 应用程序调用 Spi_Init()时,Spi_GetID() 返回的值为 1(GetCurrentApplicationID() 返回 1,OsIf_apxMultiPartitionPredefinedConfig 的索引 1 也是 1)。
但生成的 SPI 配置不符合预期值,Det 会收到错误报告。
是什么影响了 MCAL 在 Spi_Config 和 OsIf_apxMultiPartitionPredefinedConfig 中生成的值?
BR
Stefano
以下是我从您所附项目中获得的配置 Spi、Ecu、Os。
EcuC 用于定义分区 ID,例如在他们的配置中,QM 是 0 分区,C0_B 是 1 分区,System 是 2 分区。
然后,Os 选择从 EcuC 获取分区 ID 的分区。例如
SPI:C0_B 为分区 1,C0_M 为分区 0。
操作系统:结构 OsIf_apxMultiPartitionPredefinedConfig 也指 EcuC 中的分区 ID。例如,在他们的配置中:
应用程序 0 - 系统 - 分区 2;
应用 1 - C0_B - 分区 1;
应用 2 - C0_M - 分区 0;
因此,如果要将 C0_B 传递给 Spi_Init(),也就是将分区 1 传递给 Spi_Init(),那么 OsIf_apxMultiPartitionPredefinedConfig[x] = 1; 或者 x = 1; x = GetCurrentApplicationID();
所以,有了他们在最新回复中展示的照片:
在 Spi 中,C0_B 是分区 1;
C0_M 是分区 2;
这意味着,在 EcuC 中,索引 0 是系统分区;索引 1 是 C0_B 分区;索引 2 是 C0_M 分区。
总之,根据 Os、Spi、EcuC 的上述定义,他们可以调整分区配置以避免 Det 错误。
顺祝商祺!
Nhi