Замена функции памяти кода

Этот пример показывает, как задать заменяющее отображение кода для функции памяти. Пример задает отображение для функции memcpy программно. Также можно использовать Code Replacement Tool, чтобы задать то же отображение.

  1. Создайте табличный файл определения, который содержит функциональное определение. Например:

    function hTable = crl_table_memcpy()
    
  2. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

    hTable = RTW.TflTable;
    
  3. Создайте запись для отображения функции с вызовом функции RTW.TflCFunctionEntry.

    % Create entry for void* memcpy(void*, void*, size_t)
    fcn_entry = RTW.TflCFunctionEntry;
    
  4. Параметры записи функции множества с вызовом функции setTflCFunctionEntryParameters.

    % Set SideEffects to 'true' for function returning void to prevent it from 
    % being optimized away.
    setTflCFunctionEntryParameters(fcn_entry, ...
                                   'Key',                      'memcpy', ...
                                   'Priority',                 90, ...
                                   'ImplementationName',       'memcpy_int', ...
                                   'ImplementationHeaderFile', 'memcpy_int.h',...
                                   'SideEffects',              true);
    
  5. Создайте концептуальные аргументы y1, u1, u2 и u3. Существует несколько способов настроить концептуальные аргументы. Этот пример использует вызовы getTflArgFromString и функций addConceptualArg, чтобы создать и добавить аргументы.

    arg = getTflArgFromString(hTable, 'y1', 'void*');
    arg.IOType = 'RTW_IO_OUTPUT';
    addConceptualArg(fcn_entry, arg);
    
    arg = getTflArgFromString(hTable, 'u1', 'void*');
    addConceptualArg(fcn_entry, arg);
    
    arg = getTflArgFromString(hTable, 'u2', 'void*');
    addConceptualArg(fcn_entry, arg);
    
    arg = getTflArgFromString(hTable, 'u3', 'size_t');
    addConceptualArg(fcn_entry, arg);
    
  6. Скопируйте концептуальные аргументы в аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызов функции copyConceptualArgsToImplementation, чтобы создать и добавить аргументы реализации в запись путем копирования соответствия с концептуальными аргументами.

    copyConceptualArgsToImplementation(fcn_entry);
    
  7. Добавьте запись в заменяющую таблицу кода с вызовом функции addEntry.

    addEntry(hTable, fcn_entry);
  8. Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.

Протестировать этот пример:

  1. Укажите заменяющее отображение кода.

  2. Создайте модель, которая использует функцию memcpy для векторных присвоений. Например, используйте В, и блоки Мультиплексора, чтобы создать следующую модель. (Также откройте модель rtwdemo_crlmath в качестве примера и скопируйте содержимое Subsystem1 к новой модели.)

  3. Выберите схему и используйте Edit> Subsystem, чтобы сделать его подсистемой.

  4. Сконфигурируйте подсистему со следующими настройками:

    • На панели Solver выберите решатель фиксированного шага.

    • На панели Optimization выберите Use memcpy for vector assignment и установите Memcpy threshold (bytes) на 64.

    • На панели Code Generation выберите ERT-based system target file.

    • На Code Generation> панель Interface, выберите заменяющую библиотеку кода, которая содержит вашу запись функции памяти.

  5. В Model Explorer сконфигурируйте Signal Attributes для In1, In2 и исходных блоков In3. Для каждого, устанавливает Port dimensions на [1,100] и устанавливает Data type на int32. Примените изменения. Сохраните модель.

  6. Сгенерируйте код и отчет генерации кода.

  7. Рассмотрите замены кода.

Похожие темы