欢迎光临散文网 会员登陆 & 注册

Simulink自动代码生成(三)函数

2022-04-27 15:25 作者:秋_石  | 我要投稿

        编写任何项目,为了程序的可读性和可移植至性都会将部分功能进行封装,因此就涉及到函数的内容。就我个人的应用情况,将函数为:1、普通函数;2、初始化函数;3、中断函数。

1、普通函数

在Library Browser中找到Function-call subsystem模块


图1 外部函数调用的子系统

        图1中就是simulink给出的调用函数(子系统)的模块,可在内部放置自己想要实现的功能,形成一个封装模块。模块有3个端口:1、输入端口,2、输出端口,3子系统模块的函数调用输入端口。这些端口都是可以删除/添加的。

        这里做一个简单的反转函数功能,input!=output,如图2所示:


图2 反转函数功能

       在Library Browser中选择GPIO模块以及function-call generator,按照图3去连接。图3中也可以将红框中的模块都封装在一块,形成一个函数。GPIO10作为输入信号,GPIO11作为输出信号,经过反转函数使得,GPIO11的输出信号为输入信号的取反。

图3 函数调用


实验结果

图5 GPIO11的输出结果

多函数调用问题

        当调用过的函数不只一个时,需要利用到图6所示的Function-call split模块。Function-call split模块可设置函数调用的先后顺序,带点的被调用。

图6 Function-call split模块


图7 多函数调用示意

        图7为多函数调用的示例,mainFunction函数先于mainFunction1函数被调用。执行顺序为先mainFunction然后再执行mainFunction1。

使用中发现的问题

simulink应该不是所有的DSP型号都支持boot from flash模式,就我个人的程序版本而言28377D就不支持,但是28335就支持,这块我是从2837xD的cmd文件并结合实验得到的推测。

图8  2837xD的cmd文件

2、初始化函数

        初始化通常设置为只执行一次,因此,这里需要用到enable subsystem。该函数被调用的前提是能信号端口输入条件为真。使能信号的触发条件可以设置为“held(输入高)”或者“reset(输入低)”。

图9 使能函数模块

         利用使能函数模块构建图10所示的具备初始化功能的示例。其大致逻辑为,当初始化完成后(这里设置的是外部GPIO信号为高电平),初始函数给出初始完成标志,使得主程序可以进行。

图10 具备初始化功能的示例

3、中断函数配置方式

Library browser 搜索interrupt,这里选择软件中断SW int trigger

图11 软件中断触发器

图11给出了软件中断的模块和内部参数,CPU interrupt number x 和PIE interrupt number y 组合起来就表示的是INTx,y。如果记不清楚要用的中断是多少可以点击Help,帮助里有中断表。这里要记住选择哪个中断组,这于稍后中断的响应配置有关系。

 

图12  硬件中断响应

        图12是DSP硬件中断响应的模块,里面的参数应该与软件中断相对应(如果你配置的是外设的中断,那么这里就需要设置与外设的中断相适应)。这里的优先级是相对的概念,数字越小优先级越高,但是不要超过40。

图13 中断函数示例

        利用中断模块配置了如图13所示的中断函数示例,simulink模型为计数到2.55s,然后触发中断,在中断中翻转一次GPIO口电平状态。效果如图14。

图14  中断示例




Simulink自动代码生成(三)函数的评论 (共 条)

分享到微博请遵守国家法律