Как получить доступ к данным AdcChannel в буфере данных AdcGroup

Представьте себе следующую настройку 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. Поэтому я предполагаю, что порядок связан со списком ссылок на AdcChannels в AdcGroup. НО: этот список не имеет индекса или идентификатора! См. Фрагмент arxml выше. Итак, порядок / сортировка ничем не определяется. Либо это? Похоже, что в моей инструментальной цепочке порядок определяется последовательностью добавления AdcChannels в AdcGroup:

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

В результате возникает вопрос: Как мне узнать, какой индекс используется для AdcChannel в AdcGroup (буфере данных)? Есть ли сгенерированное определение для этого (которое заменило бы IDX_GROUPA_CH? В приведенном выше примере )? И, пожалуйста, не говорите мне: «посмотрите файл arxml» или «как вы его настроили». Имейте в виду, что разработчики C-кода часто не имеют доступа или лицензии на Configuration-Tool-Chain.


person Oliver Scheid    schedule 04.09.2017    source источник


Ответы (1)


из номера требования кажется, что вы используете AUTOSAR версии 4.2 или выше, я составляю свой ответ на основе того же, в основном он может быть одинаковым для всех вариантов 4.X. обратите внимание, что я объясняю, основываясь на чистом требовании AUTOSAR, иногда оно может отличаться для одних и тех же поставщиков чипов,

Прежде всего, не было никакой связи с идентификатором канала, и обычно макрос с идентификатором канала использовался для представления настроенного канала. Способ получения результата преобразования также зависит от параметра конфигурации AdcGroupAccessMode и AdcStreamingNumSamples. Пожалуйста, рассмотрите следующий пример,

Пример: -

Пример конфигурации состоит из трех групп АЦП.

  1. Группа 1 ==> с 2 каналами Adc, AdcGroupAccessMode = ADC_ACCESS_MODE_STREAMING и AdcStreamingNumSamples = 3.
  2. Группа 2 ==> с 1 каналом Adc, AdcGroupAccessMode = ADC_ACCESS_MODE_STREAMING и AdcStreamingNumSamples = 2.
  3. Группа 3 ==> с 1 каналом Adc, AdcGroupAccessMode = ADC_ACCESS_MODE_SINGLE и (по умолчанию AdcStreamingNumSamples = 1, если параметр AdcGroupAccessMode = ADC_ACCESS_MODE_SINGLE).

Пожалуйста, обратите внимание на изображение, приведенное ниже.

Образец примера конфигурации

Пользователь / приложение должны инициализировать Adc_SetupResultBuffer () для каждой группы АЦП перед началом преобразования. И пользователь / приложение обязаны доказать, что в буфере достаточно памяти для хранения всех преобразованных данных. Его размещение описано на изображении ниже,

Пример выделения памяти в буфере результатов настройки

Когда вы вызываете Adc_ReadGroup () API, драйвер ADC копирует последние результаты из буфера результатов приложения в буфер группы чтения приложения. Чтобы сделать его более понятным, буфер результатов приложения - это буфер, который вы настраиваете с помощью Adc_SetupResultBuffer ( ), а буфер группы чтения приложения - это буфер, который вы передали при вызове API Adc_ReadGroup (). пожалуйста, посмотрите диаграмму ниже, чтобы прояснить понимание.

Выделение памяти для обработки данных Adc_ReadGroup.

Вы также можете получить результат без использования дополнительного буфера, так же как вы можете использовать API Adc_GetStreamLastPointer, этот API просто возвращает последний буфер результатов приложения (это буфер результатов первого канала в группе, после завершения одного цикла, если включена потоковая передача). Это кажется немного сложным в первый раз, но как только вы поймете, как результаты сохраняются в памяти, это очень простой и оптимизированный способ доступа к результату, преобразованному АЦП. Для лучшего понимания см. Схему, приведенную ниже.

Выделение памяти для обработки данных Adc_GetStreamLastPointer.

Отверстия это прояснит ...

Однако эта информация также доступна в AUTOSAR SWS 4.2.2 в разделе 7.1.3. Пожалуйста, пройдите то же самое, если это не ясно.

BR, Джерри Джеймс

person HateStackOverFlow    schedule 16.10.2017
comment
Спасибо за ссылку на спецификацию AR. Но, к сожалению, это не ответ на мой вопрос. - person Oliver Scheid; 18.10.2017