[已解决] Simulink 代码生成

[复制链接]
孤独の守望者 发表于 2020-12-30 13:26:17
请教个代码生成的基础问题
1、在simulink中有芯片的硬件支持包的情况下,是不是所有代码(应用层、芯片外设代码)都可以通过simulink来实现,并通过simulink编译下载到芯片中去?
2、在没有硬件支持包的芯片,要想使用代码生成,就仅用simulink来实现应用层代码以及算法的代码,代码生成后在手动集成到芯片的IDE开发环境中去编译,然后下载到芯片中去。
3、在没有硬件支持包的情况下,应用层代码要想调用芯片外设的的驱动代码该如何实现呢?

最佳答案


MsM18 发表于 2020-12-30 15:43:55
1、可以实现,但不可以编译下载,编译下载需要编译器
2、是
​3、调用C代码有很多方式,Stateflow、C Caller都可以
回复此楼

8 条回复


MsM18 发表于 2020-12-30 15:43:55
1、可以实现,但不可以编译下载,编译下载需要编译器
2、是
​3、调用C代码有很多方式,Stateflow、C Caller都可以
回复此楼

孤独の守望者 发表于 2020-12-30 17:05:38
MsM18 发表于 2020-12-30 15:43
1、可以实现,但不可以编译下载,编译下载需要编译器
2、是
​3、调用C代码有很多方式,Stateflow、C Calle ...

非常感谢回答。
也就是说无论simulink内是否有相应的硬件支持包,最终都是需要在对应芯片的IDE开发环境中去编译下载运行是这个意思吧。
第三个问题还是没有理解,就是假设用StateFlow调用芯片外设的驱动代码,具体该如何操作呢?
还有一个问题就是怎么知道哪些芯片有硬件支持包呢?
一般做开发是用第一种方式多还是第二种方式多吖?



老胡 发表于 2020-12-30 21:45:23
孤独の守望者 发表于 2020-12-30 17:05
非常感谢回答。
也就是说无论simulink内是否有相应的硬件支持包,最终都是需要在对应芯片的IDE开发环境中 ...

我来说说这个问题吧。
Stateflow或者C Caller可以调用C代码,比如x = ADC_Read(ch),这条语句放到Stateflow的动作中,就可以在代码中直接使用这条语句。注意到底层驱动通常有一些硬件相关的操作,比如读写寄存器,或者物理地址,这样的操作在Stateflow中是不能被执行的,所以需要为这些操作提供桩函数,以便可以通过Stateflow的编译。
开发中尽量能够把软件分层,使得底层驱动和应用层算法能够分开,应用层算法部分通过Simulink实现,而底层代码手工实现。
这类问题,在公众号“基于模型的设计”中都有讨论,你可以看一下。

孤独の守望者 发表于 2020-12-31 08:28:17
老胡 发表于 2020-12-30 21:45
我来说说这个问题吧。
Stateflow或者C Caller可以调用C代码,比如x = ADC_Read(ch),这条语句放到Stateflo ...

非常感谢解答。
我再去了解下桩函数,一直比较困惑的就是,simulink调用驱动代码操作寄存器还有物理地址怎么还能再正常编译的。

wanllow 发表于 2021-1-4 17:37:18
老胡 发表于 2020-12-30 21:45
我来说说这个问题吧。
Stateflow或者C Caller可以调用C代码,比如x = ADC_Read(ch),这条语句放到Stateflo ...

感谢董老师的解释,目前看来通过分工,可以做到应用层不读写寄存器,只有一种例外:在事件触发的任务中(比如发动机曲轴转角的任务中)做微分或积分运算时需要读取系统时钟来确定时间步长。 对于这种情况还请董老师不吝赐教,有没有什么办法对指定地址(比如timer的寄存器地址为0x00700)进行读取操作

老胡 发表于 2021-1-7 21:22:34
wanllow 发表于 2021-1-4 17:37
感谢董老师的解释,目前看来通过分工,可以做到应用层不读写寄存器,只有一种例外:在事件触发的任务中( ...

应用层不会直接访问寄存器地址,可以做一次封装,比如启动计时器StartTimer(),读取计时器ReadTimer(),等等,在应用层里通过访问这些接口函数启动和读取寄存器。
在Simulink里,在调用StartTimer()这类函数接口时,不能直接调用真实的函数,因为真实的函数里有对寄存器的操作,在Windows下编译不过去,所以,为了让Simulink模型可以仿真,另外给StartTimer()提供一个桩函数。

wanllow 发表于 2021-3-14 14:17:36
老胡 发表于 2021-1-7 21:22
应用层不会直接访问寄存器地址,可以做一次封装,比如启动计时器StartTimer(),读取计时器ReadTimer(), ...

感谢感谢

墙上的咖啡 发表于 2021-9-7 17:07:29
老胡 发表于 2020-12-30 21:45
我来说说这个问题吧。
Stateflow或者C Caller可以调用C代码,比如x = ADC_Read(ch),这条语句放到Stateflo ...


你好 老胡  请问CompuMethods怎么在下面设置Simulink DataTypes呀,

您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表