欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    嵌入式基于ARM9的中断驱动程序设计课程设计.docx

    • 资源ID:8941573       资源大小:290.15KB        全文页数:28页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式基于ARM9的中断驱动程序设计课程设计.docx

    1、嵌入式基于ARM9的中断驱动程序设计课程设计嵌入式基于ARM9的中断驱动程序设计摘 要随着移动设备的流行和发展,嵌入式系统已经成为一个热点。当前,嵌入式技术的应用越来越广泛,从航天科技到民用产品,嵌入式产品的身影无处不在,而这些嵌入式产品的核心处理器决定了产品的市场和性能。在32位嵌入式处理器市场中,ARM处理器占有很大的份额。而嵌入式系统的功能越来越强大,实现也越来越复杂,随之出现的就是可靠性大大降低。本文所要研究的就是基于ARM嵌入式系统的中断处理程序设计与实现。关键字:嵌入式,ARM,中断目 录第1章 设计目的 1第2章 设计思路 22.1 ARM实验箱硬件资源概述 22.2 ARM的中

    2、断原理 3第3章 关键技术 43.1 arm9处理器 43.2 嵌入式C语言开发技术 53.3 ADS开发环境 63.4 中断流程 73.5 数据结构 83.5.1 中断优先级产生模块 83.5.2 中断优先级 83.6 寄存器工作原理 93.6.1 程序状态存储器PSR 93.6.2 中断模式 93.6.3 中断请求寄存器 103.6.4 中断屏蔽寄存器 103.7 实验详解 103.7.1 源请求寄存器SRCPND 103.7.2 中断模式寄存器INTMOD 123.7.3 中断屏蔽寄存器INTMSK 123.7.4 中断请求寄存器INTPND 133.7.5 中断偏移寄存器INTOFFS

    3、ET 133.7.6 子中断源请求寄存器SUBSRCPND 133.7.7 子中断屏蔽寄存器INTSUBMSK 14第4章 程序流程 15第5章 主要源代码 165.1 主函数设计 165.2 核心板的初始化 165.3 定时器初始化程序 17第6章 运行结果及结论 186.1 运行结果 186.2 结论 18参考文献 19第1章 设计目的通过本次课程设计,能够熟悉基于ARM微处理器的嵌入式系统开发的过程,掌握嵌入式系统开发的知识。能够熟练掌握ARM9的中断原理,能够对S3C2410的中断资源及其相关中断寄存器进行合理配置,同时掌握S3C2410的中断编程方法。第2章 设计思路2.1 ARM实

    4、验箱硬件资源概述EL-ARM-830型教学实验系统属于一种综合的教学实验系统,该系统采用了目前在国内普遍认同的ARM920T核,32位微处理器,实现了多模块的应用实验。它是集学习、应用编程、开发研究于一体ARM实验教学系统。用户可根据自己的需求选用不同类型的CPU适配板,兼容ARM7与ARM9,而不需要改变任何配置,同时,实验系统上的Tech_V总线能够拓展较为丰富的实验接口板。用户在了解Tech_V标准后,更能研发出不同用途的实验接口板。除此之外,在实验板上有丰富的外围扩展资源(数字、模拟信号发生器,数字量IO输入输出,语音编解码、人机接口等单元),可以完成ARM的基础实验、算法实验和数据通

    5、信实验、以太网实验9。图2.1 EL-ARM-830实验教学系统的功能框图2.2 ARM的中断原理在ARM中,有两类中断,一类是IRQ,一类是FIQ,IRQ是普通中断,FIQ是快速中断,在进行大批量的复制、数据转移等工作时,常使用此类中断。FIQ的优先级高于IRQ。同时,它们都属于ARM的异常模式,当一旦有中断发生,不管是外部中断,还是内部中断,正在执行的程序都会停下,PC指针进而跳入异常向量的地址处,若是IRQ中断,则PC指针跳到0x18处,若是FIQ中断,则跳到0x1C处。异常向量地址处,一般存有中断服务子程序的地址,所以,接下来PC指针跳入中断服务子程序中。当完成中断服务子程序后,PC指

    6、针会返回到被打断的程序的下一条地址处,继续执行程序。这就是ARM中断操作的基本原理8。但是,通常由于生产ARM处理器的各厂家都集成了很多中断请求源,比如,串口中断、AD中断、外部中断、定时器中断、DMA中断等等,所以,很多中断可能同时请求中断,因此,为区分它们,更准确的完成任务,这些中断都有相应的优先级别,以及当发生中断时,它们都有相应的中断标志位,通过在发生中断是判断中断优先级,和访问中断标志位的状态来识别到底哪一个中断发生了。第3章 关键技术3.1 arm9处理器新一代的ARM9处理器,通过全新的设计,采用了更多的晶体管,能够达到两倍以上于ARM7处理器的处理能力。这种处理能力的提高是通过

    7、增加时钟频率和减少指令执行周期实现的。ARM9系列包括三种处理器:ARM926EJ-S、ARM946E-S和ARM968E-S1。1、 时钟频率的提高ARM7处理器采用3级流水线,而ARM9采用5级流水线。增加的流水线设计提高了时钟频率和并行处理能力。5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内同时有5个指令在执行。2、 指令周期的改进指令周期的改进对于处理器性能的提高有很大的帮助。性能提高的幅度依赖于代码执行时指令的重叠,这实际上是程序本身的问题。对于采用最高级的语言,一般来说,性能的提高在30%左右。a) loads指令和stores指令指令周期数的改进最明显的是

    8、loads指令和stores指令。从ARM7到ARM9这两条指令的执行时间减少了30%。指令周期的减少是由于ARM7和ARM9两种处理器内的两个基本的微处理结构不同所造成的。ARM9有独立的指令和数据存储器接口,允许处理器同时进行取指令和读写数据。这叫做改进型哈佛结构。而ARM7只有数据存储接口,它同时用来取指令和数据访问。5级流水线引入了独立的存储器和写回流水线,分别用来访问存储器和将结果写回寄存器。b) 互锁技术当指令需要的数据因为以前的指令没有执行完而没有准备好就会产生管道互锁。当管道互锁发生时,硬件会停止这个指令的执行,直到数据准备好为止。虽然这种技术会增加代码执行时间,但是为初期的设

    9、计者提供了巨大的方便。编译器以及汇编程序员可以通过重新设计代码的顺序或者其它方法来减少管道互锁的数量。c) 分支指令ARM9和ARM7的分支指令周期是相同。而且ARM9TDMI和ARM8E-S并没有对分支指令进行预测处理。3、 ARM9特点7以ARM9E-S为例介绍ARM9处理器的特点。其主要特点如下:a) 32bit定点RISC处理器,改进型ARM/Thumb代码交织,增强性乘法设计。支持实时(real-time)调试;b) 片内指令和数据SRAM,而且指令和数据的存储器容量可调;c) 片内指令和数据告诉缓冲器(cache)容量从4K字节到1M字节;d) 设置保护单元(protcction

    10、unit),非常适合嵌入式应用中队存储器进行分段和保护;e) 采用AMBA AHB总线接口,为外设提供统一的地址和数据总线;f) 支持外部协处理器,指令和数据总线有简单的握手信令支持;g) 支持标准基本逻辑单元扫描测试方法学,而且支持BIST;h) 支持嵌入式跟踪宏单元,支持实时跟踪指令和数据。3.2 嵌入式C语言开发技术不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,由于汇编语言开发的复杂性,它并不是嵌入式系统开发的一般选择。而与之相比,C语言一种“高级的低级”语言,则成为嵌入式系统开发的最佳选

    11、择3。在C语言中,宏是产生内嵌代码的唯一方法,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。嵌入式开发的核心就是利用最少的资源最高的效的实现所需功能。C语言在嵌入式中控制系统开发中的优势汇编语言有其执行效率高的优点,但其可移植性和可读性差,以及它本身就是一种编程 效率低下的低级语言,这些都使他的编程和维护极不方便,从而导致整个系统的可靠性也较差,而使用C语言进行嵌入式控制系统的开发,有着汇编语言不可比拟的优势。1、 编程调试灵活方便C语言具有灵的编程方式,当前几乎看了所有的嵌入式控制系统都有相应的C语言级别的仿真调试系统,使得调试十分方便。2、 生成的代码编译效率高。3

    12、、 编写的程序完全模块化。4、 可移植性好一种语言所编写的C语言程序,只需将部分与相关的地方进行适度的修改,就可方便的移植到另外一种系列上。5、 便与项目维护管理用C语言发的代码便与开发小组计划项目,灵活管理,分工工作,以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级带来影响。3.3 ADS开发环境ADS(ARM Developer Suite),是在1993年由Metrowerks公司开发,是ARM处理器下最重要的开发工具。ADS是全套的实时开发软件工具,包编译器生成的代码密度和执行速度优异。可快速低价地创建ARM结构应用。ADS对汇编、C/C+、java支持的均很好,

    13、是目前最成熟的ARM开发工具。很多ARM开发软件也是借用的ADS的编译器2。1、 ADS包括三种调试器:AXD(ARM eXtended Debugger):ARM扩展调试器;Armsd(ARM Symbolic Debugger):ARM符号调试器;与老版本兼容的Windows或Unix下的ARM调试工具,ADW/ADU(Application Debugger Windows/Unix)。其中AXD不仅拥有低版本ARM调试器的所有功能,还新添了图形用户界面,更方便的视窗管理数据显示,格式化和编辑以及全套的命令行界面。该产品还包括RealMonitorTM(可以再前台调试的同时断点续存并且在

    14、不中断应用的情况下读写内存跟踪调试工具)。2、 组成介绍a) 编译器:ADS提供多种编译器,以支持ARM和Thumb指令的变异。armcc是ARM C编译器tcc是Thumb C编译器armcpp是ARM C+编译器tcpp是Thumb C+编译器armasm是ARM和Thumb的编译器b) 链接器:armlink是ARM链接器。该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步的链接。c) 符号调试器:armsd是ARM和Thumb的符号调试器。它能够进行源码级的程序调试。用户可以再用C或汇编

    15、语言写的代码中进行单步调试、设置断点、查看变量值和内存单元的内容。d) fromELF:将ELF格式的文件转换为各种格式的输出文件,包括bin格式的映像文件、Motorola 32位S格式影像文件、Intel 32位格式映像文件和Verilog十六进制文件。e) armar:armar是ARM库函数生成器,它将一系列ELF格式的目标文件以库函数的形式集合在一起。用户可以把一个库传递给一个链接器以代替几个ELF文件。f) CodeWarrior:CodeWarrior集成开发环境(IDE)为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ADS的CodeWarrior IDE为ARM和

    16、Thumb处理器开发用C、C+或者ARM汇编语言编写的程序代码。g) C和C+库:ADS提供ANSI C库函数和C+库函数,支持被编译的C和C+大面。用户可以把C库中的与目标相关的函数作为自己应用程序中的一部分,重新进行代码的实现。3.4 中断流程图3.1中断流程图3.5 数据结构3.5.1 中断优先级产生模块其中32个中断请求的优先级逻辑有一个rotation based仲裁位组成:6个一级仲裁位和一个二级位4,如图3.2所示图3.2优先级生成模块3.5.2 中断优先级每个仲裁器可以处理6个中断请求,基于一位仲裁器模式(ARB_MODE)和两位选择信号(ARB_SEL):如果ARB_SEL位

    17、为00B,优先级顺序是:REQ0,REQ1,REQ2,REQ3,REQ4,and REQ5。如果ARB_SEL位为01B,优先级顺序是:REQ0,REQ2,REQ3,REQ4,REQ1,and REQ5。如果ARB_SEL位为10B,优先级顺序是:REQ0,REQ3,REQ4,REQ1,REQ2,and REQ5。如果ARB_SEL位为11B,优先级顺序是:is REQ0,REQ4,REQ1,REQ2,REQ3,and REQ5。注意:REQ0总是具有最高优先级,REQ5总是具有最低优先级,改变ARB_SEL位只能改变REQ1-REQ4的优先级。如果ARB_MODE位被置1,ARB_SEL不会

    18、自动改变,这会使仲裁器处于固定优先级模式(注意即使处于这种模式,还是可以通过手动改变ARB_SEL位来配置优先级)。如果ARB_MODE位被置1,ARB_SEL改变以变换优先级,例如,如果REQ1被服务,ARB_SEL自动变成01把REQ1变为最低优先级,ARB_SEL的详细规则如下:如果REQ0或REQ5被服务,ARB_SEL位不会变如果REQ1被服务,ARB_SEL位置01B如果REQ2被服务,ARB_SEL位置10B如果REQ3被服务,ARB_SEL位置11B如果REQ4被服务,ARB_SEL位置00B3.6 寄存器工作原理3.6.1 程序状态存储器PSR如果PSR中的F位被置1,CPU

    19、不接收FIQ快速中断,同样如果I位PSR被置1,CPU不接收IRQ中断,因此中断控制器能够通过将PSR的F和I位和相应的INTMSK中的位清零来接收中断6。3.6.2 中断模式ARM920T有两种中断模式:FIQ和IRQ。在中断请求时所有的中断源决定使用哪个模式。3.6.3 中断请求寄存器S3C2410有两种中断请求寄存器:源请求寄存器(SRCPND)和中断请求寄存器(INTPND)。这些请求寄存器揭示了一个中断是否正在请求。当中断源请求中断服务时SRCPND寄存器中的相应位肯定被置1,然而,中断仲裁之后则只有INTPND寄存器的某1位被自动置1。即使该中断被屏蔽,SRCPND寄存器中的相应位

    20、也会被置1,但是INTPND寄存器将不会改变。当INTPND寄存器的某位被置1,且I位或者F位清零时中断服务即开始。SRCPND和INTPND寄存器能够被读和写,因此服务函数必须通过向SRCPND和INTPND中相应位写入“1”来清除中断请求条件。3.6.4 中断屏蔽寄存器通过中断屏蔽寄存器的哪个屏蔽位被置1可以知道哪个中断被禁止。如果INTMSK的某个屏蔽位为0,此中断将会被正常服务。如果中断源产生了一个请求,SRCPND中的源请求位被置位,即使相应屏蔽位为1。3.7 实验详解中断控制器有5个控制寄存器:源请求寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器和中断请求寄存器。所有中断请求首先

    21、寄存入SRCPND,它们基于中断模式寄存器分为两组:FIQ请求和IRQ请求。多IRQ的仲裁过程基于优先级寄存器。3.7.1 源请求寄存器SRCPNDSRCPND由32位组成,每一位与一个中断源相关。如果某个中断源产生中断请求并等待中断服务,某位将会被置1。相应地,寄存器也指出了哪个中断源在请求服务。注意SRCPND中的每个位是由中断源自动置位的,与INTMASK寄存器无关。此外,SRCPND寄存器不会被优先级逻辑影响。在中断服务函数中必须清零SRCPND的相应位,否则,中断控制器会认为同一个源的另一个中断,换句话说,如果SRCPND的某个位仍然为1,中断控制器会认为又有一个有效的新的中断在请求

    22、服务。清零相应位的时机由用户需求决定。如果想要从同一个中断源接收另外一个有效的中断,应该在刚进入ISR的时候清零,然后使能中断。可以通过向SRCPND写入数据来清零某位,但是注意只有SRCPND中为1的位会被写成写入数据中的位,而SRCPND中为0的位不会改变(如图3.3)。图3.3源请求寄存器SRCPND3.7.2 中断模式寄存器INTMOD此寄存器由32个对应每个中断源的位组成。如果某位被置1,相应的中断被设置为FIQ模式,否则,设置为IRQ模式。注意:只有1个中断源能够被设置为FIQ模式,因此INTMOD中只有1位能被置1。3.7.3 中断屏蔽寄存器INTMSK每个中断源对应一个位,如果

    23、某位被置1,CPU不会响应相应的中断请求(意即使这种情况下,SRCPND的位还是会置1),位置0,相应中断请求可以被响应。如图3.4。图3.4中断屏蔽寄存器INTMSK3.7.4 中断请求寄存器INTPND每个位显示了相应的中断请求(没有被屏蔽并等待中断服务)是否具有最高的优先级。由于INTPND寄存器处于优先级逻辑之后,只有1位能被置1,只有这个中断请求向CPU产生IRQ中断。在中断服务程序中,可以通过读此寄存器来知道哪个中断源正在被服务。同SRCPN D寄存器一样,寄存器必须在中断服务程序中清零(SRCPND清零之后)。每个中断源对应一个位,如果某位被置1,CPU不会响应相应的中断请求,如

    24、果被置0,相应中断请求可以被响应。(见图3.5)图3.5中断请求寄存器INTPND注意:1、如果FIQ模式中断发生,INTPND的相应位不会turn on,因为INTPND寄存器仅在IRQ模式下有效。2、清除INTPND寄存器时的注意事项:INTPND寄存器通过写1来清零某位。如果某位从1写成0,INTPND寄存器和INTOFFSET寄存器可能有非期望值出现。因此,请不要向INTPND寄存器中为1的位写入0,最方便的清除INTPND寄存器的方法就是向INTPND寄存器中写入当前INTPND寄存器的值如:INTPND=INTPND。3.7.5 中断偏移寄存器INTOFFSETINTOFFSET寄

    25、存器中的值表示哪个中断请求在INTPND寄存器之中。此位将会在清零SRCPND和INTPND之后自动清零。注意:FIQ中断不影响此寄存器,因为它只在IRQ模式下有效。3.7.6 子中断源请求寄存器SUBSRCPND可以通过向SUBSRCPND写入数据来清零某位,但是注意只有SUBSRCPND中为1的位会被写成写入数据中的位,而SUBSRCPND中为0的位不会改变。图3.6显示了寄存器的相关位。图3.6子中断源请求寄存器SUBSRCPND3.7.7 子中断屏蔽寄存器INTSUBMSK此寄存器有11位,每一位对应一个中断源,如果某位被置1,说明此位对应的中断请求不被CPU响应(注意即使在这种情况下

    26、,SUBSRCPND寄存器还是被置1的),如果屏蔽位为0,则相应中断请求能被响应。如图3.7。图3.7子中断屏蔽寄存器INTSUBMSK第4章 程序流程该程序的流程是,按下程序启动后,初始化定时器1,设定定时器的中断时间,然后,等待定时器中断,当定时器中断到来时,就会进入定时器中断服务子程序,而中断服务子程序会把LED1和LED2灯熄灭或点亮,从现象中看到LED1和LED2 灯忽闪一次,则说明定时器发生了一次中断。最后,关闭中断请求,等待下一次的中断的到来。为使CPU响应中断,在中断服务子程序执行之前,必须打开ARM920T的CPSR中的I位,以及相应的中断屏蔽寄存器中的位5。程序流程图如下:

    27、图4.1程序流程图第5章 主要源代码5.1 主函数设计主函数就是通过一个While(1)死循环来等待中断的发生#include #include .INCconfig.hvoid Main(void) Target_Init(); /完成核心板的初始化 while(1); /while函数死循环等待外部中断的发生5.2 核心板的初始化对ARM9核心板进行初始化,包括时钟频率初始化、使用的引脚功能初始化、异常处理的初始化、定时器的初始化和Uart串口的初始化。void Target_Init(void) MMU_Init(); / MMU的初始化 ChangeClockDivider(1,1);

    28、 / 1:2:4 ChangeMPllValue(0xa1,0x3,0x1); / FCLK=202.8MHz Isr_Init(); Port_Init(); /端口初始化 Timer1_init(); /定时器初始化 Timer1INT_Init(); Uart_Init(0,115200); /Uart 串口的初始化 Uart_Select(0); 5.3 定时器初始化程序通过定时器来计数,先对定时器进行初始化,通过时钟的周期设置定时器多长时间计满一次从而产生中断,执行中断处理。void Timer1_init(void) rGPGCON = rGPGCON & 0xfff0ffff |

    29、 0x00050000; /配置GPG口为信号输出 rGPGDAT = rGPGDAT | 0x300; rTCFG0 = 255; / Prescaler0=255 rTCFG1 = 0 4; rTCNTB1 = 48828; / 在pclk=50MHZ下,1秒钟的记数值rTCNTB1 = 50000000 / 4 / 256 = 48828; rTCMPB1 = 0x00; rTCON = (1 11) | (1 9) | (0 8); /禁用定时器1,手动加载 rTCON = (1 11) | (0 9) | (1 8); /启动定时器1,自动装载第6章 运行结果及结论6.1 运行结果运

    30、行出来的结果是ARM9核心板上两个LED灯(即LED1和LED2)交替闪烁,中间间隔是一秒。6.2 结论我们的选题是基于ARM9中断控制器的程序设计与实现,任务下达之后,我们首先利用一天的时间进行了相关资料的学习,比如中断的处理过程,LED灯的工作原理等。通过查找资料进一步的学习这些知识,我发现我们之前对于书本上的很多知识学得还不够深入,离应用还差得很远。在这次课程设计过程中,我也遇到了一些麻烦。比如,源中断挂起寄存器的清零实现不了,原来是因为ARM9中SRCPND和INTPND都是通过写一清零的。还有,最初LED灯不知如何控制,通过小组合作以及老师的帮助下,认真的分析了代码,终于搞懂了LED

    31、灯的控制原理。虽然这个课题基本完成了要求,但还有存在的问题需要改进和完善。比如,如何把外部中断改为定时器中断,如何通过中断控制数码管的现实,这些问题都有待进一步研究。通过这次的课程设计,我了解了ARM嵌入式系统开发的流程和技巧,懂得了团队协作的重要性,提高了我的实际动手能力,增强了自己的分析问题、解决问题的能力。参考文献1徐英慧,马忠梅,王磊,王琳编著ARM9嵌入式系统设计北京北京航空航天大学出版社20112马忠梅,马广云,徐英慧,田译编著ARM嵌入式处理结构与应用基础M 北京北京航空航天大学出版社20023 何加铭编著嵌入式32位微处理器系统设计与应用北京电子工业出版社20064田泽编著嵌入式系统开发与应用M 北京北京航空航天大学出版社20055田泽编著嵌入式系统开发与应用实验教程M北京北京航空航天大学出版社20046周立功


    注意事项

    本文(嵌入式基于ARM9的中断驱动程序设计课程设计.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


    收起
    展开