嵌入式系统程序设计.ppt

上传人:wj 文档编号:8907758 上传时间:2023-05-16 格式:PPT 页数:145 大小:3.92MB
下载 相关 举报
嵌入式系统程序设计.ppt_第1页
第1页 / 共145页
嵌入式系统程序设计.ppt_第2页
第2页 / 共145页
嵌入式系统程序设计.ppt_第3页
第3页 / 共145页
嵌入式系统程序设计.ppt_第4页
第4页 / 共145页
嵌入式系统程序设计.ppt_第5页
第5页 / 共145页
嵌入式系统程序设计.ppt_第6页
第6页 / 共145页
嵌入式系统程序设计.ppt_第7页
第7页 / 共145页
嵌入式系统程序设计.ppt_第8页
第8页 / 共145页
嵌入式系统程序设计.ppt_第9页
第9页 / 共145页
嵌入式系统程序设计.ppt_第10页
第10页 / 共145页
嵌入式系统程序设计.ppt_第11页
第11页 / 共145页
嵌入式系统程序设计.ppt_第12页
第12页 / 共145页
嵌入式系统程序设计.ppt_第13页
第13页 / 共145页
嵌入式系统程序设计.ppt_第14页
第14页 / 共145页
嵌入式系统程序设计.ppt_第15页
第15页 / 共145页
嵌入式系统程序设计.ppt_第16页
第16页 / 共145页
嵌入式系统程序设计.ppt_第17页
第17页 / 共145页
嵌入式系统程序设计.ppt_第18页
第18页 / 共145页
嵌入式系统程序设计.ppt_第19页
第19页 / 共145页
嵌入式系统程序设计.ppt_第20页
第20页 / 共145页
亲,该文档总共145页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

嵌入式系统程序设计.ppt

《嵌入式系统程序设计.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统程序设计.ppt(145页珍藏版)》请在冰点文库上搜索。

嵌入式系统程序设计.ppt

任课教师:

栗华,课号:

0123305810-100,嵌入式系统原理及应用教程,第四章嵌入式系统程序设计,本章包含嵌入式系统开发平台介绍,嵌入式汇编程序设计,嵌入式C语言程序设计及混合编程。

本章内容,4.1嵌入式系统开发流程4.2ARM开发软件及实用工具介绍4.3ARM汇编语言程序设计基础4.4ARMC语言程序设计及混合编程,1、嵌入式系统开发基本流程,嵌入式开发的具体过程:

系统定义与需求分析阶段方案设计阶段详细设计阶段软硬件集成测试阶段系统功能性能测试及可靠性测试阶段,4.1嵌入式系统开发流程,开发流程图,2.嵌入式软件开发环境,嵌入式开发环境组成交叉开发环境软件模拟环境目标板与评估板,交叉开发环境,嵌入式系统应用软件的开发属于跨平台开发,因此需要一个交叉开发环境。

交叉开发是指在一台通用计算机上进行软件的编辑编译,然后下载到嵌入式设备中运行调试的开发方式,它通常采用宿主机/目标机模式。

用来开发的通用计算机可以选用比较常见的PC机等,运行通用的Windows等操作系统。

开发计算机一般称宿主机,嵌入式设备称为目标机,在宿主机上编译好的程序,下载到目标机上运行,交叉开发环境提供调试工具对目标机上运行的程序进行调试。

交叉开发环境,交叉开发环境一般由运行于宿主机上的交叉开发软件、宿主机到目标机的调试通道组成。

运行于宿主机上的交叉开发软件最少必须包含编译调试模块,其编译器为交叉编译器。

作为宿主机的一般为基于x86体系的桌上型计算机,而编译出的代码必须在目标机处理器体系结构上运行,这就是所谓的交叉编译了。

在宿主机上编译好目标代码后,通过宿主机到目标机的调试通道将代码下载到目标机,然后由运行于宿主机的调试软件控制代码在目标机上运行调试。

远程调试结构图,3.嵌入式应用软件开发的基本流程,软件模拟环境也称为指令集模拟器IIS(InstructionSetSimulator),在很多时候为保证项目进度,硬件和软件开发往往同时进行,这时作为目标机的硬件环境还没有建立起来,软件的开发就需要一个模拟环境来进行调试。

模拟开发环境建立在交叉开发环境基础之上,是对交叉开发环境的补充。

这时,除了宿主机和目标机之外,还需要提供一个在宿主机上模拟目标机的环境,使得开发好的程序直接在这个环境里运行调试。

软件模拟环境,应用目标板是系统最终的电路板。

评估板(EVM板)一般用来作为开发者使用的学习板、实验板,可以作为应用目标板出来之前的软件测试、硬件调试的电路板。

开发评估电路板并不是嵌入式应用开发必须的,对于有经验的工程师完全可以自行独立设计自己的应用电路板和根据开发需要设计实验板。

好的评估电路板一般文档齐全,对处理器的常用功能模块和主流应用都有硬件实现,并提供电路原理图和相关开发例程与源代码供用户设计自己的应用目标板和应用程序作参考。

目标板与评估板,在嵌入式软件的开发过程中,在确保软件的正确性、实时性的前提下,必须关注软件的可移植性和可重用性。

可移植性和可重用性的程度应该根据实际的应用情况来考虑。

因为嵌入式应用软件有自身的许多特点。

追求过高的可移植性和可重用性可能会恶化应用软件的实时性能和增加软件的代码量,这对于资源有限的嵌入式应用环境是得不偿失的。

我们可以在资源有限、满足系统的需求的情况下尽可能把可移植性和可重用性作为第二目标,致力于开发正确性、实时性能、代码量、可移植性和可重用性相对均衡的嵌入式应用软件。

4.嵌入式软件开发的可移植性和可重用性,4.嵌入式软件开发的可移植性和可重用性,提高应用软件的可移植性和可重用性的方法:

多用高级语言少用汇编语言将不可移植部分局域化提高代码的可重用性提高代码的可重用性,一、编译器介绍1、ADS1.22、ARMREALVIEWDEVELOPERSUITE3、IAREWARM4、KEILARM-MDKARM5、WINARM(GCCARM)二、相关开发工具介绍1、简易的JTAG制作2、H-JTAG调试代理3、LPC2000系列ISP工具4、MacraigorSystemsWiggler调试工具5、J-LINK6、U-LINK,4.2,1、ADS1.2ADS(ARMDeveloperSuite),是在1993年由Metrowerks公司开发是ARM处理器下最主要的开发工具。

他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。

ADS包括了四个模块分别是:

SIMULATOR;C编译器;实时调试器;应用函数库。

ADS对汇编、C/C+、java支持的均很好,是目前最成熟的ARM开发工具。

很多ARM开发软件(例如Keil)也是借用的ADS的编译器。

ADS在2006年版本已经发布到2.2。

但国内大部分开发者使用的均是1.2版本,一、编译器介绍,ADS1.2提供完整的WINDOWS界面开发环境。

C编译器效率高,支持c以及c+。

提供软件模拟仿真功能,使没有Emulators的学习者也能够熟悉ARM的指令系统。

配合FFT-ICE使用,ADS1.2提供强大的实时调试跟踪功能,片内运行情况尽在掌握。

ADS1.2需要硬件支持才能发挥强大功能。

目前支持的硬件调试器有Multi-ICE以及兼容Multi-ICE的调试工具如FFT-ICE。

版本:

ADS1.2软件大小:

130M下载地址:

http:

/,ARMRealViewDeveloperSuite(RVDS)是ARM公司继ARMDeveloperSuite(ADS1.2)之后推出的新一代开发工具,是业界公认最好的ARM编译器之一。

它由RealView编译器(RVCT),以及RealView调试器(RVDebugger),CodeWarrior集成开发环境和ARMulator指令集仿真器组成。

可以支持所有标准ARM架构和内核,针对特定处理器进行代码优化,有多种可以灵活配置的优化选项以取得最小的代码尺寸和最好的性能。

2、ARMRealViewDeveloperSuite(RVDS),RealViewICE主要特点:

高性能的调试控制通过RealViewDebugger代码下载速度可达1300Kbytes/秒高速单步执行,每秒可达100支持JTAG调试通信通道(DCC)支持多种JTAG时钟频率,从2KH50MHZ更低的JTAG时钟频率(低于1KHZ),支持ASIC外围电路调试宽电压支持1.05.0V支持多核处理器调试,同步控制配合RealViewTrace模块插件可捕获支持ETM跟踪数据通过JTAG访问ETB跟踪数据兼容GDB与KGDB调试支持USB1.1与2.0连接支持网络连接调试10/100baseT支持的ARM处理器:

ARM7TM,ARM9TM,ARM9ETM,ARM10TM,ARM11TM和CortexTM,RealViewTrace主要特性:

非插入式的实时指令跟踪与数据跟踪,跟踪频率可高达250MHZ,高达8百万帧深度的跟踪缓冲区(高达4百万帧深度的timestamp缓冲区)48位timestamp,10纳秒分辨率,支持最长连续32天数据跟踪4/8/16位数据宽度跟踪端口外部事件同步触发器完全可变的触发位置快速on-the-fly跟踪数据上传与主机共享RealViewICE连接支持ETM跟踪端口模式支持v1.x,v2.x,v3.xforETM7TMETM9TM,ETM10TM与ETM11TM等ETM协议单边沿和双边沿时钟触发普通与多元的端口,库创建工具内容丰富的在线文档版本:

ARMRealViewDeveloper2.2软件大小:

500M下载地址:

http:

/,EmbeddedWorkbenchforARM是IARSystems公司为ARM微处理器开发的一个集成开发环境(下面简称IAREWARM)。

比较其他的ARM开发环境,IAREWARM具有入门容易、使用方便和代码紧凑等特点。

EWARM中包含一个全软件的模拟程序(simulator)。

用户不需要任何硬件支持就可以模拟各种ARM内核、外部设备甚至中断的软件运行环境。

从中可以了解和评估IAREWARM的功能和使用方法。

最新版本是:

IAREmbeddedWorkbenchforARMversion4.30。

3、IAREWARM,IAREWARM的主要特点如下:

1、高度优化的IARARMC/C+Compiler2、IARARMAssembler3、一个通用的IARXLINKLinker4、IARXAR和XLIB建库程序和IARDLIBC/C+运行库5、功能强大的编辑器6、项目管理器7、命令行实用程序8、IARC-SPY调试器(先进的高级语言调试器)版本:

IAREWARM4.40a软件大小:

93M下载地址:

http:

/,Keil公司已从事MCS-51开发平台uVision著名。

近年来,Keil公司也将自己的领域扩展到了ARM的开发工具,即:

keilarm,再后来keil真的被arm收购了,他的arm开发工具这一块就是现在的MDK系列。

KeiluVision调试器可以帮助用户准确地调试ARM器件的片内外围功能(I2C、CAN、UART、SPI、中断、I/O口、A/D转换器、D/A转换器和PWM模块等功能)。

KeilMDK-ARM最新版本4.54,安装包500多兆,包括ARM的编译器和uVision4集成开发环境。

4、KEILARM-MDKARM,MDK-ARM具有四种版本:

MDK-Lite、MDK基础版、MDK标准版和MDK专业版。

所有版本都提供完整的C/C+开发环境,MDK专业版包括丰富的中间件库。

Project/Target/Group/File的重叠管理模式,并可逐级设置;高度智能彩色语法显示;,4、KEILARM-MDKARM,特点完全支持ARMCortex-M系列、Cortex-R4、ARM7和ARM9设备行业领先的ARMC/C+编译工具链Vision4IDE、调试器和模拟环境支持来自20多个供应商的1200多种设备,特点KeilRTX确定性、占用空间小的实时操作系统(具有源代码)TCP/IP网络套件提供多个协议和各种应用程序USB设备和USB主机堆栈配备标准驱动程序类ULINKpro支持对正在运行的应用程序进行即时分析并记录执行的每条Cortex-M指令有关程序执行的完整代码覆盖率信息执行性能分析器和性能分析器支持程序优化大量示例项目可帮您快速熟悉强大的内置功能符合CMSISCortex微控制器软件接口标准,多种流行编译工具选择Keil高效率C编译器;ARM公司的ADS/RealView编译器;GNUGCC编译器;后续厂商的编译器。

官方网址:

WINARM是一个免费的开发工具。

WinARM可以在http:

/www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/下载得到,里面除了包含C/C+编译器GCC,汇编、连接器Binutils,调试器GDB等工具,也包括了通过GDB使用WigglerJTAG的软件OCDRemote。

所以,所需要的工具都包括在了这个WinARM发行版中,就可以比较省心了。

官方发布网址:

http:

/www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/软件大小:

90M下载地址:

WinARM20060606zip-Archiveherehttp:

/www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/WinARM-20060606.zipWINARM简易使用说明:

http:

/,5、WINARM-GCCARM,1、JTAG仿真器JTAG(JointTestActionGroup;联合测试行动小组)是一种国际标准测试协议(IEEE1149.1兼容),主要用于芯片内部测试及对系统进行仿真、调试。

JTAG技术是一种嵌入式调试技术,它在芯片内部封装了专门的测试电路TAP(TestAccessPort,测试访问口),通过专用的JTAG测试工具对内部节点进行测试。

JTAG接口还常用于实现ISP(In-SystemProgrammer,在系统编程),对FLASH等器件进行编程。

二、相关开发工具,1、JTAG仿真器通常所说的JTAG大致分两类,一类用于测试芯片的电气特性,检测芯片是否有问题;一类用于Debug,一般支持JTAG的CPU内都包含了这两个模块。

一个含有JTAGDebug接口模块的CPU,只要时钟正常,就可以通过JTAG接口访问CPU的内部寄存器和挂在CPU总线上的设备,如FLASH,RAM,SOC(比如4510B,44Box,AT91M系列)内置模块的寄存器,象UART,Timers,GPIO等等的寄存器。

现在多数的高级器件都支持JTAG协议,如:

新型单片机如MSP430、ARM、DSP、FPGA器件等。

标准的JTAG接口是4线:

TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。

二、相关开发工具,标准的JTAG接口是4线:

TMS、TCK、TDI、TDO,分别为测试模式选择、测试时钟、测试数据输入和测试数据输出。

如今JTAG接口的连接有两种标准,即14针接口和20针接口,其定义分别如下所示。

14针的JTAG接口为老式接口。

引脚信号说明,SAMSUNGARM7S3C44B0开发套件中的JTAG编程板电路如图,PC并口引脚:

2348,JTAG引脚:

TCKTMSnSRSTTDI,引脚对应关系:

S3C2440的官方JTAG编程板,PC并口引脚:

23411,JTAG引脚:

TCKTDITMSTDO,引脚对应关系:

J-Link是SEGGER公司为支持仿真ARM内核芯片推出的采用USB接口的JTAG仿真器。

配合IAREWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9/ARM11,CortexM0/M1/M3/M4,CortexA4/A8/A9等内核芯片的仿真,与IAR,Keil等编译环境无缝连接,操作方便、连接方便、简单易学,是学习开发ARM最好最实用的开发工具。

2、J-LINK仿真调试器,J-LinkARM主要特点:

IAREWARM集成开发环境无缝连接的JTAG仿真器。

支持CPUs:

AnyARM7/9/11,Cortex-A5/A8/A9,Cortex-M0/M1/M3/M4,Cortex-R4,RX610,RX621,RX62N,RX62T,RX630,RX631,RX63N。

下载速度高达1MByte/s。

最高JTAG速度15MHz。

目标板电压范围1.2V3.3V,5V兼容。

自动速度识别功能。

监测所有JTAG信号和目标板电压。

完全即插即用。

使用USB电源(但不对目标板供电)带USB连接线和20芯扁平电缆。

支持多JTAG器件串行连接。

标准20芯JTAG仿真插头。

选配14芯JTAG仿真插头。

选配用于5V目标板的适配器。

带J-LinkTCP/IPserver,允许通过TCP/IP网络使用J-Link。

KeilULINKUSB接口仿真器,是一款多功能ARM调试工具,可以通过JTAG或CODS接口连接到目标系统,进行仿真或下载程序,目前已经成为国内主流的ARM开发工具。

KeilULINK的软件环境为KeiluVisionKeil系列软件具有良好的调试界面,优秀的编译效果,丰富的使用资料。

使其深受国内嵌入式开发工程师的喜爱。

目前,ULINK已经停产,新用户推荐选择ULINK2或ULINKPro仿真器。

3、U-LINK仿真调试器,ULINK2是ARM公司最新推出的配套RealViewMDK使用的仿真器,是ULink仿真器的升级版本。

ULINK2不仅具有ULINK仿真器的所有功能,还增加了串行调试(SWD)支持,返回时钟支持和实时代理等功能。

开发工程师通过结合使用RealViewMDK的调试器和ULINK2,可以方便的在目标硬件上进行片上调试(使用on-chipJTAG,SWD和OCDS)、Flash编程.,3、U-LINK仿真调试器,支持ARM7,ARM9,Cortex-M,8051和C166设备JTAG速度高达10MHz支持Cortex-M串行查看器(SWV)数据和时间跟踪,速度高达1Mbit/s(UART模式)执行、端口仿真和串行调试输出时的存储器读写实时代理与KeilVisionIDE和Debugger无缝隙集成宽目标电压,从2.7V5.5V可用USB供电(无须电源)使用标准WindowsUSB设备,即插即用安装目标连接器,ULINK2特点:

ULINK是KEIL公司开发的仿真器,专用于KEIL平台下使用,ADS,IAR下不能使用JLINK是通用的开发工具,可以用于KEIL,IAR,ADS等平台速度,效率,功能均比ULINK强ULINK2的下载速度和调试速度确实没有JLINK的快。

ULINK和JLINK的比较,4.3ARM汇编语言程序设计基础,ARM汇编语言的伪操作、宏指令与伪指令ARM7汇编语言程序设计步骤ARM7汇编语言程序设计,4.3.1ARM汇编语言的伪操作、宏指令与伪指令,ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成伪操作是ARM汇编语言程序里的一些特殊指令助记符,它的作用主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行。

3.3.1ARM汇编语言的伪操作、宏指令与伪指令,宏指令是一段独立的程序代码,可以插在源程序中,它通过伪操作来定义。

宏在被使用之前必须提前定义好,宏之间可以互相调用,也可以自己递归调用。

通过直接书写宏名来使用宏,并根据宏指令的格式设置相应的输入参数。

宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。

伪指令也是ARM汇编语言程序里的特殊指令助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正指令操作。

两种编译模式的集成开发环境IDE介绍,ADS/SDTIDE开发环境它由ARM公司开发,使用了CodeWarrior公司的编译器;集成了GNU开发工具的IDE开发环境它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。

ADS编译环境下的ARM伪操作和宏指令,ADS编译环境下的伪操作有如下几种:

符号定义(SymbolDefinition)伪操作数据定义(DataDefinition)伪操作汇编控制(AssemblyControl)伪操作框架描述(FrameDescription)伪操作信息报告(Reporting)伪操作其他(Miscellaneous)伪操作,4.3.1.1符号定义伪操作,1.全局变量定义伪指令GBLA、GBLL、GBLS2.局部变量定义伪指令LCLA、LCLL、LCLS3.变量赋值伪指令SETA、SETL、SETS4.寄存器列表定义伪指令RLIST,1.GBLA,GBLL及GBLS,GBLA,GBLL及GBLS伪操作用于声明一个ARM程序中的全局变量并在默认情况下将其初始化。

GBLA伪操作声明一个全局的算术变量,并将其初始化成0GBLL伪操作声明一个全局的逻辑变量,并将其初始化成FALSEGBLS伪操作声明一个全局的字符串变量,并将其初始化成空串“”语法格式Variable其中:

是GBLA,GBLL或GBLS3种伪操作之一;Variable是全局变量的名称。

在其作用范围内必须惟一,即同一个变量名只能在作用范围内出现一次。

使用示例,GBLAA1;定义一个全局的数值变量,变量名为A1A1SETA0x0F;将该变量赋值为0x0FGBLLA2;定义一个全局的逻辑变量,变量名为A2A2SETLTRUE;将该变量赋值为真GBLSA3;定义一个全局的字符串变量,变量名为A3A3SETS“Testing”;将该变量赋值为“Testing”,2.LCLA,LCLL及LCLS,LCLA,LCLL及LCLS伪操作用于声明一个ARM程序中的局部变量,并在默认情况下将其初始化。

LCLA伪操作声明一个局部的算术变量,并将其初始化成0。

LCLL伪操作声明一个局部的逻辑变量,并将其初始化成FALSELCLS伪操作声明一个局部的串变量,并将其初始化成空串“”语法格式Variable其中:

是LCLA,LCLL或LCLS3种伪操作之一;Variable是局部变量的名称。

在其作用范围内必须唯一,即同一个变量名只能在作用范围内出现一次。

使用示例:

LCLATest4;声明一个局部的数值变量,变量名为Test4Test4SETA0xaa;将该变量赋值为0xaaLCLLTest5;声明一个局部的逻辑变量,变量名为Test5Test5SETLTRUE;将该变量赋值为真LCLSTest6;定义一个局部的字符串变量,变量名为Test6Test6SETS“Testing”;将该变量赋值为“Testing”,3.SETA,SETL及SETS,SETA,SETL及SETS伪操作用于给一个ARM程序中的全局或局部变量赋值。

SETA伪操作给一个全局或局部算术变量赋值SETL伪操作给一个全局或局部逻辑变量赋值SETS伪操作给一个全局或局部字符串变量赋值语法格式Variableexpr其中:

是SETA,SETL或SETS3种伪操作之一;Variable是使用GBLA,GBLL,GBLS,LCLA,LCLL或LCLS定义的变量的名称,在其作用范围内必须唯一;expr为表达式,即赋予变量的值。

4寄存器列表定义伪指令RLIST,格式:

名称RLIST通用寄存器列表功能:

用于对一个通用寄存器列表定义名称,reglistRLISTR0-R3,R8,R12STMFDSP!

reglist;将列表reglist存储到堆栈中LDMIAR4,reglist;将列表reglist加载到R4中,4.3.1.2数据定义伪操作,1.定义字节存储单元伪操作DCB2.定义半字存储单元伪操作DCW(DCWU)3.定义字存储单元伪操作DCD(DCDU)4.为单精度浮点数定义字存储单元伪操作DCFS(DCFSU)5.为双精度浮点数定义字存储单元伪操作DCFD(DCFDU)6.内存单元分配伪操作SPACE7.定义结构化内存表首地址伪操作MAP8.定义结构化内存表中数据域伪操作FIELD9.定义文字池伪操作LTORG,1.DCB,格式:

标号DCB表达式功能:

DCB伪操作用于分配一片连续的字节存储单元并用伪操作中指定的表达式初始化。

其中,表达式可以为0255的数值或字符串。

DCB也可用“=”代替,2.DCW(DCWU),格式:

标号DCW(或DCWU)表达式功能:

DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用伪操作中指定的表达式初始化。

其中,表达式可以为程序标号或数值表达式。

用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格按照半字对齐。

3.DCD(或DCDU),格式:

标号DCD(或DCDU)表达式功能:

DCD(或DCDU)伪操作用于分配一片连续的字存储单元并用伪操作中指定的表达式初始化。

其,表达式可以为程序标号或数值表达式。

DCD也可用“&”代替。

用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格按照字对齐。

使用示例:

StrDCB“Thisisatest!

”;分配一片连续的字节存储单元并初始化。

DataTestDCW1,2,3;分配一片连续的半字存储单元并初始化。

DataTestDCD

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2