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

В настоящее время я внедряю устаревший код C в S-функции C MEX в MATLAB / Simulink (R2017b).Я уже поместил дубликат записи в Запись в 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-функции, как в следующем сегменте кода:

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 Code , который вызывается в C S-функциях.Кто-нибудь уже знает, что такой синтаксический анализатор и генератор кода существует?

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...