Emrah Duatepe Ответов: 1

Генерация кода Matlab и malloc на MCU


Здравствуйте друзья,

Я удивляюсь этой ситуации.
У меня есть несколько таких кодов.Как вы видите ,эти коды включают malloc и calloc ,и я никогда не буду использовать free() в MCU, в этом случае можно ли использовать этот код в моем проекте?

Что я уже пробовал:

<pre> 

for(int i=0;i<4096;i++)
   {
      m[i] = qSin(2*3.14*50*t) + sin(2*3.14*100*t) + 2*qrand()/(RAND_MAX);
      t = t + ts;
   }
   emxArray_real_T *Mshifted,*f; 

   emxInit_real_T(&Mshifted, 2);
   emxInit_real_T(&f, 2);
   emxEnsureCapacity((emxArray__common *)Mshifted, 0, (int32_T)sizeof(real_T));
   emxEnsureCapacity((emxArray__common *)f, 0, (int32_T)sizeof(real_T));
    Func1(m,ts,df,Mshifted,f);


void emxInit_real_T(emxArray_real_T **pEmxArray, int numDimensions)
{
  emxArray_real_T *emxArray;
  int i;
  *pEmxArray = (emxArray_real_T *)malloc(sizeof(emxArray_real_T));
  emxArray = *pEmxArray;
  emxArray->data = (double *)NULL;
  emxArray->numDimensions = numDimensions;
  emxArray->size = (int *)malloc((unsigned int)(sizeof(int) * numDimensions));
  emxArray->allocatedSize = 0;
  emxArray->canFreeData = true;
  for (i = 0; i < numDimensions; i++) {
    emxArray->size[i] = 0;
  }
}


void emxEnsureCapacity(emxArray__common *emxArray, int oldNumel, int elementSize)
{
  int newNumel;
  int i;
  void *newData;
  newNumel = 1;
  for (i = 0; i < emxArray->numDimensions; i++) {
    newNumel *= emxArray->size[i];
  }

  if (newNumel > emxArray->allocatedSize) {
    i = emxArray->allocatedSize;
    if (i < 16) {
      i = 16;
    }

    while (i < newNumel) {
      i <<= 1;
    }

    newData = calloc((unsigned int)i, (unsigned int)elementSize);
    if (emxArray->data != NULL) {
      memcpy(newData, emxArray->data, (unsigned int)(elementSize * oldNumel));
      if (emxArray->canFreeData) {
        free(emxArray->data);
      }
    }

    emxArray->data = newData;
    emxArray->allocatedSize = i;
    emxArray->canFreeData = true;
  }
}

Dave Kreskowiak

Ваш вопрос на самом деле не отвечает. Мы понятия не имеем, подходит ли этот код для тех целей, для которых вы его собираетесь использовать.

Но если вы используете malloc и calloc, но никогда не освобождаете память, вы, вероятно, собираетесь запустить микро из памяти или любую другую машину, если на то пошло, если код работает достаточно долго и вы выделяете память внутри цикла.

Emrah Duatepe

Я имею в виду , что функция malloc и calloc вызывают фрагментацию, если освободить() эту память.Если я использую этот код, если только он не свободен().Интересно, столкнусь ли я с какой-нибудь проблемой?

Dave Kreskowiak

Это невозможно сказать, пока вы на самом деле не напишете код вокруг этого и не протестируете его в своей собственной ситуации.

Просто взглянув на то, что вы разместили, никто не сможет сказать вам, будет ли это работать в вашем собственном проекте.

Emrah Duatepe

Ладно ,спасибо за информацию.

1 Ответов

Рейтинг:
5

Gerry Schmitz

Вы не должны использовать код, который вы "не понимаете".

Именно так вы внедряете вредоносное ПО в свою систему.