Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MATLAB Simulink
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
TigerSHARC
Заинтересовала такая фишка как генерация кода из MATLAB в C. Хочется увидеть просто пример для понимания сути. Например Принятие данных с COM-порта, получение результата FFT над принятым массивом и вывод результата на дисплей(или другой порт). И всё это из модели Simulink.
Возможно кто-то встречал...
des00
ЕМНИП там стандартная демка есть, получение сигнала со звуковой карты, его обработка и отображение.
TigerSHARC
В Simulink есть блоки SPI, I2C и прочих перефирийных модулей. Но всё для C2000 серии от TI. Можно самому как-то добавить блоки для процессора который интересует? (например мне нужно для SHARC)
TigerSHARC
Конкретный вопрос для понимания. На модели размещён всего один элемент: интегратор. Нужно получить функцию выполняющую интегрирование сигнала (функцию в C-виде).
Как сгенерировать эту функцию?

Например я после генерации кода из такой просто модели получил кучу с и h - файлов. Вот код одного из них:
CODE
/*
* untitled1.c
*
* Code generation for model "untitled1".
*
* Model version : 1.0
* Simulink Coder version : 8.2 (R2012a) 29-Dec-2011
* C source code generated on : Wed Oct 31 15:34:30 2012
*
* Target selection: grt.tlc
* Note: GRT includes extra infrastructure and instrumentation for prototyping
* Embedded hardware selection: Analog Devices->SHARC
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "untitled1.h"
#include "untitled1_private.h"

/* Real-time model */
RT_MODEL_untitled1 untitled1_M_;
RT_MODEL_untitled1 *const untitled1_M = &untitled1_M_;
static void rate_monotonic_scheduler(void);
time_T rt_SimUpdateDiscreteEvents(
int_T rtmNumSampTimes, void *rtmTimingData, int_T *rtmSampleHitPtr, int_T
*rtmPerTaskSampleHits )
{
rtmSampleHitPtr[1] = rtmStepTask(untitled1_M, 1);
UNUSED_PARAMETER(rtmNumSampTimes);
UNUSED_PARAMETER(rtmTimingData);
UNUSED_PARAMETER(rtmPerTaskSampleHits);
return(-1);
}

/* rate_monotonic_scheduler */
static void rate_monotonic_scheduler(void)
{
/* Compute which subrates run during the next base time step. Subrates
* are an integer multiple of the base rate counter. Therefore, the subtask
* counter is reset when it reaches its limit (zero means run).
*/
(untitled1_M->Timing.TaskCounters.TID[1])++;
if ((untitled1_M->Timing.TaskCounters.TID[1]) > 63999) {/* Sample time: [1.0s, 0.0s] */
untitled1_M->Timing.TaskCounters.TID[1] = 0;
}
}

/* Model step function for TID0 */
void untitled1_step0(void) /* Sample time: [1.5625E-5s, 0.0s] */
{
{ /* Sample time: [1.5625E-5s, 0.0s] */
rate_monotonic_scheduler();
}

/* Matfile logging */
rt_UpdateTXYLogVars(untitled1_M->rtwLogInfo, (untitled1_M->Timing.t));

/* Update absolute time */
/* The "clockTick0" counts the number of times the code of this task has
* been executed. The absolute time is the multiplication of "clockTick0"
* and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
* overflow during the application lifespan selected.
* Timer of this task consists of two 32 bit unsigned integers.
* The two integers represent the low bits Timing.clockTick0 and the high bits
* Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
*/
if (!(++untitled1_M->Timing.clockTick0)) {
++untitled1_M->Timing.clockTickH0;
}

untitled1_M->Timing.t[0] = untitled1_M->Timing.clockTick0 *
untitled1_M->Timing.stepSize0 + untitled1_M->Timing.clockTickH0 *
untitled1_M->Timing.stepSize0 * 4294967296.0;
}

/* Model step function for TID1 */
void untitled1_step1(void) /* Sample time: [1.0s, 0.0s] */
{
/* (no output/update code required) */
}

void untitled1_step(int_T tid)
{
switch (tid) {
case 0 :
untitled1_step0();
break;

case 1 :
untitled1_step1();
break;

default :
break;
}
}

/* Model initialize function */
void untitled1_initialize(void)
{
/* Registration code */

/* initialize non-finites */
rt_InitInfAndNaN(sizeof(real_T));

/* initialize real-time model */
(void) memset((void *)untitled1_M, 0,
sizeof(RT_MODEL_untitled1));

/* Initialize timing info */
{
int_T *mdlTsMap = untitled1_M->Timing.sampleTimeTaskIDArray;
mdlTsMap[0] = 0;
mdlTsMap[1] = 1;
untitled1_M->Timing.sampleTimeTaskIDPtr = (&mdlTsMap[0]);
untitled1_M->Timing.sampleTimes = (&untitled1_M->Timing.sampleTimesArray[0]);
untitled1_M->Timing.offsetTimes = (&untitled1_M->Timing.offsetTimesArray[0]);

/* task periods */
untitled1_M->Timing.sampleTimes[0] = (1.5625E-5);
untitled1_M->Timing.sampleTimes[1] = (1.0);

/* task offsets */
untitled1_M->Timing.offsetTimes[0] = (0.0);
untitled1_M->Timing.offsetTimes[1] = (0.0);
}

rtmSetTPtr(untitled1_M, &untitled1_M->Timing.tArray[0]);

{
int_T *mdlSampleHits = untitled1_M->Timing.sampleHitArray;
int_T *mdlPerTaskSampleHits = untitled1_M->Timing.perTaskSampleHitsArray;
untitled1_M->Timing.perTaskSampleHits = (&mdlPerTaskSampleHits[0]);
mdlSampleHits[0] = 1;
untitled1_M->Timing.sampleHits = (&mdlSampleHits[0]);
}

rtmSetTFinal(untitled1_M, 10.0);
untitled1_M->Timing.stepSize0 = 1.5625E-5;

/* Setup for data logging */
{
static RTWLogInfo rt_DataLoggingInfo;
untitled1_M->rtwLogInfo = &rt_DataLoggingInfo;
}

/* Setup for data logging */
{
rtliSetLogXSignalInfo(untitled1_M->rtwLogInfo, (NULL));
rtliSetLogXSignalPtrs(untitled1_M->rtwLogInfo, (NULL));
rtliSetLogT(untitled1_M->rtwLogInfo, "tout");
rtliSetLogX(untitled1_M->rtwLogInfo, "");
rtliSetLogXFinal(untitled1_M->rtwLogInfo, "");
rtliSetSigLog(untitled1_M->rtwLogInfo, "");
rtliSetLogVarNameModifier(untitled1_M->rtwLogInfo, "rt_");
rtliSetLogFormat(untitled1_M->rtwLogInfo, 0);
rtliSetLogMaxRows(untitled1_M->rtwLogInfo, 1000);
rtliSetLogDecimation(untitled1_M->rtwLogInfo, 1);
rtliSetLogY(untitled1_M->rtwLogInfo, "");
rtliSetLogYSignalInfo(untitled1_M->rtwLogInfo, (NULL));
rtliSetLogYSignalPtrs(untitled1_M->rtwLogInfo, (NULL));
}

untitled1_M->solverInfoPtr = (&untitled1_M->solverInfo);
untitled1_M->Timing.stepSize = (1.5625E-5);
rtsiSetFixedStepSize(&untitled1_M->solverInfo, 1.5625E-5);
rtsiSetSolverMode(&untitled1_M->solverInfo, SOLVER_MODE_MULTITASKING);

/* Matfile logging */
rt_StartDataLoggingWithStartTime(untitled1_M->rtwLogInfo, 0.0, rtmGetTFinal
(untitled1_M), untitled1_M->Timing.stepSize0, (&rtmGetErrorStatus
(untitled1_M)));

/* Initialize Sizes */
untitled1_M->Sizes.numContStates = (0);/* Number of continuous states */
untitled1_M->Sizes.numY = (0); /* Number of model outputs */
untitled1_M->Sizes.numU = (0); /* Number of model inputs */
untitled1_M->Sizes.sysDirFeedThru = (0);/* The model is not direct feedthrough */
untitled1_M->Sizes.numSampTimes = (2);/* Number of sample times */
untitled1_M->Sizes.numBlocks = (0); /* Number of blocks */
}

/* Model terminate function */
void untitled1_terminate(void)
{
}



чёрт ногу сломит. После таких "генераций" появляется желание сесть за код вручную
Mogwaika
Цитата(TigerSHARC @ Oct 31 2012, 15:24) *
чёрт ногу сломит. После таких "генераций" появляется желание сесть за код вручную


Вы ещё сгенерированный hdl код не видели.

Моё мнение: все эти генерации кода для теста системы, отладки модели, чтобы быстренько наклепать, проверить, что как-то работает... далее нужно самому переписывать.
des00
Цитата(TigerSHARC @ Oct 31 2012, 05:24) *
Конкретный вопрос для понимания. На модели размещён всего один элемент: интегратор. Нужно получить функцию выполняющую интегрирование сигнала (функцию в C-виде).
Как сгенерировать эту функцию?

чёрт ногу сломит. После таких "генераций" появляется желание сесть за код вручную

Если учесть что Embedded Coder имеет тучу настроек, тренинг по его применению идет 3 дня по 8 часов и выглядит как практические занятия, то можно предположить что с наскоку не получится %)

Цитата(Mogwaika @ Nov 1 2012, 06:33) *
Вы ещё сгенерированный hdl код не видели.

Ну я видел, для систем автогенерации нормальный код, opencores генераторы иногда выдают еще хуже. Просто нужно уметь готовить матлабовскую модель к HDL генерации, там есть куча тонкостей.

Цитата
Моё мнение: все эти генерации кода для теста системы, отладки модели, чтобы быстренько наклепать, проверить, что как-то работает... далее нужно самому переписывать.

Вот тут обсуждается, применение HDL кодера. Есть в том числе и отзывы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.