0

关于投票
Linux设备驱动(第三版)ebook+所以例子源代码

点击下载Linux设备驱动(第三版)ebook+所以例子源代码.part1

点击下载Linux设备驱动(第三版)ebook+所以例子源代码.part2

 

系统分类: 嵌入式
用户分类: 嵌入式
标签: Linux 设备驱动
来源: 整理
发表评论 阅读全文(69) | 回复(0)

0

关于投票
嵌入式操作系统介绍及选型原则
     嵌入式系统是以应用为中心,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。具有软件代码小、高度自动化、响应速度快等特点,特别适合于要求实时和多任务的体系。嵌入式系统主要由嵌入式处理器、相关支撑硬件、嵌入式操作系统及应用软件系统等组成,它是可独立工作的器件
    一、嵌入式操作系统的发展
     作为嵌入式系统(包括硬、软件系统)极为重要的组成部分的嵌入式操作系统,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。
    嵌入式操作系统伴随着嵌入式系统的发展经历了四个比较明显的阶段:
    第一阶段:无操作系统的嵌入算法阶段,以单芯片为核心的可编程控制器形式的系统,具有与监测、伺服、指示设备相配合的功能。应用于一些专业性极强的工业控制系统中,通过汇编语言编程对系统进行直接控制,运行结束后清除内存。系统结构和功能都相对单一,处理效率较低,存储容量较小,几乎没有用户接口。
    第二阶段:以嵌人式CPU为基础、简单操作系统为核心的嵌入式系统。CPU种类繁多,通用性比较差;系统开销小,效率高;一般配备系统仿真器,操作系统具有一定的兼容性和扩展性;应用软件较专业,用户界面不够友好;系统主要用来控制系统负载以及监控应用程序运行。
    第三阶段:通用的嵌人式实时操作系统阶段,以嵌入式操作系统为核心的嵌入式系统。能运行于各种类型的微处理器上,兼容性好;内核精小、效率高,具有高度的模块化和扩展性;具备文件和目录管理、设备支持、多任务、网络支持、图形窗口以及用户界面等功能;具有大量的应用程序接口(APl);嵌入式应用软件丰富。
    第四阶段:以基于Intemet为标志的嵌入式系统。这是一个正在迅速发展的阶段。目前大多数嵌入式系统还孤立于lnlemet之外,但随着Intemet的发展以及Intemet技术与信息家电、工业控制技术等结合日益密切,嵌入式设备与Intemet的结合将代表着嵌入式技术的真正未来。
    二、使用实时操作系统的必要性
    嵌入式实时操作系统在目前的嵌入式应用中用得越来越广泛,尤其在功能复杂、系统庞大的应用中显得愈来愈重要。
    1.嵌人式实时操作系统提高了系统的可靠性。在控制系统中,出于安全方面的考虑,要求系统起码不能崩溃,而且还要有自愈能力。不仅要求在硬件设计方面提高系统的可靠性和抗干扰性,而且也应在软件设计方面提高系统的抗干扰性,尽可能地减少安全漏洞和不可靠的隐患。长期以来的前后台系统软件设计在遇到强干扰时,使得运行的程序产生异常、出错、跑飞,甚至死循环,造成了系统的崩溃。而实时操作系统管理的系统,这种干扰可能只是引起若干进程中的一个被破坏,可以通过系统运行的系统监控进程对其进行修复。通常情况下,这个系统监视进程用来监视各进程运行状况,遇到异常情况时采取一些利于系统稳定可靠的措施,如把有问题的任务清除掉。
    2.提高了开发效率,缩短了开发周期。在嵌入式实时操作系统环境下,开发一个复杂的应用程序,通常可以按照软件工程中的解耦原则将整个程序分解为多个任务模块。每个任务模块的调试、修改几乎不影响其他模块。商业软件一般都提供了良好的多任务调试环境。
    3.嵌入式实时操作系统充分发挥了32CPU的多任务潜力。32CPU816CPU快,另外它本来是为运行多用户、多任务操作系统而设计的,特别适于运行多任务实时系统。32CPU采用利于提高系统可靠性和稳定性的设计,使其更容易做到不崩溃。例如,CPU运行状态分为系统态和用户态。将系统堆栈和用户堆栈分开,以及实时地给出CPU的运行状态等,允许用户在系统设计中从硬件和软件两方面对实时内核的运行实施保护。如果还是采用以前的前后台方式,则无法发挥32CPU的优势。从某种意义上说,没有操作系统的计算机(裸机)是没有用的。在嵌入式应用中,只有把CPU嵌入到系统中,同时又把操作系统嵌入进去,才是真正的计算机嵌入式应用。
    三、嵌入式操作系统选型
    当我们在设计信息电器、数字医疗设备等嵌入式产品时,嵌入式操作系统的选择至关重要。一般而言,在选择嵌入式操作系统时,可以遵循以下原则。总的来说,就是做加法还是做减法的问题。
    (一)市场进入时间
    制定产品时间表与选择操作系统有关系,实际产品和一般演示是不同的。目前是Windows程序员可能是人力资源最丰富的。现成资源最多的也就可能是WinCE。使用WinCE能够很快进入市场。因为WinCE+X86做产品实际上是在做减法,去掉你不要的功能,能很快出产品,但伴随的可能是成本高,核心竞争力差。而某些高效的操作系统可能由于编程人员缺乏,或由于这方面的技术积累不够,影响开发进度。
    (二)可移植性
    操作系统相关性。当进行嵌入式软件开发时,可移植性是要重点考虑的问题。良好的软件移植性应该比较好,可以在不同平台、不同系统上运行,跟操作系统无关。软件的通用性和软件的性能通常是矛盾的。即通用以损失某些特定情况下的优化性能为代价。很难设想开发一个嵌入式浏览器而仅能在某一特定环境下应用。反过来说,当产品与平台和操作系统紧密结合时,往往你的产品的特色就蕴含其中。
    (三)可利用资源
    产品开发不同于学术课题研究,它是以快速、低成本、高质量的推出适合用户需求的产品为目的的。集中精力研发出产品的特色,其他功能尽量由操作系统附加或采用第三方产品,因此操作系统的可利用资源对于选型是一个重要参考条件。LinuxWinCE都有大量的资源可以利用,这是他们被看好的重要原因。其他有些实时操作系统由于比较封闭,开发时可以利用的资源比较少,因此多数功能需要自己独立开发。从而影响开发进度。近来的市场需求显示,越来越多的嵌入式系统,均要求提供全功能的Web浏览器。而这要求有一个高性能、高可靠的GUI的支持。
    (四)系统定制能力
    信息产品不同于传统PCWintel结构的单纯性,用户的需求是千差万别的,硬件平台也都不一样,所以对系统的定制能力提出了要求。要分析产品是否对系统底层有改动的需求,这种改动是否伴随着产品特色?Linux由于其源代码开放的天生魅力,在定制能力方面具有优势。随着WinCE3.0原码的开放,以及微软在嵌入式领域力度的加强,其定制能力会有所提升。
   (五)成本
    成本是所有产品不得不考虑的问题。操作系统的选择会对成本有什么影响呢?Linux免费,WinCE等商业系统需要支付许可证使用费,但这都不是问题的答案。成本是需要综合权衡以后进行考虑的——选择某一系统可能会对其他一系列的因素产生影响,如对硬件设备的选型、人员投入、以及公司管理和与其他合作伙伴的共同开发之间的沟通等许多方面的影响。
    (六)中文内核支持
    国内产品需要对中文的支持。由于操作系统多数是采用西文方式,是否支持双字节编码方式,是否遵循GBKGBl8030等各种国家标准,是否支持中文输入与处理,是否提供第三方中文输入接口是针对国内用户的嵌入式产品的必需考虑的重要因素。
    上面提到用WinCE+x86出产品是减法,这实际上就是所谓PC家电化;另外一种做法是加法,利用家电行业的硬件解决方案(绝大部分是非x86的)加以改进,加上嵌入式操作系统,再加上应用软件。这是所谓家电PC化的做法,这种加法的优势是成本低,特色突出,缺点是产品研发周期长,难度大(需要深入了解硬件和操作系统)。如果选择这种做法,Linux是一个好选择,它让你能够深入到系统底层,如果你愿意并且有能力。
四、几种代表性嵌入式操作系统比较
    (一)VxWorks
    VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是Tornado嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌人式实时操作系统领域逐渐占据一席之地。
    VxWorks具有可裁剪微内核结构;高效的任务管理;灵活的任务间通讯;微秒级的中断处理;支持POSIX 10031b实时扩展标准;支持多种物理介质及标准的、完整的TCP/IP网络协议等。
    然而其价格昂贵。由于操作系统本身以及开发环境都是专有的,价格一般都比较高,通常需花费10万元人民币以上才能建起一个可用的开发环境,对每一个应用一般还要另外收取版税。一般不通供源代码,只提供二进制代码。由于它们都是专用操作系统,需要专门的技术人员掌握开发技术和维护,所以软件的开发和维护成本都非常高。支持的硬件数量有限。
    (二)Windows CE
    Windows CEWindows系列有较好的兼容性,无疑是Windows CE推广的一大优势。其中WinCE3.0是一种针对小容量、移动式、智能化、32位、了解设备的模块化实时嵌人式操作系统。为建立针对掌上设备、无线设备的动态应用程序和服务提供了一种功能丰富的操作系统平台,它能在多种处理器体系结构上运行,并且通常适用于那些对内存占用空间具有一定限制的设备。它是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统。它的模块化设计允许它对从掌上电脑到专用的工业控制器的用户电子设备进行定制。操作系统的基本内核需要至少200KBROM。由于嵌入式产品的体积、成本等方面有较严格的要求,所以处理器部分占用空间应尽可能的小。系统的可用内存和外存数量也要受限制,而嵌入式操作系统就运行在有限的内存(一般在ROM或快闪存储器)中,因此就对操作系统的规模、效率等提出了较高的要求。从技术角度上讲,Windows CE作为嵌入式操作系统有很多的缺陷:没有开放源代码,使应用开发人员很难实现产品的定制;在效率、功耗方面的表现并不出色,而且和Windows一样占用过的系统内存,运用程序庞大;版权许可费也是厂商不得不考虑的因素。
    (三)嵌入式Linux
    这是嵌入式操作系统的一个新成员,其最大的特点是源代码公开并且遵循GPL协议,在近一年多以来成为研究热点,据IDG预测嵌入式Linux将占未来两年的嵌入式操作系统份额的50%
    由于其源代码公开,人们可以任意修改,以满足自己的应用,并且查错也很容易。遵从GPL,无须为每例应用交纳许可证费。有大量的应用软件可用。其中大部分都遵从GPL,是开放源代码和免费的。可以稍加修改后应用于用户自己的系统。有大量的免费的优秀的开发工具,且都遵从GPL,是开放源代码的。有庞大的开发人员群体。无需专门的人才,只要懂Unix/LinuxC语言即可。随着Linux在中国的普及,这类人才越来越多。所以软件的开发和维护成本很低。优秀的网络功能,这在Internet时代尤其重要。稳定——这是Linux本身具备的一个很大优点。内核精悍,运行所需资源少,十分适合嵌入式应用。
    支持的硬件数量庞大。嵌入式Linux和普通Linux并无本质区别,PC上用到的硬件嵌入式Linux几乎都支持。而且各种硬件的驱动程序源代码都可以得到,为用户编写自己专有硬件的驱动程序带来很大方便。
    在嵌入式系统上运行Linux的一个缺点是Linux体系提供实时性能需要添加实时软件模块。而这些模块运行的内核空间正是操作系统实现调度策略、硬件中断异常和执行程序的部分。由于这些实时软件模块是在内核空间运行的,因此代码错误可能会破坏操作系统从而影响整个系统的可靠性,这对于实时应用将是一个非常严重的弱点。
    (四)μC/OS
    μC/OS是著名的源代码公开的实时内核,是专为嵌入式应用设计的,可用于8位,16位和32位单片机或数字信号处理器(DSP)。它是在原版本μC/OS的基础上做了重大改进与升级,并有了近十年的使用实践,有许多成功应用该实时内核的实例。它的主要特点如下:
  • 公开源代码,容易就能把操作系统移植到各个不同的硬件平台上;
  • 可移植性,绝大部分源代码是用C语言写的,便于移植到其他微处理器上;
  • 可固化;
  • 可裁剪性,有选择的使用需要的系统服务,以减少斗所需的存储空间;
  • 占先式,完全是占先式的实时内核,即总是运行就绪条件下优先级最高的任务;
  • 多任务,可管理64个任务,任务的优先级必须是不同的,不支持时间片轮转调度法;
  • 可确定性,函数调用与服务的执行时间具有其可确定性,不依赖于任务的多少;
  • 实用性和可靠性,成功应用该实时内核的实例,是其实用性和可靠性的最好证据。
    由于μC/OS仅是一个实时内核,这就意味着它不像其他实时存在系统那样提供给用户的只是一些API函数接口,还有很多工作需要用户自己去完成。
    五、结束语
    在嵌入式应用中,使用实时操作系统(RTOS)是当前嵌入式应用的一个特点,一种趋势,也是单片机应用从低水平向高水平的一个进步。在实际的应用中,根据不同的要求和条件选择合适的操作系统,使开发工作更容易,设计出更完美的嵌入式系统。
系统分类: 嵌入式
用户分类: 嵌入式
标签: 嵌入式 操作系统
来源: 转贴
发表评论 阅读全文(59) | 回复(0)

0

关于投票
深入剖析uClinux
苹果的iPod是一款时尚的MP3播放器,采用苹果公司的专用MP3播放软件,是市场上销量最好的MP3之一。最近狂热的Linux爱好者对其进行了改造,在不改动硬件的环境下移植了内核版本为2.4.24的uClinux(基于ARM 32位处理器内核ARM 7TDMI),并使其具备了FramBuffer、硬盘支持、远程控制等功能,使一台MP3变成了一台PDA。该项目一直处于活跃阶段,许多新的功能正在添加之中。 

    图2显示了在Cisco 3000上路由器运行uClinux的图片。事实上,在基于MIPS处理器的Cisco 2500/3000/4000系列路由器上,uClinux都得到了移植,并能够出色稳定地工作。 

    以上两个例子显示了作为一个开放源代码的操作系统,uClinux有着优良的可移植性和广泛的兼容性,其应用遍及DVD播放器、PDA、路由器、防火墙、机顶盒、工业控制设备、VOIP设备、数码摄像头、智能家具设备等。 



图1 运行uClinux的苹果iPod-MP3播放器 


图2 运行uClinux的Cisco 3000路由器
   

    针对没有MMU的CPU 

    全球每年生产的CPU的数量大概在二十亿颗左右,其中大部分是应用于专用性很强的各类嵌入式系统。大部分嵌入式系统为了减少系统复杂程度、降低硬件及开发成本和运行功耗,在硬件设计中取消了内存管理单元(MMU)模块。最初,运行于这类没有MMU的CPU之上的都是一些很简单的单任务操作系统,或者更简单的控制程序,甚至根本就没有操作系统而直接运行应用程序。在这种情况下,系统无法运行复杂的应用程序,或者效率很低,并且所有的应用程序需要重新开发,还要求开发人员十分了解硬件特性。这些都阻碍了不含MMU的嵌入式产品开发的速度和应用水平。 

    uClinux专门针对没有MMU的CPU,并且为嵌入式系统做了许多小型化的工作。uClinux是一个完全符合GNU/GPL公约的项目,完全开放代码。 

    最初的uClinux仅仅支持Palm硬件系统,基于Linux 2.0内核。随着系统的日益改进,支持的内核版本从2.0、2.2、2.4一直到现在最新的2.6。系统的开发人员从两人增加到了目前的12人,支持的硬件系统也从一种增加到了目前的十余种(支持的硬件平台如Motorola公司的M68328、M68EN322、MC68360、DragonBall系列如68EZ328、68VZ328,ColdFire系列的如5272、5307,ARM 7TDMI、MC68EN302、ETRAX、Intel i960、PRISMA、Atari 68k等等。) 

    根据Linuxdevices.com网站2004年3月的调查,uClinux在全球嵌入式Linux市场所占的份额已位居第二,仅仅落后于定制Linux(即自己下载源码进行修改定制)。同时Linux在全球嵌入式操作系统的市场份额依然处于统治地位(占40%以上),领先第二名微软公司的嵌入式操作系统三倍以上(市场份额约13%)。 

    uClinux系统特点 

    1. 嵌入式操作系统比较 

    由表1可以看出,对于嵌入式应用,高端平台可直接采用Linux系统,其兼容性和可移植度都较高,但对硬件处理速度和存储空间要求较高。 

    低端平台的最佳选择是uClinux,其性能稳定、移植性好、功能强大。 

    低端平台如果对实时性要求较高、应用相对简单,则可采用uc/os或其他操作系统。 

    2.基本架构
    由图3可以看出,uClinux的系统与标准Linux的架构完全一致。 



图3 uClinux系统架构


    3. 内存管理
    uClinux是专门针对没有MMU的处理器而设计的,即uClinux无法使用处理器的虚拟内存管理技术。实际上uClinux采用实存储器管理策略,通过地址总线对物理内存进行直接访问。所有程序中访问的地址都是实际的物理地址,所有的进程都在一个运行空间中运行(包括内核进程),这样的运行机制给程序员带来了不小的挑战,在操作系统不提供保护的情况下必需小心设计程序和数据空间,以免引起应用程序进程甚至是内核的崩溃。 

    uClinux仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页,在加载应用程序时程序分页加载。一个进程在执行前,系统必须为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。系统不含MMU带来的另外一个问题是磁盘交换空间无法使用,对于资源有限的嵌入式系统而言,系统执行时如果缺少内存将无法通过磁盘交换来得到改善。 

    MMU的省略虽然带来了系统及应用程序开发的限制,但对于成本和体积敏感的嵌入式设备而言,其应用环境和应用需求并不要求复杂和相对昂贵的硬件体系,对于功能简单的专用嵌入式设备,内存的分配和管理完全可以由开发人员考虑。 

    4.文件系统
    uClinux系统多采用Romfs文件系统,Romfs是一种相对简单、占用空间较少的文件系统。空间的节约来自于两个方面:首先内核支持Romfs文件系统比支持ext2文件系统需要更少的代码;其次romfs文件系统相对简单,在建立文件系统超级块(Superblock)需要更少的存储空间。Romfs是只读的文件系统,禁止写操作,因此系统同时需要虚拟盘(RAMDISK)支持临时文件和数据文件的存储。 

    随着技术的发展,近年来日志文件系统在uClinux系统上得到了较多的应用,其中以支持NOR FLASH的JFFS、JFFS2文件系统和支持NAND FLASH的YAFFS最为流行。这些文件系统都支持掉电文件保护,同时支持标准的MTD驱动。 

    5.多进程管理
    由于uClinux没有MMU管理存储器,在实现多个进程时需要实现数据保护。uClinux的虽然支持fork函数,但其实质是和vfork:实际上uClinux所有的多进程管理都通过vfork来实现。 

    vfork不拷贝父进程的页面,只是初始化私有的数据结构与准备足够的分页表。调用完成后父子进程事实上共享同一块存储器,因此子进程可以更改父进程的数据及堆栈信息,所有父进程进入睡眠,直到子进程执行exec。当子进程正确开始执行后,将唤醒父进程,使得父进程继续往后执行。这意味着uClinux系统fork调用完程后,要么子进程代替父进程执行(此时父进程已经休眠)直到子进程调用exit退出,要么调用exec执行一个新的进程。 

    vfork是uClinux与标准Linux应用程序的开发中最重要的不同之处,只有对vfork与fork两个函数的差异和程序处理有详细的了解才能顺利地完成从Linux到uClinux的程序移植。 

    6.实时性讨论
    与Linux一样,uClinux本身并不支持实时性应用,但通过实时性的修改(RTLinux或RTAI)可以提供基于内核空间和用户空间的硬实时和软实时的系统调用。 

    uClinux不足之处 

    正如中国古语云“人无完人”,uClinux也有一些不足之处: 

    1.文档的不足
    与Linux及其他自由软件类似,uClinux的文档十分不足:缺乏组织和一致的文档、热门技术和分类文档众多而杂乱无章、非热点部分文档缺失甚至没有文档。对于开发人员而言,往往要深入程序的源代码找寻有用的资料。 

    2.Bug问题
    uClinux与硬件平台直接相关。对于有商业公司赞助的硬件平台,其相关代码和Bug更新较快,编译和执行都十分顺利;但对于非商业支持的硬件平台,其内核和应用程序代码都得不到及时更新和排错。这种现象在内核源代码树还不是十分普遍,但在uClinux自带的应用程序库中却经常发生编译错误,往往是增加了一个应用程序或改变了运行库便导致无法编译。这就需要开发者投入足够的时间和精力进行排错和修改,也会导致开发进度的延误。 

    总结 

    uClinux是一个优秀的嵌入式操作系统,集硬件兼容性、软件可移植性、系统稳定性于一身,是开放系统世界的一颗新星。在本系列文章的后面将陆续探讨uClinux的内核定制、驱动开发、文件系统等一系列技术问题 

系统分类: 嵌入式
用户分类: 嵌入式
标签: uClinux 操作系统
来源: 整理
发表评论 阅读全文(136) | 回复(0)

0

关于投票
uclinux核心手册-中文
点击下载uclinux核心手册-中文
系统分类: 嵌入式
用户分类: 嵌入式
标签: uclinux 嵌入式
来源: 整理
发表评论 阅读全文(55) | 回复(0)

1

关于投票
8051单片机实践与应用全书

点击下载8051单片机实践与应用全书.part01

点击下载8051单片机实践与应用全书.part02

点击下载8051单片机实践与应用全书.part03

点击下载8051单片机实践与应用全书.part04

点击下载8051单片机实践与应用全书.part05

点击下载8051单片机实践与应用全书.part06

点击下载8051单片机实践与应用全书.part07

点击下载8051单片机实践与应用全书.part08

系统分类: 单片机
用户分类: 单片机
标签: 8051 单片机
来源: 整理
发表评论 阅读全文(186) | 回复(0)

1

关于投票
单片机语言C51应用实战集锦

点击下载单片机语言C51应用实战集锦.part1

点击下载单片机语言C51应用实战集锦.part2

点击下载单片机语言C51应用实战集锦.part3

点击下载单片机语言C51应用实战集锦.part4

点击下载单片机语言C51应用实战集锦.part5

 

系统分类: 单片机
用户分类: 单片机
标签: 单片机 C51
来源: 整理
发表评论 阅读全文(73) | 回复(0)

0

关于投票
8051单片机C语言彻底应用

点击下载8051单片机C语言彻底应用.part1

点击下载8051单片机C语言彻底应用.part2

点击下载8051单片机C语言彻底应用.part3

点击下载8051单片机C语言彻底应用.part4

点击下载8051单片机C语言彻底应用.part5

点击下载8051单片机C语言彻底应用.part6

点击下载8051单片机C语言彻底应用.part7

 

 

系统分类: 单片机
用户分类: 无分类
标签: 无标签
来源: 无分类
发表评论 阅读全文(68) | 回复(0)

0

关于投票
AT89S51 单片机实验及实践

点击下载AT89S51 单片机实验及实践.part1

点击下载AT89S51 单片机实验及实践.part2

点击下载AT89S51 单片机实验及实践.part3

 

系统分类: 单片机
用户分类: 单片机
标签: AT89S51 单片机
来源: 整理
发表评论 阅读全文(161) | 回复(0)

0

关于投票
51单片机C语言编程手册
点击下载51单片机C语言编程手册.rar
系统分类: 单片机
用户分类: 单片机
标签: 51单片机 C语言 编程
来源: 整理
发表评论 阅读全文(62) | 回复(0)

2

关于投票
MCS51单片机实用子程序
点击下载MCS51单片机实用子程序
系统分类: 单片机
用户分类: 单片机
标签: MCS-51 单片机 实用子程序
来源: 整理
发表评论 阅读全文(52) | 回复(2)
总共 , 当前 /,2下一页