请教个代码生成的基础问题 1、在simulink中有芯片的硬件支持包的情况下,是不是所有代码(应用层、芯片外设代码)都可以通过simulink来实现,并通过simulink编译下载到芯片中去? 2、在没有硬件支持包的芯片,要想使用代码生成,就仅用simulink来实现应用层代码以及算法的代码,代码生成后在手动集成到芯片的IDE开发环境中去编译,然后下载到芯片中去。 3、在没有硬件支持包的情况下,应用层代码要想调用芯片外设的的驱动代码该如何实现呢? |
最佳答案
8 条回复
1、可以实现,但不可以编译下载,编译下载需要编译器 2、是 3、调用C代码有很多方式,Stateflow、C Caller都可以 |
MsM18 发表于 2020-12-30 15:43 非常感谢回答。 也就是说无论simulink内是否有相应的硬件支持包,最终都是需要在对应芯片的IDE开发环境中去编译下载运行是这个意思吧。 第三个问题还是没有理解,就是假设用StateFlow调用芯片外设的驱动代码,具体该如何操作呢? 还有一个问题就是怎么知道哪些芯片有硬件支持包呢? 一般做开发是用第一种方式多还是第二种方式多吖? |
孤独の守望者 发表于 2020-12-30 17:05 我来说说这个问题吧。 Stateflow或者C Caller可以调用C代码,比如x = ADC_Read(ch),这条语句放到Stateflow的动作中,就可以在代码中直接使用这条语句。注意到底层驱动通常有一些硬件相关的操作,比如读写寄存器,或者物理地址,这样的操作在Stateflow中是不能被执行的,所以需要为这些操作提供桩函数,以便可以通过Stateflow的编译。 开发中尽量能够把软件分层,使得底层驱动和应用层算法能够分开,应用层算法部分通过Simulink实现,而底层代码手工实现。 这类问题,在公众号“基于模型的设计”中都有讨论,你可以看一下。 |
老胡 发表于 2020-12-30 21:45 非常感谢解答。 我再去了解下桩函数,一直比较困惑的就是,simulink调用驱动代码操作寄存器还有物理地址怎么还能再正常编译的。 |
老胡 发表于 2020-12-30 21:45 感谢董老师的解释,目前看来通过分工,可以做到应用层不读写寄存器,只有一种例外:在事件触发的任务中(比如发动机曲轴转角的任务中)做微分或积分运算时需要读取系统时钟来确定时间步长。 对于这种情况还请董老师不吝赐教,有没有什么办法对指定地址(比如timer的寄存器地址为0x00700)进行读取操作 |
wanllow 发表于 2021-1-4 17:37 应用层不会直接访问寄存器地址,可以做一次封装,比如启动计时器StartTimer(),读取计时器ReadTimer(),等等,在应用层里通过访问这些接口函数启动和读取寄存器。 在Simulink里,在调用StartTimer()这类函数接口时,不能直接调用真实的函数,因为真实的函数里有对寄存器的操作,在Windows下编译不过去,所以,为了让Simulink模型可以仿真,另外给StartTimer()提供一个桩函数。 |
老胡 发表于 2021-1-7 21:22 感谢感谢 |
Powered by Discuz! X3.4
© 2001-2022