MATLAB/Simulink - C MEX S-функция: преобразование между сигналом шины и устаревшей структурой C с использованием указателей

В настоящее время я внедряю устаревший код C в S-функции C MEX в MATLAB/Simulink (R2017b). Я уже разместил двойную запись в Entry на MathWorks-MATLAB. Унаследованные функции принимают в качестве указателя общего правила структуры, включающие указатель на дополнительные структуры, например, унаследованный код:

func.h:

typedef struct {
  double*       param;
}T_DATA_1;

typedef struct {
  double        in;
  double        out;
  T_DATA_1*     pParam;
}T_DATA_2;

func.c:

void func(T_DATA_2 *pData){
  pData->out = pData->in + *(pData->pParam->param);
}

Я уже знаю, что могу обернуть вручную, например, сигнал входной шины в унаследованную структуру в функции C S, как в следующем фрагменте кода:

void wrap_BussignalToLegacy(T_DATA_2 *pLegacy, T_DATA_2__BUSOBJ *pInput){
    pLegacy->in                  = pInput->in;
    pLegacy->out                 = pInput->out;
    *(pLegacy->pParam->param)    = pInput->pParam.param;
}

с соответствующей структурой для сигнала шины, удаляющей все объявления указателя.

typedef struct {
      double       param;
}T_DATA_1__BUSOBJ;

typedef struct {
      double        in;
      double        out;
      T_DATA_1      pParam;
}T_DATA_2__BUSOBJ;

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

Использование этого метода вручную просто отлично работает, но для случая, когда структуры становятся больше с увеличением количества указателей на дальнейшие структуры, потребуется огромное время для написания соответствующих оболочек сигналов.

Одна идея заключается в написании синтаксического анализатора MATLAB, который анализирует устаревшие структуры и генерирует C-код, который вызывается в C S-функциях. Кто-нибудь уже знает, что такой парсер и генератор кода существует?

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

Запись в стеке потока Обмен данными между несколькими s-функциями c mex дает хороший обзор двух подходов, но в нем отсутствует генерация кода, которая потребуется в будущем. Кто-нибудь знает дальнейшие обходные пути для обработки устаревших структур указателей, включая указатель на дальнейшие структуры?

Спасибо за любой ответ и помощь!

0 ответов

Другие вопросы по тегам