simulink和c语言开发,Simulink之嵌入式C代码生成-应用层和底层的接口

0774d7401a8fb49a97841cd8ce8a6ab6.png

今天给大家带来的仍然是基于MBD的嵌入式代码生成,主要把应用层和底层接口之间的代码生成配置说一下。本周末会更新功能安全相关,欢迎大家留言交流!

作为一个总是用C写代码的人来说,第一次接触到基于MBD的代码生成的时候就迫不及待的想知道怎么能让生成的代码用到嵌入式控制器中。刚开始,没有Green Hills、没有matlab的硬件支持包,也不会makefile,但简陋的设施仍然无法阻挡我研究的步伐。后来经过摸索发现真想学习代码生成,只需要有单片机软件编译器(对应芯片的就行),matlab就可以搞定。下面通过一个简单实例来给大家演示下,如何通过配置让应用层和底层拥有共同的接口。

假设有如下所示电路,当左侧滑动变阻器发生变化时调整灯的亮度。

95c728cec58d53483f654b006e670b68.png

首先底层代码肯定会有如下图所示接口示意代码:

130392bc3269c8c14188bc5e95ca8c7b.png

其中in_AD为输入接口,out_PWM为输出接口,Test1_step ()为应用程序。Test1.c为应用程序代码。所以说,当接口定义完成后底层代码和应用层代码可以按照这套接口来同时开发,这样加快了项目的开发进度。那接下来看看怎么样才能得到对应的应用代码可以直接放到编译软件中来编译。这里我们建立这样的一个模型:

6d86a0eacedf03c1c6a4c051fa689bac.png

做以下配置(前言说过的配置不再赘述,大家忘记的可以点击链接会跳转到前前言篇Simulink之嵌入式C代码生成-前言篇):

11668e8b9072bf336d60786ea9c74788.png

7201d83a05fbb6c2ba6df69073feebec.png

67c7bb48146deacac13315ceec85873b.png

ebbc20cdd00f1f0b08aa92c27e5c65f3.png

0f1cfa1ab4054ea6071336a479a5c895.png

点击代码生成。

按照下图所示将模型代码放入到编译器中,将Test1.h包含到main.h中,并调用模型生成的代码。点击编译,可以看到编译通过,但是模型到底能不能执行呢?实际仿真一下,答案是不能按照想要的结果执行的。

f6fdadd5b3cfe67fe04a1f5c61bf9470.png

打开Test1.c就可以看到,模型执行的实际代码如下:

5708145651e266e174856ef72555cb10.png

1ce1fdad9c237148b2f9a9cae467d9e6.png

可以发现这里输入接口不是in_AD而是Test1_U.AD;同样的,输出也不是。描述到这里终于到了关键点——如何灵活设置应用层接口?

a809b4428b2c5ded91d8bb39a9385449.png

4d07304fe9225983137b2cc250260ae4.png

创建完成信号后记得将workspace中的信号另存为脚本文件(下次分析这一步操作的原因)。设置完成之后再次编译,可观察到生成的代码如下:

fc51aa3931ae8be61e8822d827d0d687.png

代码中的接口与我们最开始定义的接口完全一致了,将代码放到编译器中就可以编译仿真了。向编译器中放代码的时候只需放入Test1相关的文件直接替换即可,不用更改底层代码,用起来是不是很方便?当应用程序比较复杂时,也只是多了几个文件,照样放进去就可以用。

本篇只是演示了接口生成的过程,但是在实际编程过程中不是只有外部变量一种接口,还有像宏定义、可导出外部变量、标定量等等,下篇详细介绍什么样的需求对应什么样的配置。那么,我们下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode笔记】215. 数组中的第K个最大元素(Java、快排、堆排、并发快排)

文章目录题目描述思路 & 代码快排基于 Fork / Join 的并发快排针对 topK 的快排优化堆排基本堆排结合题目的堆排二刷题目描述 大名鼎鼎的TOP K,主要考察排序快排 & 堆排 思路 & 代码 快排 没啥好说的,就是快排结束后,返回倒…

c语言中怎么画直线,ps如何画直线 【操作流程】

大家都知道电脑使用起来非常方便,但遇见ps如何画直线的时候就非常头疼了,如果你是第一次遇到ps如何画直线,怎么样才能快速解决ps如何画直线带来的烦恼呢?小编为大家收集了很多关于ps如何画直线问题的解决方法,下面请看…

【LeetCode笔记】470. 用Rand7()实现Rand10()(Java、概率)

文章目录题目描述代码 & 思路更新版三刷 - 极简版题目描述 貌似是比较高频的面试题目啊,有学概率论内味了(讲道理我概率论学得不好) 代码 & 思路 先用Rand7实现RandN(N > 10),类似进制&…

【纠错记录】本地FTP服务器无法被外部连接

问题描述 在本地主机开了个FTP服务器,本机可以正常访问,但是外部主机不能访问FTP服务器 解决方法 ① 一开始以为是服务端Xlight FTP的问题,检查权限并没有发现问题 ② 接着考虑到有没有可能是客户端Flash FXP的问题,于是尝试直…

双线性插值算法c 语言实现,双线性插值 - CristianoC的个人空间 - OSCHINA - 中文开源技术交流社区...

前言最近在学习LBP,其中的圆形LBP特征由于计算的值可能不是整数,即计算出来的点不在图像上,我们要使用计算出来的点的插值点。目的的插值方法有很多,Opencv使用的是双线性插值,今天就来介绍一下双线性插值。概述先给大…

【LeetCode笔记】543. 二叉树的直径(Java、dfs、二叉树)

文章目录题目描述思路 & 代码题目描述 思路 & 代码 由这个结论考虑:直径中一定有一个父结点,那么当前直径长度就是: 当前父结点的左子树深度 右子树深度那么,只要遍历所有结点的最长直径值即可流程:在找每一…

【LeetCode笔记】461. 汉明距离(Java、位运算)

文章目录题目描述思路 & 代码更新版题目描述 既然是二进制,那就十有八九用位运算符既然是不同,那肯定用异或 思路 & 代码 两种方法,总体来说都是处理异或值方法一,转换成字符串,再遍历(会慢一点…

android 自定义桌面图标大小设置,手机桌面图标尺寸可以改?OriginOS重新定义个性化...

原标题:手机桌面图标尺寸可以改?OriginOS重新定义个性化随着安卓定制化系统同质化情况的加重,越来越多的终端厂商开始探索一场新的变革。深耕手机领域的vivo,自然也察觉到了这一点。经过不断地努力和尝试之后,vivo终于…

【LeetCode笔记】347. 前K个高频元素(Java、优先队列、小顶堆、HashMap)

文章目录题目描述思路 & 代码更新版:引入 stream 流 Lambda题目描述 时间复杂度小于O(n*logn),否则直接sort,再遍历就很轻松。很有学习价值的题目,第一次使用了优先队列PriorityQueue。 思路 & 代码 首先遍历数组&am…

【LeetCode笔记】240. 搜索二维矩阵II 剑指 Offer 04 二维数组中的查找(Java、指针)

文章目录题目描述思路 & 代码更新版题目描述 两道题一样的有序 搜索,明摆着二分查找但是比较懒…选取了题解里的指针做法 思路 & 代码 时间复杂度O(m n),原理 & 思路 & 证明可见代码注释。代码很简单,主要是弄明白正确…

【LeetCode笔记】238. 除自身以外数组的乘积(Java、思路题)

文章目录题目描述思路 & 代码更新版题目描述 首先暴力二层循环肯定可以,然后先累乘整个数组,再用除法肯定也行。但是很遗憾,两种做法都不满足题目说明。 思路 & 代码 O(n) & O(1)考虑到这个核心:ans[i] 就是当前元…

【LeetCode笔记】236. 二叉树的最近公共祖先(Java、二叉树、DFS)

文章目录题目描述思路 & 代码题目描述 ac了,但是看了题解发现有更好的做法 思路 & 代码 对于一个结点rootNode,p、q有这么几种情况: p、q分别在其左右子树中,那么好说,rootNode就是答案p、q都在其右子树中…

linux关机命令_Linux基于centOS 7.6常见的Linux命令

一、linux关机命令:1.shutdown命令安全地将系统关机(推荐)参数说明:[-r] 重启计算器。[-h] 关机后关闭电源〔halt〕。[-c] cancel current process取消目前正在执行的关机程序。[-time] 设定关机〔shutdown〕前的时间。shutdown -h now 立刻…

【LeetCode笔记】221. 最大正方形(Java、动态规划、思路题)

文章目录题目描述思路 & 代码更新版题目描述 显而易见地可以用dp来写,问题在于如何考虑状态转移方程 思路 & 代码 首先再加一层外墙,就不用边界判断了maxSqure[i]:以当前格子为右下角的正方形,可达到的最大边长这是由…

linux内存管理_浅谈Linux内存管理

1. 扫盲篇1.1 操作系统存储层次常见的计算机存储层次如下:寄存器:CPU提供的,读写ns级别,容量字节级别。CPU缓存:CPU和CPU间的缓存,读写10ns级别,容量较大一些,百到千节。主存&#x…

【LeetCode笔记】33. 搜索旋转排序数组(Java、二分法)

文章目录题目描述思路 & 代码更新版题目描述 值互不相同:不用考虑重复值情况(要不然比较麻烦) 思路 & 代码 重点在于保证O(logn)的时间复杂度看成两个数组:前半段 & 后半段。根据两个数组的极值来判断 target 在哪…

html5版微博能收到私信吗,微博私信功能说明

新浪微博上线了私信功能,悄悄话也可以在微博上聊!只要对方是你的粉丝,你就可以发私信给他(或者她)。例如:这位网友是您的粉丝,在他的个人首页头像下方看到“发私信”链接,那么我可以给他发私信。如果对方不…

linux QT 结束当前进程_Linux常用使用命令梳理

一、指定运行级别运行级别0:关机1:单用户2:多用户状态没有网络服务3:多用户状态有网络服务4:系统未使用保留状态5:图形界面6:重启系统常用的运行级别是3和5,要想修改运行级别,可以修…

【LeetCode笔记】263. 丑数(Java、迭代)

文章目录题目描述思路 & 代码题目描述 打卡每日一题~(当然今天比较简单才写的)第一次写可能有点懵(指对“丑数”这个概念不太理解)不过写完后,感觉是基本上不会忘记写法的那种 思路 & 代码 对于…

Java 启动和停止界面_一文详解各种花里胡哨的Java调试技巧,多图预警,记得收藏...

欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享&#xff01;Java架构筑基​zhuanlan.zhihu.comJava架构筑基——专注于Java技术的研究与分享&#xff01;后续文章将首发此专栏&#xff01;欢迎各位Java工程师朋友投稿和关注Java架构师进阶之路<常用资料分享&g…