如何在AdcGroup数据缓冲区中访问AdcChannel的数据

时间:2017-09-04 10:08:18

标签: autosar

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

<div id="app">
  <div class="left"></div>
  <div class="right">
    <div class="msg"></div>
    <div class="editor-wrap">
      <div class="editor" contenteditable="true">How can I wrap long lines here?</div>
    </div>
  </div>
</div>

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

<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>

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

结果问题是:如何找出AdcGroup(数据缓冲区)中AdcChannel使用的索引?是否有任何生成的定义(将替换IDX_GROUPA_CH?In上面的例子)? 请不要告诉我:“查看arxml文件”或“正如您配置它”。请记住,C代码的开发人员通常无法访问Configuration-Tool-Chain。

1 个答案:

答案 0 :(得分:0)

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

首先,与通道ID无关,通常使用通道ID的宏来表示配置的通道。 获得转化结果的方式还取决于配置参数 AdcGroupAccessMode AdcStreamingNumSamples 。请考虑以下示例,

示例: -

配置示例包含三个ADC组。

  1. 第1组 ==&gt;使用2个Adc频道, AdcGroupAccessMode = ADC_ACCESS_MODE_STREAMING AdcStreamingNumSamples = 3。
  2. 第2组 ==&gt;使用1个Adc频道, AdcGroupAccessMode = ADC_ACCESS_MODE_STREAMING AdcStreamingNumSamples = 2。
  3. 第3组 ==&gt;使用1个Adc频道, AdcGroupAccessMode = ADC_ACCESS_MODE_SINGLE 和(默认情况下,当参数AdcGroupAccessMode = ADC_ACCESS_MODE_SINGLE时,AdcStreamingNumSamples = 1。)
  4. 请考虑下面给出的图像。

    Sample Configuration Example

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

    Setup result buffer Sample memory allocation

    当您调用Adc_ReadGroup()API时,ADC驱动程序会将应用程序结果缓冲区中的最新结果复制到应用程序读取组缓冲区中,以使其更清晰应用程序结果缓冲区是您设置的缓冲区使用Adc_SetupResultBuffer(),应用程序读取组缓冲区是您在调用Adc_ReadGroup()API时传递的缓冲区。请参阅下图以明白这一点。

    Memory allocation for Adc_ReadGroup data processing.

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

    Memory allocation for Adc_GetStreamLastPointer data processing.

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

    这些信息如何在第7.1.3节的4.2.2的AUTOSAR SWS中也可用,如果不清楚,请通过相同的信息。

    BR,Jerry James