11.DAVE APP实例与配置数据结构
APP实例概念
依然以一张简单的图开始。 图1:简单的应用
在图1的应用中,MCU的UART通道X和Y分别连接两台PC。
MCU周期性的向2台PC发数据。用到的APP是UART。
但是有一个问题! UART APP只有1个发送通道,但是在这个应用中需要配置2个!
救场的是APP实例的概念。在面向对象语言例如C++中,一个类可以定义多个对象。对于定义好的对象,只为类数据分配内存,而类方法只定义1次。
DAVE APP使用相同的概念。APP好比类。在工程中,一个APP可以有多个实例。APP的每个实例好比对象。你可以使用APP GUI配置每个实例。
在生成代码时,实际上是在为实例生成配置数据结构。
有了这个背景知识,你可以通过建立UART APP的2个实例来完成这个应用。 图2:UART APP的多个实例 工程中可以包含的APP实例数量受限于硬件。如果你使用的MCU只有最多6个UART通道,在工程中只能包括最多6个UART实例。
假设MCU有最多6个UART通道和5个IO引脚(没错,就5个),每个UART APP需要1个UART通道和2个IO引脚(一发一收),DAVE只允许向工程中添加2个实例,不允许添加更多的了。
APP实例配置
图3:每个实例的配置GUI
在各个APP实例上双击,即弹出其配置GUI。它们可以配置不同的参数。完成配置后,生成代码。 图4:APP句柄
上图展示了为每个实例生成代码中的配置数据结构,在DAVE中这些数据结构称为APP句柄。
注意这些句柄所在文件的名字:uart_conf.c
APP句柄概念
一个典型的APP句柄包括:
- 指向所消耗硬件资源的指针
- 所消耗APP的句柄
- 基于GUI的配置信息
友情提醒:生成的只是配置数据结构,APP库是静态的。
私有标签
到目前为止我们完成的都是玩具应用。实际应用中,复杂的应用会包括多个APP及其多个实例。我们常由于其数量繁多而深受其害。比如,我们常常忘记APP句柄GPIO_18表示什么意思。
为了解决这个问题,DAVE允许你自定义句柄。
在一个实例上点右键,选择Change Instance Label,键入自己定义的APP句柄名称。 图5:用户标签
单例APP
有的APP只能定义单个实例,因为硬件上有这个约束。比如SYSTICK定时器。
可共享的APP
有时,硬件资源被共享,因此围绕这些资源建立的APP也是可共享的。
例1 时钟配置由CLOCK APP专门处理。对每个需要时钟配置的APP而言,有2个选择:其一是占用硬件时钟资源,但这样的话其他APP在设置时钟时会被拒绝。
这时就用得着共享APP了,所有需要配置外设时钟的APP都消耗一个共享CLOCK APP。
例2 下面是一个CCU4模块。 图6:CCU4模块
此模块有4个独立的定时器片,每个定时器片拥有专用的寄存器。除了这4个定时器片之外,还有一些寄存器控制此模块的全局特性。 一个PWM APP消耗一个定时器片,PWM的GUI可配置该定时器片产生PWM信号。然而,它还要求配置CCU4模块的全局特性。理论上,最多允许添加4个PWM APP实例,并且这4个实例都要配置CCU4模块的 全局特性。此时共享的CCU4全局APP就派上了用场。 图7:CCU4模块
|