技术博客
惊喜好礼享不停
技术博客
ARM仿真工具Softgun的深度解析与实战应用

ARM仿真工具Softgun的深度解析与实战应用

作者: 万维易源
2024-08-27
ARM仿真MMU支持PCI总线NS9750外设代码示例

摘要

Softgun是一款专为ARM嵌入式系统设计的仿真工具,它能够精确模拟ARM9 CPU的行为。除了基本的CPU仿真功能之外,Softgun还支持内存管理单元(MMU),并且兼容多种Netsilicon NS9750外设。更重要的是,这款仿真器还提供了对PCI总线、网络控制器、闪存以及CAN总线的支持,极大地扩展了其应用场景。为了帮助用户更好地理解和使用Softgun,本文将包含丰富的代码示例,展示其在不同场景下的应用。

关键词

ARM仿真, MMU支持, PCI总线, NS9750外设, 代码示例

一、Softgun仿真器的概述与特点

1.1 Softgun仿真器的核心功能

Softgun作为一款专为ARM嵌入式系统打造的仿真工具,其核心功能在于精准地模拟ARM9 CPU的行为。不仅如此,Softgun还具备了一系列高级特性,使其在众多仿真器中脱颖而出。首先,Softgun支持内存管理单元(MMU),这意味着开发者可以在仿真环境中实现复杂的内存管理策略,这对于开发高性能的嵌入式系统至关重要。其次,Softgun兼容多种Netsilicon NS9750外设,这大大增强了其实用性和灵活性。无论是进行硬件测试还是软件开发,Softgun都能提供一个全面且真实的环境。

更值得一提的是,Softgun还提供了对PCI总线的支持,使得开发者可以轻松地集成各种PCI设备,如网络控制器、闪存等。这种高度的兼容性不仅简化了开发流程,还为软硬件协同设计提供了便利。此外,Softgun还支持CAN总线,这对于那些需要实时通信的应用来说是一个巨大的优势。通过这些核心功能,Softgun为开发者创造了一个几乎与真实世界无异的仿真环境,极大地提高了开发效率和产品质量。

1.2 Softgun与ARM9 CPU的兼容性分析

Softgun之所以能够成为ARM嵌入式系统开发者的首选工具之一,很大程度上得益于其与ARM9 CPU的高度兼容性。ARM9 CPU作为一款广泛应用于嵌入式领域的处理器,其性能和功耗表现均十分出色。Softgun通过对ARM9 CPU指令集的精确模拟,确保了在仿真环境中运行的应用程序能够准确反映实际硬件上的行为。

为了进一步提高兼容性,Softgun还特别关注了与ARM9 CPU相关的内存管理单元(MMU)的支持。MMU是现代操作系统中不可或缺的一部分,它负责地址转换、内存保护等功能。Softgun通过内置的MMU支持,使得开发者能够在仿真环境中实现复杂的内存管理策略,这对于开发高性能的嵌入式系统尤为重要。

此外,Softgun还兼容多种Netsilicon NS9750外设,这意味着开发者可以在仿真环境中测试和调试与这些外设相关的应用程序。这种高度的兼容性不仅简化了开发流程,还为软硬件协同设计提供了便利。通过这些兼容性分析,我们可以看到Softgun不仅仅是一款简单的仿真工具,而是一个强大的开发平台,它为嵌入式系统的研发提供了坚实的基础。

二、Softgun的MMU支持与内存管理

2.1 MMU的工作原理

在深入探讨Softgun如何利用MMU之前,我们首先需要理解MMU(Memory Management Unit,内存管理单元)的基本工作原理。MMU是现代计算机系统中一个至关重要的组件,它负责将虚拟地址空间映射到物理地址空间。这一过程不仅包括地址转换,还包括内存保护和缓存一致性维护等功能。对于嵌入式系统而言,MMU的存在使得操作系统能够有效地管理和分配有限的内存资源,从而提高系统的整体性能和安全性。

MMU的核心功能之一是地址转换。在大多数现代操作系统中,程序通常在虚拟地址空间中运行,而MMU则负责将这些虚拟地址转换为实际的物理地址。这一过程通过页表结构来实现,页表记录了虚拟地址与物理地址之间的映射关系。当程序尝试访问某个虚拟地址时,MMU会查找相应的页表项,从中获取对应的物理地址,并完成地址转换。

除了地址转换之外,MMU还承担着内存保护的任务。通过设置不同的权限位,MMU可以控制哪些进程能够访问特定的内存区域。例如,它可以禁止某个进程读取或修改另一个进程的数据段,从而防止潜在的安全漏洞。此外,MMU还可以通过缓存一致性机制来优化多处理器系统中的数据访问速度,确保所有处理器看到的内存状态是一致的。

2.2 Softgun中MMU配置与调试

Softgun作为一款先进的ARM嵌入式系统仿真工具,其MMU支持为开发者提供了强大的内存管理能力。在Softgun中配置和调试MMU,不仅可以帮助开发者深入了解MMU的工作机制,还能显著提升仿真环境的真实性和可靠性。

配置MMU

在Softgun中配置MMU的第一步是定义页表结构。页表通常由一系列页表项组成,每个页表项对应一段连续的虚拟地址空间,并指明这段空间映射到哪个物理地址。Softgun允许用户自定义页表项,这意味着开发者可以根据自己的需求灵活地配置内存布局。

接下来,开发者需要在Softgun中启用MMU支持。这通常涉及到设置一些特定的寄存器值,比如控制寄存器中的MMU使能位。一旦MMU被启用,Softgun就会开始根据定义好的页表进行地址转换。

调试MMU

调试MMU的过程可能会遇到各种问题,比如地址转换错误或内存访问冲突等。Softgun提供了一系列调试工具和日志记录功能,帮助开发者定位这些问题。例如,通过查看MMU产生的异常报告,开发者可以快速找到出错的原因并进行修正。

此外,Softgun还支持模拟MMU故障,这对于测试系统的健壮性和容错能力非常有帮助。通过故意引入错误的页表项或禁用某些MMU功能,开发者可以评估系统在面对MMU故障时的表现,进而采取措施提高系统的稳定性和可靠性。

通过上述步骤,Softgun不仅为开发者提供了一个高度仿真的ARM9 CPU环境,还帮助他们深入理解MMU的工作原理及其在嵌入式系统开发中的重要性。

三、NS9750外设的兼容性测试

3.1 NS9750外设的概述

Netsilicon NS9750是一款高性能的嵌入式处理器,它不仅集成了ARM9 CPU内核,还配备了丰富的外围设备接口,使其成为许多嵌入式应用的理想选择。这些外设包括高速以太网控制器、USB主机/设备接口、SD/MMC存储卡控制器、SPI/I²C/UART串行接口等。这些外设的存在极大地丰富了NS9750的功能性,使其能够适应从工业自动化到消费电子产品的广泛领域。

Softgun仿真器通过模拟NS9750的各种外设,为开发者提供了一个全面的开发环境。这意味着开发者可以在不依赖实际硬件的情况下,进行软件开发、测试和调试。Softgun的这种能力不仅节省了开发成本,还加快了产品上市的速度。通过模拟这些外设,Softgun帮助开发者在早期阶段就能发现并解决潜在的问题,确保最终产品的质量和稳定性。

3.2 Softgun中NS9750外设的配置方法

在Softgun中配置NS9750外设是一项既精细又充满挑战的任务。下面我们将详细介绍几种常见的NS9750外设配置方法,帮助开发者充分利用Softgun的强大功能。

配置以太网控制器

以太网控制器是NS9750的一个关键外设,它使得设备能够连接到局域网或互联网。在Softgun中配置以太网控制器,首先需要设置MAC地址和IP地址。接着,开发者可以通过Softgun提供的API来初始化以太网控制器,并配置相关的中断处理程序。通过这种方式,开发者可以在仿真环境中模拟网络通信,测试网络协议栈的正确性和性能。

配置USB接口

NS9750支持USB主机和设备模式,这使得它能够作为USB主机连接外部设备,或者作为USB设备连接到其他主机。在Softgun中配置USB接口,开发者需要指定USB设备类型(主机或设备),并设置相应的端点和配置信息。Softgun提供了详细的文档和示例代码,帮助开发者快速上手。通过模拟USB通信,开发者可以验证USB驱动程序的正确性,并进行性能调优。

配置存储卡控制器

SD/MMC存储卡控制器是NS9750用于扩展存储容量的重要外设。在Softgun中配置存储卡控制器,开发者需要初始化控制器,并设置正确的时钟频率和数据传输速率。Softgun还支持模拟SD/MMC卡的插入和移除事件,这对于测试文件系统和存储管理软件非常有用。通过这些配置,开发者可以在仿真环境中模拟文件读写操作,确保存储子系统的稳定性和可靠性。

通过以上配置方法,Softgun不仅为开发者提供了一个高度仿真的NS9750外设环境,还帮助他们在开发过程中避免了许多实际硬件带来的限制和挑战。Softgun的这些功能使得开发者能够更加专注于软件的设计和优化,从而加速产品的开发周期。

四、Softgun在PCI总线仿真中的应用

4.1 PCI总线的简介

在探索Softgun仿真器的强大功能之前,让我们先来了解一下PCI总线的基本概念。PCI(Peripheral Component Interconnect,外围部件互连)总线是一种广泛应用于计算机系统的高速总线标准,它为计算机主板上的各种外设提供了统一的接口。自从1992年首次推出以来,PCI总线经历了多个版本的发展,其中最著名的包括PCI、PCI-X和PCI Express(PCIe)。这些标准不仅提高了数据传输速率,还增强了系统的可扩展性和兼容性。

PCI总线的设计初衷是为了满足日益增长的外设需求,尤其是在嵌入式系统领域,PCI总线为网络控制器、闪存和其他高性能外设提供了高效的数据传输通道。它的出现极大地简化了硬件设计,并促进了软硬件协同工作的可能性。对于嵌入式系统开发者而言,了解PCI总线的工作原理和技术细节至关重要,因为这直接影响到系统的性能和稳定性。

4.2 Softgun对PCI总线的支持与操作

Softgun仿真器不仅能够模拟ARM9 CPU的行为,还特别注重对外设的支持,其中包括对PCI总线的强大支持。这一特性使得Softgun成为了开发基于PCI总线外设的嵌入式系统的理想工具。

支持PCI总线的意义

Softgun对PCI总线的支持意味着开发者可以在仿真环境中模拟各种PCI设备,如网络控制器、闪存等。这对于那些希望在没有实际硬件的情况下进行软件开发和测试的团队来说是一个巨大的福音。通过Softgun,开发者可以轻松地模拟PCI设备的行为,测试软件与硬件之间的交互,确保最终产品的可靠性和性能。

Softgun中的PCI总线配置

在Softgun中配置PCI总线相对简单直观。首先,开发者需要在仿真器中启用PCI总线支持,并定义所需的PCI设备。Softgun提供了丰富的API和配置选项,使得这一过程变得非常灵活。例如,开发者可以选择模拟特定型号的网络控制器或闪存设备,并设置它们的参数,如中断向量、基址寄存器等。

操作PCI设备

一旦PCI设备被成功配置,开发者就可以通过Softgun提供的API来操作这些设备。这些API通常包括读写寄存器、发送命令、处理中断等功能。通过这些API,开发者可以在仿真环境中模拟PCI设备的实际操作,测试软件的正确性和性能。

Softgun还支持模拟PCI总线上的错误情况,如设备故障或数据传输错误。这种能力对于测试系统的健壮性和容错能力非常重要。通过故意引入错误,开发者可以评估系统在面对异常情况时的表现,并采取措施提高系统的稳定性和可靠性。

通过Softgun对PCI总线的支持,开发者不仅能够在一个高度仿真的环境中进行开发和测试,还能深入了解PCI总线的工作原理及其在嵌入式系统中的应用。这种深入的理解有助于开发者设计出更加高效、可靠的嵌入式解决方案。

五、网络控制器的仿真与实践

5.1 网络控制器的作用与配置

在网络的世界里,网络控制器扮演着至关重要的角色,它是连接设备与外界的桥梁,让数据得以自由流动。在Softgun仿真环境中,网络控制器不仅是模拟的关键组成部分,更是开发者们探索无限可能的起点。Softgun通过模拟网络控制器,为开发者提供了一个近乎真实的网络环境,让他们能够在无需实际硬件的情况下进行软件开发和测试。

网络控制器的作用

网络控制器是嵌入式系统中不可或缺的一部分,它负责处理数据包的接收和发送,确保数据在网络中的顺畅传输。在NS9750这样的高性能嵌入式处理器中,网络控制器的存在使得设备能够接入局域网或互联网,实现远程监控、数据交换等功能。对于那些依赖于网络通信的应用来说,网络控制器的重要性不言而喻。

配置网络控制器

在Softgun中配置网络控制器,首先需要定义网络控制器的基本属性,如MAC地址和IP地址。接着,开发者可以通过Softgun提供的API来初始化网络控制器,并设置相关的中断处理程序。这一过程虽然看似复杂,但在Softgun详尽的文档和示例代码的帮助下,即使是初学者也能迅速上手。

通过Softgun模拟的网络控制器,开发者可以进行网络协议栈的测试,确保其在各种网络条件下的稳定性和性能。这种模拟环境不仅节省了开发成本,还加快了产品的迭代速度,让开发者能够更加专注于创新而非繁琐的硬件调试。

5.2 在Softgun中实现网络通信

在Softgun仿真环境中实现网络通信,就像是在虚拟世界中搭建起一座桥梁,连接着现实与想象。通过Softgun,开发者不仅能够模拟网络控制器的行为,还能在仿真环境中实现真正的网络通信,这对于测试网络协议栈的正确性和性能至关重要。

实现网络通信的步骤

  • 初始化网络控制器:在Softgun中,开发者首先需要初始化网络控制器,设置MAC地址和IP地址等基本信息。
  • 配置网络协议栈:接下来,通过Softgun提供的API配置TCP/IP协议栈,确保数据包能够正确地封装和解封。
  • 模拟网络通信:最后,通过发送和接收数据包来模拟网络通信,测试网络协议栈的稳定性和性能。

测试网络协议栈

Softgun不仅支持模拟正常的网络通信,还能够模拟各种网络故障情况,如丢包、延迟等。这种能力对于测试系统的健壮性和容错能力至关重要。通过故意引入错误,开发者可以评估系统在面对异常情况时的表现,并采取措施提高系统的稳定性和可靠性。

通过Softgun实现的网络通信,不仅为开发者提供了一个高度仿真的环境,还帮助他们在开发过程中避免了许多实际硬件带来的限制和挑战。Softgun的这些功能使得开发者能够更加专注于软件的设计和优化,从而加速产品的开发周期。在这个虚拟与现实交织的世界里,Softgun正引领着嵌入式系统开发的新篇章。

六、闪存与CAN总线的仿真演示

6.1 闪存仿真步骤详解

在Softgun仿真环境中,闪存仿真不仅是一项关键技术,也是确保嵌入式系统稳定性和可靠性的基石。闪存作为一种非易失性存储介质,在嵌入式系统中扮演着至关重要的角色,它不仅用于存储程序代码,还用于保存系统配置和用户数据。Softgun通过模拟闪存的行为,为开发者提供了一个全面的开发环境,使得他们能够在不依赖实际硬件的情况下进行软件开发和测试。

准备工作

在开始闪存仿真之前,开发者需要准备一些基础材料。首先,确保Softgun仿真器已安装并配置好ARM9 CPU的仿真环境。接着,下载并安装Softgun提供的闪存仿真插件。这些准备工作虽然看似简单,却是确保后续步骤顺利进行的关键。

配置闪存控制器

配置闪存控制器是闪存仿真的第一步。在Softgun中,开发者需要定义闪存的基本属性,如大小、页大小和块大小等。这些参数的选择直接影响到仿真环境的真实性和性能。Softgun提供了丰富的配置选项,使得开发者可以根据自己的需求灵活地调整这些参数。

接下来,通过Softgun提供的API来初始化闪存控制器,并设置相关的中断处理程序。这一过程虽然看似复杂,但在Softgun详尽的文档和示例代码的帮助下,即使是初学者也能迅速上手。通过这些步骤,开发者可以确保闪存在仿真环境中的行为与实际硬件保持一致。

仿真闪存操作

一旦闪存控制器被成功配置,开发者就可以通过Softgun提供的API来进行闪存的操作。这些API通常包括读写数据、擦除扇区等功能。通过这些API,开发者可以在仿真环境中模拟闪存的实际操作,测试软件的正确性和性能。

Softgun还支持模拟闪存的故障情况,如读写错误或擦除失败等。这种能力对于测试系统的健壮性和容错能力非常重要。通过故意引入错误,开发者可以评估系统在面对异常情况时的表现,并采取措施提高系统的稳定性和可靠性。

通过Softgun对闪存的支持,开发者不仅能够在一个高度仿真的环境中进行开发和测试,还能深入了解闪存的工作原理及其在嵌入式系统中的应用。这种深入的理解有助于开发者设计出更加高效、可靠的嵌入式解决方案。

6.2 CAN总线的仿真与调试

CAN(Controller Area Network)总线作为一种高效的现场总线技术,在汽车、工业自动化等领域有着广泛的应用。Softgun仿真器通过模拟CAN总线,为开发者提供了一个全面的开发环境,使得他们能够在不依赖实际硬件的情况下进行软件开发和测试。

CAN总线简介

CAN总线是一种用于实时通信的串行总线标准,它最初是为了满足汽车行业的通信需求而设计的。CAN总线的特点在于其高可靠性、低延迟和灵活的拓扑结构。在嵌入式系统中,CAN总线通常用于连接多个控制单元,实现数据的快速交换。

配置CAN控制器

在Softgun中配置CAN控制器,首先需要定义CAN控制器的基本属性,如波特率、帧格式等。接着,开发者可以通过Softgun提供的API来初始化CAN控制器,并设置相关的中断处理程序。这一过程虽然看似复杂,但在Softgun详尽的文档和示例代码的帮助下,即使是初学者也能迅速上手。

通过Softgun模拟的CAN控制器,开发者可以进行CAN协议的测试,确保其在各种通信条件下的稳定性和性能。这种模拟环境不仅节省了开发成本,还加快了产品的迭代速度,让开发者能够更加专注于创新而非繁琐的硬件调试。

实现CAN通信

在Softgun仿真环境中实现CAN通信,就像是在虚拟世界中搭建起一座桥梁,连接着现实与想象。通过Softgun,开发者不仅能够模拟CAN控制器的行为,还能在仿真环境中实现真正的CAN通信,这对于测试CAN协议的正确性和性能至关重要。

  • 初始化CAN控制器:在Softgun中,开发者首先需要初始化CAN控制器,设置波特率和帧格式等基本信息。
  • 配置CAN协议栈:接下来,通过Softgun提供的API配置CAN协议栈,确保数据帧能够正确地封装和解封。
  • 模拟CAN通信:最后,通过发送和接收数据帧来模拟CAN通信,测试CAN协议栈的稳定性和性能。

测试CAN协议栈

Softgun不仅支持模拟正常的CAN通信,还能够模拟各种通信故障情况,如数据帧丢失、延迟等。这种能力对于测试系统的健壮性和容错能力至关重要。通过故意引入错误,开发者可以评估系统在面对异常情况时的表现,并采取措施提高系统的稳定性和可靠性。

通过Softgun实现的CAN通信,不仅为开发者提供了一个高度仿真的环境,还帮助他们在开发过程中避免了许多实际硬件带来的限制和挑战。Softgun的这些功能使得开发者能够更加专注于软件的设计和优化,从而加速产品的开发周期。在这个虚拟与现实交织的世界里,Softgun正引领着嵌入式系统开发的新篇章。

七、Softgun的代码示例与实战分析

7.1 不同场景下的代码示例展示

在Softgun仿真器的世界里,代码不仅仅是冰冷的字符组合,它们是通往无限可能的钥匙。为了让开发者更好地理解和运用Softgun的各项功能,本节将通过几个精心挑选的代码示例,展示Softgun在不同场景下的应用。这些示例不仅涵盖了基本的配置和操作,还包括了复杂的调试和性能优化技巧,旨在帮助开发者在实际项目中取得成功。

7.1.1 初始化MMU并配置页表

// 初始化MMU
void init_mmunit() {
    // 设置控制寄存器中的MMU使能位
    write_control_register(MMU_ENABLE);
    
    // 定义页表结构
    struct PageTable {
        uint32_t physical_address;
        uint32_t flags; // 权限位
    };
    
    // 创建页表
    PageTable page_table[1024];
    
    // 配置页表项
    for (int i = 0; i < 1024; i++) {
        page_table[i].physical_address = i * 4096; // 假设每页大小为4KB
        page_table[i].flags = PAGE_READ_WRITE | PAGE_USER_ACCESSIBLE;
    }
    
    // 设置页表基地址寄存器
    write_page_table_base((uint32_t)page_table);
}

// 示例调用
init_mmunit();

这段代码展示了如何在Softgun中初始化MMU并配置页表。通过设置控制寄存器中的MMU使能位,开发者可以激活MMU功能。随后,通过定义页表结构并设置页表项,可以实现虚拟地址到物理地址的映射。这种配置方式不仅简化了内存管理,还提高了系统的安全性。

7.1.2 配置以太网控制器并发送数据包

// 初始化以太网控制器
void init_ethernet_controller() {
    // 设置MAC地址
    write_mac_address(0x123456789ABC);
    
    // 设置IP地址
    write_ip_address(0xC0A80101); // 192.168.1.1
    
    // 初始化控制器
    ethernet_init();
    
    // 配置中断处理程序
    set_interrupt_handler(ethernet_isr);
}

// 发送数据包
void send_packet(uint8_t* data, int length) {
    // 构建数据包
    ethernet_packet packet;
    packet.data = data;
    packet.length = length;
    
    // 发送数据包
    ethernet_send(&packet);
}

// 示例调用
init_ethernet_controller();
send_packet((uint8_t*)"Hello, World!", 13);

这段示例代码展示了如何在Softgun中配置以太网控制器并发送数据包。通过初始化控制器、设置MAC地址和IP地址,开发者可以为网络通信做好准备。接着,通过发送数据包函数,可以模拟网络数据的传输过程。这种模拟不仅有助于测试网络协议栈的正确性,还能评估其性能表现。

7.2 代码调试验证与性能分析

在开发过程中,代码调试和性能分析是必不可少的环节。Softgun仿真器不仅提供了丰富的调试工具,还支持性能监控功能,帮助开发者找出瓶颈并优化代码。

7.2.1 使用Softgun进行代码调试

// 示例代码:检测内存访问错误
void check_memory_access() {
    uint32_t* ptr = (uint32_t*)0x1000; // 假设0x1000处未分配内存
    *ptr = 0x12345678; // 尝试写入未分配内存
    
    // Softgun将在此处触发内存访问异常
    // 开发者可以通过Softgun提供的异常报告定位问题
}

通过这段示例代码,我们可以看到如何在Softgun中检测内存访问错误。当尝试写入未分配的内存时,Softgun会触发内存访问异常,并生成详细的异常报告。开发者可以根据这些报告快速定位问题所在,并采取相应措施进行修复。

7.2.2 性能分析与优化

// 示例代码:测量函数执行时间
void measure_function_time(void (*func)()) {
    uint32_t start_time = get_current_time(); // 获取当前时间
    func(); // 执行函数
    uint32_t end_time = get_current_time(); // 再次获取时间
    uint32_t elapsed_time = end_time - start_time; // 计算时间差
    
    // 输出执行时间
    printf("Function took %d ms to execute.\n", elapsed_time);
}

// 示例函数
void example_function() {
    // 执行一些计算密集型任务
    for (int i = 0; i < 1000000; i++) {
        int result = i * i;
    }
}

// 示例调用
measure_function_time(example_function);

这段示例代码展示了如何使用Softgun进行性能分析。通过测量函数执行时间,开发者可以评估代码的效率,并找出潜在的性能瓶颈。这种分析对于优化代码至关重要,特别是在资源受限的嵌入式系统中。

通过这些示例,我们不仅看到了Softgun在不同场景下的强大功能,还体会到了代码调试和性能分析的重要性。Softgun不仅是一个仿真工具,更是一个帮助开发者不断进步的伙伴。在这个充满挑战的旅程中,Softgun将始终陪伴左右,助力每一位开发者实现梦想。

八、总结

Softgun作为一款专为ARM嵌入式系统设计的高级仿真工具,凭借其对ARM9 CPU的精确模拟、MMU的支持以及对多种Netsilicon NS9750外设的兼容性,在嵌入式开发领域展现出了非凡的价值。通过本文的介绍,我们了解到Softgun不仅支持PCI总线、网络控制器、闪存以及CAN总线等多种外设,还提供了丰富的代码示例,帮助开发者在不同场景下进行高效开发和测试。Softgun的强大功能不仅简化了开发流程,还为软硬件协同设计提供了便利,极大地提高了开发效率和产品质量。总之,Softgun是一款不可或缺的工具,它为嵌入式系统的研发提供了坚实的基础和支持。