为高级通用模拟器接口实现 µVision DLL

简介

µVision 调试器支持用于实现用户定义外设的仿真器接口。此接口称为高级通用模拟器接口 (AGSI)。 AGSI 引入了一种灵活且简单的方法,可将新的用户定义外设直接添加到 µVision。它提供了模拟外设行为所必需的功能以及显示外设对话框的功能。

为了简化用户定义外设的开发,两个示例项目中提供了 AGSI 和配置框架。只有 µVision 2.21 或更高版本支持本文档中描述的所有功能。

AGSI 第 3 版适用于 µVision3(3.00 版或更高版本),并添加了以下功能:

        • AgsiEntry 具有新功能代码(nCODE= AGSI_PRE_RESET、AGSI_CMDOUT)

        • AgsiSetWatchOnSFR、AgsiSetWatchOnVTR 和 AgsiSetWatchOnMemory 的 CALLBACK 函数现在在调用时获取地址和访问原因。

为 µVision2 开发的 AGSI DLL 仍可与 µVision3 一起使用。

SPeriDLL

SPeriDLL 是“Sample Peripheral DLL”的同义词。它是一个准备运行的外设 DLL,它实现了一个“来自 Analog Devices ADuC812 的 A/D 转换器”作为示例外设。它使用大部分 AGSI 功能来实现这个外设。该项目由一个 MS Visual-C++ (6.0) 项目文件和以下源文件组成:

        AGSI.h:AGSI 函数的原型(请勿修改!)

        SPeriDLL.h:具有各种原型和定义的主头文件

        SPeriDLL.cpp :主文件(由 AppWizard 创建)包含设置代码和模拟

        PeriDialog.h:用于无模式外设对话框的头文件(由类向导创建)

        PeriDialog.cpp:无模式外设对话框的实现文件

文件 S812ADC.zip 中还包含一个简单的 µVision 测试项目“使用 ADuC812 进行单 A/D 转换”,该文件显示了如何包含和测试已实现的外设。

STimerDLL

STimerDLL,是“Sample Timer DLL”的同义词。它是一个准备运行的外设 DLL,它实现了一个“定时器 3”作为示例外设。就功能而言,“定时器 3”与标准 8051 定时器 1 相同,但具有不同的 SFR 地址,因此除了“定时器 1”外,还可以加载它。它使用大部分 AGSI 功能来实现这个外设。该项目由一个 MS Visual-C++ (6.0) 项目文件和以下源文件组成:

        AGSI.h:AGSI 函数的原型(不要修改!)

        Common.h:带有各种原型和定义的头文件

        Common.cpp:AGSI 和对话框函数的通用支持函数

        STimerDLL.h:STimerDLL 类的头文件

        STimerDLL.cpp : 主文件提供外设设置代码和仿真

        PeriDialog.h:无模式外设对话框的头文件(由类向导创建)

        PeriDialog.cpp:无模式外设对话框的实现文件

Timer3.zip 文件中还包含一个简单的 µVision 测试项目,它显示了如何包含和测试已实现的外围设备。

为了开发外设,需要有关 C/C++ 编程和 MS Visual-C++ 6.00 编程环境的知识。

如何使用示例外设

DLL 为了使用示例外设 DLL 之一,您必须执行以下步骤。以下步骤针对 SPeriDLL 进行了描述,但同样适用于 STimerDLL

        • 在您的 PC 上安装 µVision 和 C51 编译器。

        • 创建一个文件夹,例如 D:\Src32\SPeriDLL\

        • 将文件 SPeriDLL.zip 解压缩到该文件夹​​中。确保选中“使用文件夹名称”复选框,因为 SPeriDLL 使用一些子文件夹。

        • 创建一个文件夹,例如C:\Keil\C51\Examples\S812ADC\

        • 将文件S812ADC.zip 解压缩到该文件夹​​中。

        • 启动Visual-C,选择“SPeriDLL.dsw”项目文件。

        • 选择“项目-设置”。单击“调试”选项卡。浏览“调试会话的可执行文件”。您需要选择文件 Uv2.Exe。它通常位于 C:\Keil\Uv2 中,但这取决于您安装 µVision 的位置。

        • 然后单击“自定义构建”选项卡并在“命令”窗口中写入命令“复制 $(InputPath) C:\KEIL\C51\BIN\$(InputName).dll”并在“输出”窗口中写入输出文件'C:\KEIL\C51\BIN\$(InputName).dll'。此步骤需要在创建后自动复制创建的 DLL,并将其构建到 µVision 的 BIN 子文件夹中,该文件夹通常为 C:\KEIL\C51\BIN,但取决于您安装 µVision 的位置。如果一切正常,则对话框应如下所示:

        • 之后,关闭对话框。

        • 选择“Build – Set active configuration”,选择 SPe​​riDLL Win32 Debug 配置。

        • 选择“Build – Rebuild All”来创建 DLL。

        • 按F5 键运行µVision。选择“Project – Open Project”,弹出选择项目对话框。选择“S812ADC.uv2”项目。它可以在您创建并将项目文件复制到的文件夹中找到(通常为 C:\Keil\C51\Examples\S812ADC)。

        • 选择“重建所有目标文件”来构建项目。

        • 选择“目标选项– 调试”。只需将参数“-dSPeriDLL”添加到“Dialog DLL”的参数列表即可加载 SPeriDLL 外围 DLL。外围 DLL 的参数格式为“-dDLLName”(不带扩展名的 DLL 名称)。确保选中“使用模拟器”单选按钮。如果一切正常,则对话框应如下所示:

        • 关闭对话框。

        • 选择“调试——启动/停止调试会话”。这将启动 µVision 调试器。它还初始化并加载我们的 SPeriDLL.dll。在“外围设备”菜单中,应出现一个带有“A/D 转换器”标签的新项目。单击此项打开外设对话框,如下所示:

        • 现在您可以单步执行“使用 ADuC812 进行单次 A/D 转换”示例的代码,并观察“A/D 转换器”外设的行为,以及其他外围设备,如“端口 0”、“端口 2”、“端口 3”和“中断”。

请注意,此示例程序仅演示了 A/D 转换器一小部分的功能。

实现自己的外围 DLL:必需步骤

为了开发外围 DLL,您应该执行以下步骤:

        • 启动 MS Visual-C++ 并创建一个新项目“MFC AppWizard (dll)”。

        • 将 AGSI 和 SFR(特殊功能寄存器)和 VTR(虚拟寄存器)定义的原型和定义添加到主头文件 (*.h)。

        • 将外设初始化代码写入主文件(*.cpp)。这包括 AGSI 设置 (GetFunctionPointers)、外围菜单条目和相关对话框 (DefineAllMenuEntries) 的声明、SFR (DefineAllSFR)、VTR (DefineAllVTREG)、监视 (DefineAllWatches) 和中断 (DefineAllInterrupts) 的声明。还要编写外设复位代码 - SFR 的复位值 (ResetPripheral)。所有这些函数都是从函数 AgsiEntry() 调用的,该函数必须由该外围 DLL 导出。

        • 将外围设备模拟函数写入主文件(这些函数由定义的手表触发)。还包括这些函数的原型。

        • 使用“MFC ClassWizard”使用资源编辑器(如果需要该对话框)和相关的头文件 (*.h) 和实现文件 (*.cpp) 创建外设对话框。不要忘记设置对话框的“可见”属性并包括默认按钮“确定”和“取消”并使它们不可见(ESC 和 Enter 键的行为所必需的)。更改对话框的默认构造函数并添加函数 PeriDisp() - 显示对话框,PeriUpdate() - 更新显示内容,调用函数 Update() 和 PeriKill() - 关闭对话框。还添加一个菜单定义 (AGSIMENU) 和一个对话框定义 (AGSIDLGD)。

        • 将更新显示内容的代码写入对话框实现文件的Update() 函数中。该函数在请求更新时自动调用,用于反映外设的当前状态。

        • 使用“MFC ClassWizard”为对话框控件项的消息添加功能。最常用的消息是:按钮的 ON_BN_CLICKED、编辑框的 ON_EN_KILLFOCUS、组合框的 ON_CBN_SELCHANGE……还包括两个不可见按钮“确定”和“取消”的功能。

        • 选择“项目-设置”。单击“调试”选项卡。浏览“Executable for Debug session”并选择文件 Uv2.Exe。它通常位于 C:\Keil\Uv2 中,但这取决于您安装 µVision 的位置。

        • 重建您的外围DLL。然后将 DLL 文件复制到 µVision 的 BIN 子文件夹,该子文件夹通常为 C:\KEIL\C51\BIN,但取决于您安装 µVision 的位置或使用 MS Visual-C++ 中的“自定义构建”并编写自动复制的命令重建后的 DLL(参见“示例外设 DLL”中的先前描述)。

        • 通过运行 µVision(按 F5 键)测试您的外设 DLL。选择一个测试项目并通过简单地将参数“-dDLLName”(不带扩展名的 DLL 名称)添加到外设 DLL 的参数列表(参见“示例外设 DLL”中的前面描述)来启用已实现的外设 DLL 的加载。

        • 如果实现的外设正在运行,则切换到发布模式并重建它。然后再次测试外围 DLL(不要忘记将“Release DLL”文件复制到 µVision 的 BIN 子文件夹)。

模拟的基本工作原理

如果每个模拟的外围设备都使用每条模拟的 CPU 指令进行更新,那么模拟器的性能将会非常低。这就是为什么 µVision 模拟器改用事件驱动模拟的原因。事件(也称为监视)是对特殊功能寄存器 (SFR)、虚拟寄存器 (VTR) 或内存区域以及软件定时器到期时的读取或写入访问。以下两个示例详细说明了这一点:

模数转换器(参见 SPeriDLL):

假设 A/D 转换器具有配置寄存器(SFR 的 ADCCONx)、数据寄存器(SFR 的 ADCDATAx)、8 个模拟输入(VTR 的 AIN0-7)和一个外部引脚(VTR CONVST)启动转换。 A/D 转换器在启动之前什么都不做,因此不会调用任何函数来对其进行仿真,此时也不会消耗仿真时间。为了“查看” A/D 转换器何时配置和启动,需要在配置寄存器和外部启动引脚上设置所谓的访问监视(AgsiSetWatchOnSFR 和 AgsiSetWatchOnVTR)。这是在函数“DefineAllWatches”中完成的。每当将新值写入 ADCCONx 寄存器或外部启动引脚时,都会调用函数“AdcConv”。该功能必须检查配置、参考电压和模拟输入以计算数字值。此时数字结果无法写入数据寄存器。真正的 A/D 转换器需要一些时间来采样和转换模拟电压。为了模拟这种行为,设置了一个软件定时器 (AgsiSetTimer),它在指定的状态数之后调用函数“AdcCompleted”。该函数将数字值写入数据寄存器,清除忙碌标志,并设置中断请求位。

16 位定时器(参见 STimerDLL):

即使是定时器也不需要用每条模拟指令更新(重新计算)其值。通常,当配置更改(启动/停止、预分频器值)和读取实际定时器值时,需要更新定时器值。因此,必须在配置寄存器上设置写访问监视,并且必须在定时器寄存器上设置读访问监视。计时器计算函数在调用时将时间(状态)存储在静态变量中。通过时间差(实际状态 - 最后状态)可以计算实际计时器值。使用这种方法,可以以最小的计算开销随时计算计时器值。只有定时器溢出的中断不能这样处理。将附加软件定时器 (AgsiSetTimer) 设置为此事件,每次溢出都会重新计算定时器。当检测到溢出时,中断请求标志被置位并且定时器被重新加载0或一个特定的重载值。

地址表示

根据微控制器系列,µVision 将不同的存储区域(XDATA / DATA / CODE)映射到一个线性地址范围。这些不同的存储区域在 32 位地址的最高有效字节中用以下值表示:

80166 微控制器:该微控制器具有 16 MB 的线性地址空间。因此,有效地址范围是从 0 到 0x00FFFFFF。不需要不同的内存类型。

8051微控制器

80251 微控制器:除了 8051 系列的存储器类型之外,还可以使用以下类型

SLE66 微控制器:除了 8051 系列的存储器类型之外,还可以使用以下类型

 示例:

AGSI 函数描述

AgsiEntry 是外围 DLL 的唯一函数,可直接从 µVision 仿真器调用。下面描述的所有其他函数都在 µVision 仿真器中,可以从外围 DLL 调用。

定义 SFR、VTR、中断、定时器、菜单、对话框和访问观察窗口的功能。这些函数只能在初始化期间调用。

 读写存储器、SFR 和 VTR 的函数:

检索模拟器状态信息的函数:

控制模拟器的功能:

存储和检索配置信息的功能:

检索符号值或符号名称的函数:

详细函数说明请参见《Application Note 154》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值