2

想象以下 Adc 设置:AdcGroupA 包含三个 AdcChannels AdcCh1、AdcCh2、AdcCh3,如下面的 Adc 配置 (arxml) 所示:

<ECUC-CONTAINER-VALUE>
  <SHORT-NAME>AdcGroupA</SHORT-NAME>
  <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/Adc/AdcConfigSet/AdcHwUnit/AdcGroup</DEFINITION-REF>
  <PARAMETER-VALUES>
...
  </PARAMETER-VALUES>
  <REFERENCE-VALUES>
    <ECUC-REFERENCE-VALUE>
      <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">/Adc/AdcConfigSet/AdcHwUnit/AdcGroup/AdcGroupDefinition</DEFINITION-REF>
      <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/ActiveEcuC/Adc/AdcConfigSet/AdcHwUnit_ADC0/AdcCh1</VALUE-REF>
    </ECUC-REFERENCE-VALUE>
    <ECUC-REFERENCE-VALUE>
      <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">/Adc/AdcConfigSet/AdcHwUnit/AdcGroup/AdcGroupDefinition</DEFINITION-REF>
      <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/ActiveEcuC/Adc/AdcConfigSet/AdcHwUnit_ADC0/AdcCh3</VALUE-REF>
    </ECUC-REFERENCE-VALUE>
    <ECUC-REFERENCE-VALUE>
      <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">/Adc/AdcConfigSet/AdcHwUnit/AdcGroup/AdcGroupDefinition</DEFINITION-REF>
      <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/ActiveEcuC/Adc/AdcConfigSet/AdcHwUnit_ADC0/AdcCh2</VALUE-REF>
    </ECUC-REFERENCE-VALUE>
  </REFERENCE-VALUES>
  <SUB-CONTAINERS>
  </SUB-CONTAINERS>
</ECUC-CONTAINER-VALUE>

在复杂驱动程序或 IoHwAb 中,AdcGroup 可以按如下方式使用:

Adc_ValueGroupType AdcGroupAReadDataBuffer[SIZE_OF_GROUPA];
Adc_StartGroupConversion( AdcGroupA );
…
Std_ReturnType Adc_ReadGroup( AdcGroupA, &AdcGroupAReadDataBuffer[0] );
…
valueAdcCh1 = AdcGroupAReadDataBuffer[IDX_GROUPA_CH1];
valueAdcCh2 = AdcGroupAReadDataBuffer[IDX_GROUPA_CH2];
valueAdcCh3 = AdcGroupAReadDataBuffer[IDX_GROUPA_CH3];

AUTOSAR Adc 规范针对 Adc_ReadGroup [SWS_Adc_00369] 说“组通道值按通道编号升序存储。” 但这里指的是哪个“频道号”?如果我查看一些 Adc 驱动程序的行为,它显然与 AdcChannel.AdcChannelId 无关。因此,我假设该顺序与 AdcGroup 中对 AdcChannels 的引用列表有关。但是:这个列表没有索引或 ID!请参阅上面的 arxml 片段。所以,顺序/排序不是由任何东西决定的。或者是吗?似乎在我的工具链中,顺序由您将 AdcChannel 添加到 AdcGroup 的顺序定义:

#define IDX_GROUPA_CH1 (0u)
#define IDX_GROUPA_CH2 (2u)
#define IDX_GROUPA_CH3 (1u)

由此产生的问题是:如何找出 AdcGroup(数据缓冲区)中的 AdcChannel 使用的索引?是否有为此生成的定义(将替换 IDX_GROUPA_CH?在上面的示例中)?请不要告诉我:“看看 arxml 文件”或“你已经配置好了”。请记住,C 代码的开发人员通常无权访问或许可配置工具链。

4

1 回答 1

0

从需求编号来看,您似乎使用的是 AUTOSAR 4.2 或更高版本,我正在根据相同起草我的答案,大多数情况下它可能在所有 4.X 变体中都是相同的。请注意,我是根据纯 AUTOSAR 要求进行解释的,有时同一芯片供应商可能会有所不同,

首先,与通道 ID 没有关系,通常使用带有通道 ID 的宏来表示配置的通道。获取转换结果的方式还取决于配置参数AdcGroupAccessModeAdcStreamingNumSamples。请考虑以下示例,

例子:-

配置示例由三个 ADC 组组成。

  1. 组 1 ==> 具有 2 个 Adc 通道,AdcGroupAccessMode = ADC_ACCESS_MODE_STREAMINGAdcStreamingNumSamples = 3。
  2. 第 2 组==> 具有 1 个 Adc 通道,AdcGroupAccessMode = ADC_ACCESS_MODE_STREAMINGAdcStreamingNumSamples = 2。
  3. 第 3 组==> 具有 1 个 Adc 通道,AdcGroupAccessMode = ADC_ACCESS_MODE_SINGLE和(默认情况下,当参数 AdcGroupAccessMode = ADC_ACCESS_MODE_SINGLE 时 AdcStreamingNumSamples = 1)。

请考虑下面给出的图像。

示例配置示例

用户/应用程序需要在开始转换之前为每个 ADC 组初始化 Adc_SetupResultBuffer()。用户/应用程序有责任证明缓冲区中有足够的内存来存储所有转换后的数据。其分配如下图所示,

设置结果缓冲区 示例内存分配

当您调用 Adc_ReadGroup() API 时,ADC 驱动程序会将最新结果从应用程序结果缓冲区复制到应用程序读取组缓冲区,为了更清楚应用程序结果缓冲区是您使用 Adc_SetupResultBuffer() 设置的缓冲区,以及应用程序读取组缓冲区是您在调用 Adc_ReadGroup() API 时传递的缓冲区。请看下图以使理解更清楚。

Adc_ReadGroup 数据处理的内存分配。

您也可以在不使用额外缓冲区的情况下获取结果,因此您可以使用 API Adc_GetStreamLastPointer,此 API 仅返回最新的应用程序结果缓冲区(它是组中第一个通道的结果缓冲区,如果启用流式传输,则在完成一个周期后),第一次看起来有点复杂,但是一旦您了解了结果如何存储在内存中,访问 ADC 转换结果的非常简单和优化的方式。请参阅下面提到的图表以更好地理解。

Adc_GetStreamLastPointer 数据处理的内存分配。

孔这会让你更清楚......

但是,这些信息在 4.2.2 的 AUTOSAR SWS 中也可以在第 7.1.3 节中找到,如果不清楚,请查看相同的内容。

BR,杰​​里·詹姆斯

于 2017-10-16T02:56:26.707 回答