возможно ли динамическое изменение нескольких значений по конвейеру в переменной C? - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь придумать, как изменить определения активных слотов в ВОФК. блок определения аудио, написанный на C.

#define ACTIVE_TDM_SLOTS 1|2|3|4|5|6|7|8

числа представляют собой значения uint32_t, используемые в этой структуре, которые при наличии активируют звуковые слоты TDM на микроустройстве.

typedef struct{ 
  uint32_t FirstBitOffset;                            
  uint32_t SlotSize;        
  uint32_t SlotNumber;                           
  uint32_t SlotActive;  
}SAI_SlotInitTypeDef;

Я пытаюсь придумать способ динамического изменения структуры ACTIVE_TDM_SLOTS в зависимости от того, какие каналы должны быть активными. 256 возможных комбинаций активных каналов. Я могу инициировать и деинсталлировать аппаратные слоты, чтобы изменить конфигурацию активных слотов.

Я предполагаю, что #define #ifdef/#endef все препроцессорные, поэтому мне нужно как-то использовать переменные?

Я мог бы создать строку из желаемых активных каналов для ACTIVE_TDM_SLOTS, но как загрузить это в переменную? можно использовать группу char * var и объединить их в переменную?

Я не совсем уверен, как работают трубы с определением на 1-м месте! возможно, просто невозможно загрузить это в переменную?

Мое другое решение будет фильтровать данные активного слота из прямого доступа к памяти по мере его поступления, но при этом будет более целесообразно активировать или деактивировать требуемые слоты?

Рад загрузить больше кода, если это полезно.

1 Ответ

0 голосов
/ 19 марта 2019

хорошо, я думаю, что пропустил одну очевидную вещь.

SAI_SLOT_NOTACTIVE 0;

Я просто назначаю 0 для |переменные uint32_t |которые не активны.Я думал, что должен был удалить слот в списке slotActive!

Я отправлю обратно, если это сработает, на случай, если это смущает любого, кто пытается динамически изменить конфигурацию аудио-слота SAI TDM на ARM STM32xxx

оригинальное определение

     /* SAI_Block_Slot_Active SAI Block Slot Active */
        #define SAI_SLOT_NOTACTIVE           ((uint32_t)0x00000000U)
        #define SAI_SLOTACTIVE_0             ((uint32_t)0x00000001U)
        #define SAI_SLOTACTIVE_1             ((uint32_t)0x00000002U)
        #define SAI_SLOTACTIVE_2             ((uint32_t)0x00000004U)
        #define SAI_SLOTACTIVE_3             ((uint32_t)0x00000008U)
        #define SAI_SLOTACTIVE_4             ((uint32_t)0x00000010U)
        #define SAI_SLOTACTIVE_5             ((uint32_t)0x00000020U)
        #define SAI_SLOTACTIVE_6             ((uint32_t)0x00000040U)
        #define SAI_SLOTACTIVE_7             ((uint32_t)0x00000080U)
        #define SAI_SLOTACTIVE_8             ((uint32_t)0x00000100U)
        #define SAI_SLOTACTIVE_9             ((uint32_t)0x00000200U)
        #define SAI_SLOTACTIVE_10            ((uint32_t)0x00000400U)
        #define SAI_SLOTACTIVE_11            ((uint32_t)0x00000800U)
        #define SAI_SLOTACTIVE_12            ((uint32_t)0x00001000U)
        #define SAI_SLOTACTIVE_13            ((uint32_t)0x00002000U)
        #define SAI_SLOTACTIVE_14            ((uint32_t)0x00004000U)
        #define SAI_SLOTACTIVE_15            ((uint32_t)0x00008000U)
        #define SAI_SLOTACTIVE_ALL           ((uint32_t)0x0000FFFFU)

пример с каналом 1 2 3 4, перенаправленным на первые 4 слота записи и с каналом 5 6 7 8 отключенным

изменение номера канала на используемое количество слотов

 /* TDM record slot assign to channel or deactivate any TDMx value 0 to disable slot */ 
        uint32_t TDM1 = SAI_SLOTACTIVE_0; 
        uint32_t TDM2 = SAI_SLOTACTIVE_1;
        uint32_t TDM3 = SAI_SLOTACTIVE_2;
        uint32_t TDM4 = SAI_SLOTACTIVE_3;
        uint32_t TDM5 = SAI_SLOT_NOTACTIVE;
        uint32_t TDM6 = SAI_SLOT_NOTACTIVE;
        uint32_t TDM7 = SAI_SLOT_NOTACTIVE;
        uint32_t TDM8 = SAI_SLOT_NOTACTIVE;

haudio_out_sai.SlotInit.SlotActive = TDM1 | TDM2 | TDM3 | TDM4 | TDM5 | TDM6 | TDM7 | TDM8;

haudio_out_sai.SlotInit.SlotNumber = 4;
...