- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4设备驱动模块的编写1021final
第章 的编写
设备驱动模块的创建一般采用 MEX C S-function和Embedded MATLAB。使用Embedded MATLAB对于读者比较容易上手(已在第一章中作过介绍),不过目前它支持的函数还不太多,应用将受到一定的限制。本章将重点介绍用C语言S-function创建自己的设备驱动模块的方法,包括noninlined S-function 和Inlined S-function模块,noninlined S-function 模块主要用于系统仿真(RTW也可为其生成C代码),而Inlined S-function模块可为模块产生嵌入式实时C代码。
图4.0.1 基于模型设计的核心
本章主要内容包括:
建立简单的S-Function模块
S-Function与S-Function Builder原理
应用
4.1 创建S函数模块的示例
本章的主要任务是介绍创建用户的设备驱动模块,要求较高,编写C MEX S函数比较困难。为了帮助读者在现有的知识水平下,尽快熟悉设备驱动模块的编写方法,我们摈弃了传统的从理论指导实践的介绍方法,而遵循自然的认知过程--从感性认识到理性认识。本节利用一个简单的例子,采用多种方法创建S函数模块,力求为读者展示S函数的编写方法,同时产生一些疑问和思考,针对这些问题,在后面的S函数运行机制与编写的详细过程中逐一解答。
编写乘2 S-function
集成现有C代码创建S函数模块
现有的算法大多数已用C语言实现了,并得到了广泛的应用,对于这些经过验证的C代码,用户没有必要重新编写。因此合理正确地利用现有的C代码,可加快S函数的编写。
集成C代码的方法三种:
手工编写Wrapper S函数:这是最直接的S函数的结构与S函数的API函数(回调方法)。如果要生成内联S函数的代码,还需要TLC (Target Language Compiler)文件,编写过程难度较大;
利用S-Function Builder生成S函数:这是最简单且最直观的一种方法,用户可以不需事先了解S函数的结构与API函数,当然如果用户具备这些知识,使用起来更会得心应手。它同时可以生成tlc文件,用以生成内联S函数的代码。不过S-Function Builder调用的API函数只是S函数API的一个子集,因此生成的S函数,功能受到一定限制。
使用代码继承工具(Legacy Code Tool--LCT)创建S函数模块:代码继承工具事实上是一组MATLAB命令,命令的参数对应着S函数的各个字段,因此要求用户应事先了解S函数的基本结构。
与S-Function Builder一样,LCT工具也可以生成tlc文件,但它所调用的API函数较S-Function Builder来的更少。
下面以现有的C代码doubleIt.c为例,说明整合C代码,创建S-function模块的方法。
double doubleIt(double u) //doubleIt.c
{
return(u * 2.0);
} 4.1.1 手工编写Wrapper S函数
由于手工编写S-function需要事先了解它的结构,因此本节仅简要说明代码意义,5.2节将详细介绍S-function的结构。Wrapper S函数的原理如图4.1.1所示。
图4.1.1 Wrapper S函数的原理
手写C MEX S函数代码,其中的代码注释若读者暂时不能理解,可留待后期了解了相关内容再回来阅读。
#define S_FUNCTION_NAME wrapsfcn // S函数名
#define S_FUNCTION_LEVEL 2 // S函数的级别为2
#include simstruc.h
extern real_T doubleIt(real_T u); // 声明外部函数 // 模型初始化
static void mdlInitializeSizes(SimStruct *S){
ssSetNumSFcnParams(S, 0); // S函数参数个数为0
ssSetNumContStates(S, 0); // 连续状态个数为0
ssSetNumDiscStates(S, 0); // 离散状态个数为0
// 如果输入口个数不为1,则返回
if (!ssSetNumInputPorts(S, 1)) return;
ssSetInputPortWidth(S, 0, 1); // 第一个输入口维度
ssSetInputPortDirectFeedThrough(S, 0, 1);// 第一个输入口为直馈
// 如果输出口个
您可能关注的文档
最近下载
- 新编大学语文(周玲玉)课件—第3章:小说.pptx VIP
- 高中生物实验研究型课程校本教材(上).pdf VIP
- 铁路工务线路设备检查项目与常见病害解析.pdf VIP
- 中药二中成药“快速记忆”总结.docx VIP
- 2025年生物医药临床试验风险识别与质量控制优化策略研究报告.docx
- 实施指南《GB_T27785-2011卫生杀虫器械实验室效果测定及评价电子灭蚊蝇器》实施指南.docx VIP
- 新解读《GB_T 27785 - 2011卫生杀虫器械实验室效果测定及评价 电子灭蚊蝇器》.docx VIP
- 离任审计流程详解与核心工作底稿编制指南.docx VIP
- 美术高中绘画教材分析.doc VIP
- 遵义凤冈县辅警招聘考试真题2023.pdf VIP
文档评论(0)