Simulink代码生成(二十三)——TSP开发之tlc文件编写

Simulink代码生成(二十三)——TSP开发之tlc文件编写

一、tlc文件解读

以ds18b20为例编写的tlc内容如下

%% File : sfunar_7sec.tlc
%%
%% Description: 
%%   Code generation file for sfunar_7sec

%% Copyright 2015- Hyowinner, Inc.

%implements sfunar_ds18b20 "C"

%include "block_common_includes.tlc"

%% Function: BlockTypeSetup ===============================================
%function BlockTypeSetup(block, system) void
    %assign mdlname = LibGetMdlSrcBaseName()
    %assign cfile = LibCreateSourceFile("Source","Simulink",mdlname)
    %assign t_device_index = SFcnParamSettings.r_device_index
    %assign t_pin = SFcnParamSettings.r_pin
    %% Ensure required header files are included
    %<ArduinoCommonBlockTypeSetup(block, system)>
    %openfile buf
    #include "OneWire.h" 
    #include "DallasTemperature.h"
    %closefile buf
    %<LibSetSourceFileSection(cfile, "Includes", buf)>
    %openfile buf
    #define ONE_WIRE_BUS %<t_pin>
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors_%<t_device_index>(&oneWire);
    %closefile buf
    %<LibSetSourceFileSection(cfile, "Defines", buf)>

%endfunction

%function BlockInstanceSetup(block, system) void
  %%
  %<LibBlockSetIsExpressionCompliant(block)>
  
%endfunction

%function Start(block, system) Output
   %% Initialize DS18B20 Sensor
    %assign t_device_index = SFcnParamSettings.r_device_index
    // Initialize device index: %<t_device_index>
    sensors_%<t_device_index>.begin();
%endfunction

%% Function: Outputs ======================================================
%%
%function Outputs(block, system) Output
    %assign t_device_index = SFcnParamSettings.r_device_index
    %assign y = LibBlockOutputSignal(0, "", "", 0)
    sensors_%<t_device_index>.requestTemperatures(); 
    %<y> = sensors_%<t_device_index>.getTempCByIndex(%<t_device_index>);
    
%endfunction

%% [EOF]

  • %implements sfunar_ds18b20 “C” 这个必须包含,固定格式
  • block_common_includes.tlc的内容如下。这里%include "block_common_includes.tlc"相当于把这个文件里面的内容直接内联进来了,通过查看文件,一般不用外部模式,所以这个的作用通常就是增加Arduino.h到文件
    %<LibAddToCommonIncludes(“Arduino.h”)>
  • function BlockTypeSetup(block, system) void
    相当于配置,一般设置头文件,宏定义,数据结构等,无论存在一个或者多个模块,这个函数只运行一次。
    这里的block表示模块,system表示模型
  • %function BlockInstanceSetup(block, system) void
    这个表示实例,每个模块相当于一个实例,如果要为每个模块生成一个实例,就需要在这里设计,如果只有一个模块则不需要。这里暂时不用修改。
  • %assign mdlname = LibGetMdlSrcBaseName()
    %assign cfile = LibCreateSourceFile(“Source”,“Simulink”,mdlname)
    %assign t_device_index = SFcnParamSettings.r_device_index
    %assign t_pin = SFcnParamSettings.r_pin
    这里
    mdlname = LibGetMdlSrcBaseName()表示获取模型的名字
    LibCreateSourceFile(“Source”,“Simulink”,mdlname)创建一个以模型名字命名的.c文件
    后面两句表示获取C Mex Sfunction中的两个参数,一个是r_device_index,另一个是r_pin,在tlc文件中一般以t_xx格式
  • %% Ensure required header files are included
    %<ArduinoCommonBlockTypeSetup(block, system)>
    %openfile buf
    #include “OneWire.h”
    #include “DallasTemperature.h”
    %closefile buf
    %<LibSetSourceFileSection(cfile, “Includes”, buf)>
    这里<ArduinoCommonBlockTypeSetup(block, system)>相当于添加了#include “Arduino.h”
    %<LibSetSourceFileSection(cfile, “Includes”, buf)>是将buf中的两个Include放到mldname.c的Includes部分
  • %openfile buf
    #define ONE_WIRE_BUS %<t_pin>
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors_%<t_device_index>(&oneWire);
    %closefile buf
    %<LibSetSourceFileSection(cfile, “Defines”, buf)>
    同理,这里是放在Defines部分,也可以将宏定义放在define部分,将其他的放在declearation部分,这里是为了方便。
  • %function Start(block, system) Output
    这个相当于Init,会把生成的代码放到Init部分,注意这里用的Output,而BlockTypeSetup用的是void,这里的Output的意思是将内容输出到特定的位置,而用void则需要自己用LibSetSourceFileSection去限定
  • %assign t_device_index = SFcnParamSettings.r_device_index
    // Initialize device index: %<t_device_index>
    sensors_%<t_device_index>.begin();
    这个生成的代码就是一条注释,加上sensors_0.begin();
    -%function Outputs(block, system) Output
    %assign t_device_index = SFcnParamSettings.r_device_index
    %assign y = LibBlockOutputSignal(0, “”, “”, 0)
    sensors_%<t_device_index>.requestTemperatures();
    % = sensors_%<t_device_index>.getTempCByIndex(%<t_device_index>);
    同理,这里生成的代码会到step中, LibBlockOutputSignal的解释如下,一般只用设置用第一个和第四个数据,中间两个用双引号替代。最后生成的代码为:sensors_0.requestTemperatures(); out = sensors_0.getTempCByIndex(0);
    在这里插入图片描述
    在这里插入图片描述
%% File: block_common_includes.tlc
%%
%% Copyright 2002-2014 The MathWorks, Inc.

%function SLibCodeGenForSim() void
  %if (CompiledModel.TargetStyle=="SimulationTarget")
    %return 1
  %else
    %return 0
  %endif
%endfunction

%function ArduinoCommonBlockTypeSetup(block, system) void

  %if EXISTS(::_DONE_COMMON_BLOCK_TYPE_SETUP_) == 0
    %assign ::_DONE_COMMON_BLOCK_TYPE_SETUP_ = 1

    %if !SLibCodeGenForSim()
      %if ExtMode
        %% Remove double re-definition in Integer-only case
        %<LibAddToCommonIncludes("remDouble.h")>
      %endif
      %<LibAddToCommonIncludes("Arduino.h")>
      %if ::GenCPP==0
        %<LibAddToCommonIncludes("io_wrappers.h")>
      %endif
    %endif
  %endif

%endfunction

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值