-
Gordon Bell和Dan Dodge在1980年成立了Quantum Software Systems公司,他们根据大学时代的一些设想写出了一个能在IBM PC上运行的名叫QUNIX(Quick UNIX)的系统,直到AT&T发律师函过来才把名字改成QNX。
QNX是一种商用的遵从POSIX规范的类Unix实时操作系统,目标市场主要是面向嵌入式系统。它可能是最成功的微内核操作系统之一。[1]
QNX是一种商用的类Unix
实时操作系统,遵从POSⅨ规范,目标市场主要是
嵌入式系统[1]。QNX成立于1980年,是加拿大一家知名的嵌入式系统开发商。
QNX的应用范围极广,包含了:控制保时捷跑车的音乐和媒体功能、核电站和美国陆军无人驾驶Crusher坦克的控制系统[2],还有RIM公司的BlackBerry PlayBook平板电脑。
2004年10月27日,QNX 软件系统宣布它已经接受来自音响设备制造商 Harman 国际工业公司(纽约证券交易所: HAR)的购买提议. 作为Harman 的最新子公司高级商标的国际家庭,包括 Harman Kardon,JBL 和Becker,QNX 现在将会加速它的生长,向为先进的嵌入式运用,变成优先的操作系统。哈曼集团以1.38亿美元的现金收购了QNX,但也因此承担了1.38亿美元的债务。
2010年04月14日,黑莓手机(BlackBerry)制造商RIM(Research In Motion Ltd.,RIM)将收购哈曼国际工业集团(Harman International Industries Inc.,HAR)旗下的QNX软件公司,以获取其车载无线连接技术。QNX这个原本的
渥太华公司,在被美国哈曼国际 Harman 在买走6年后,又重返加拿大。QNX主要开发汽车,通讯设备所使用的操作系统,哈曼国际的主业则是汽车音像和娱乐设备。此次交易将使得RIM,QNX和哈曼工业在智能手机和车载音频娱乐系统之间找到合作空间。
QNX被RIM并购的消息传出,才让这个在中国的认知度并不高的“默默无闻”的操作系统厂商被大家所熟知。但在汽车领域,QNX早已是最大的操作系统供应商。据不完全资料显示,QNX在车用市场占有率达到75%25,目前全球有超过230种车型使用QNX系统,包括哈曼贝克、德尔福、大陆、通用电装、爱信等知名汽车电子平台都是在QNX系统上搭建的。几乎全球所有的主要汽车品牌包括讴歌、阿尔法-罗密欧、奥迪、宝马、别克、凯迪拉克、雪弗兰、克莱斯勒、戴姆勒、道奇、菲亚特、福特、通用汽车、本田、悍马、现代、英菲尼迪、捷豹、吉普、蓝旗亚、马自达、马赛地、迷你宝马、三菱、尼桑、欧宝、庞迪克、保时捷、萨博、土星、双龙、丰田和大众汽车等目前都采用了基于QNX技术的系统。
除汽车领域之外,QNX的最大客户订单来源于思科系统,其中高端路由设备几乎全部采用QNX操作系统,因此,
网络通信也成为了QNX第二大应用领域。此外,QNX与通用电气、阿尔斯通、西门子、洛克希德·马丁和NASA等公司都有着紧密合作,在轨道交通、医疗器械、智能电网及航空航天中,都发挥着积极作用。
* QNX是一个分布式、嵌入式、可规模扩展的硬
实时操作系统。它遵循POSⅨ.1 (
程序接口)和POSⅨ.2 (Shell和工具)、部分遵循POSⅨ.1b(实时扩展)。它诞生于1980年,距今已35年的历史。
* 可选调度策略:FIFO、轮转策略、适应性策略。
QNX是业界公认的X86平台上最好的
嵌入式实时操作系统之一。它具有独一无二的
微内核实时平台,建立在微内核和完全
地址空间保护基础之上,实时、稳定、可靠,已经完成到PowerPC、MIPS、ARM等内核的移植,成为在国内广泛应用的嵌入式实时操作系统。虽然QNX本身并不属于
UNIX,但由于其提供了
POSIX的支持,使得多数传统UNIX程序在微量修改(甚至不需修改)后即可在QNX上面编译与运行。
QNX内核简介
QNX的
微内核结构是它区别于其它操作系统的显著特点。
平板式内存结构,如图1所示,所有的程序都使用同一个
地址空间,不加保护;应用程序可以自由访问所有空间,效率较高,但是任何应用程序指针错误都可能会导致内核崩溃。
大
内核内存结构,如图2所示,
操作系统内核和各种
驱动程序、网络协议在同一个地址空间,应用程序在单独空间;内核模块同处于一个保护空间,运行效率高,应用程序无法直接访问保护空间,系统稳定性大大提高。缺点是,由于内核模块(例如网络驱动)处于保护空间,因此调试困难,任何驱动程序的修改都要重新编译内核,无法做到驱动的动态加载和
卸载。
QNX的
微内核结构,内核独立自处于一个被保护的
地址空间;驱动程序、网络协议和应用程序处于程序空间中。
微内核结构的优点:①驱动程序、网络协议、文件系统等操作系统模块和内核相互独立,任何模块的故障都不会导致内核的崩溃;②驱动程序、
网络协议、文件系统和应用程序都处于程序空间,都调用相同的内核API,开发与调试和应用程序没有区别;③操作系统功能模块可以根据需要动态地加载或
卸载,不需要编译内核。在高可靠性要求的情况下,可以编写监视模块,对可靠性要求高的模块进行监视,必要的时候重新启动或重新加载而无须重启系统。高可靠性的
内核结构使QNX具备了高可靠性
嵌入式操作系统的本质特征。
在具有高可靠性内核的基础上,QNX的创新设计使它同样具有很高的效率。QNX最为引人注目的地方是,它是UNⅨ的同胞异构体,保持了和UNⅨ的高度相似性,绝大多数UNⅨ或LINUX应用程序可以在QNX下直接编译生成。这意味着为数众多的稳定成熟的UNⅨ、LINUX应用可以直接移植到QNX这个更加稳定高效的实时嵌入式平台上来。
QNX网络结构
QNX网络子系统由三个部分组成:网络管理模块(io-net)、网络协议模块、网络设备
驱动模块。
每个模块各自具有不同的功能,但是它们具有一些相同的属性。如:网络设备驱动、
TCP/IP协议栈分别对上层io-net模块和应用程序产生数据,两者都可以被看作数据源;同时它们也接受上层发来的数据,又可以同时被看作数据的消费者。过滤模块对向上的数据进行筛选,分协议进行处理;对向下的数据则进行相应的转换,如进行
网络地址转换NAT。转换模块负责不同协议帧结构的转换,在
以太网的工作环境下,它就负责对IP数据报进行以太网帧的封装和
解包。
和QNX其它服务进程一样,QNX的网络子系统也在
内核外部空间运行。应用程序面对的是一个统一的网络接口,硬件相关的内容被完全包装在网络子系统内。
QNX网络子系统的三个子模块按层次分开,io-net模块处于中心,是QNX网络的核心和重点,其它模块都挂接在它上面。数据和信息的流动都必须经由io-net调度与转发,所有其它模块所面对的就是一个单一主体。这样的中心交换结构,屏蔽了各个模块间相互协调的复杂细节,在很大程序上方便了模块的编写工作;同时,io-net还是QNX的网络管理中心。任何网络协议和网络
设备驱动程序都必须向io-net注册,由它来加载,并接受io-net的配置和管理,用户对网络状态的查询和管理也是通过io-net来实现的。
QNX网络设备驱动
QNX网络
设备驱动模块处于网络硬件和io-net模块之间。
驱动模块负责配置硬件使其正常工作,向io-net报告数据收发情况,接收和传递数据,接受io-net的调度和管理。QNX网络
设备驱动程序依照以上功能,分为初始化、接收发送数据、网络设备信息统计几个功能块。要使
网络设备工作正常,
驱动程序就要对它进行一定的寄存器配置,同时,还要向QNX网络子系统注册自己,表明网络设备的存在和网络通信能力,才能为系统和应用程序所用。在初始化工作完成以后,网络设备就进入了工作状态,收发数据。设备信息的统计也是由设备驱动程序来完成的。
⑴初始化
初始化包括两个方面,一方面是初始化网络设备,使其正常工作;另一个方面,是向io-net正确注册
驱动模块,表明自己的属性,方便上层正确操作。网络设备的初始化工作和硬件紧密相关,这里就不一一描述。
驱动模块向io-net加载自己的时候,系统遵循如下工作流程:
①io-net搜索全局的符合io_net_dll_entry。它定义了驱动的初始化函数,io-net会直接调用这个函数。
②初始化函数向io-net注册驱动和相应的函数。
③初始化函数告诉io-net和它的模块自己的通信能力。
经过以上流程以后,io-net中就建立起有关此驱动程序的数据和
函数调用列表。驱动程序必须正确编写初始化函数,并将该函数正确链接至io_net_dll_entry。
当有包到达网络设备的时候,网络设备就会用某种方式通知
驱动程序(例如中断),此时,驱动程序就要采取某种策略来处理到来的帧或数据。通常驱动程序这时候需要做以下工作:
①通过DMA将包取回来;
②做相应的必要处理,如通知网络设备释放当前帧的缓存,配置寄存器让网络设备等待下一帧到来等;
③通过调用io-net的tx_up_start()函数把包传递给上层模块。
当上层所有的模块都完成对这个包的处理以后,io-net调用我们驱动中的tx_done()函数,它来做最后的处理工作。
tx_up_start()函数是
设备驱动中比较关键的函数,下面简要部分一下这个函数的入口参数。
npkt_t*(*tx_up_start)(int registrant_hdl,
nptk_t *npkt,
int off,
int framelen_sub,
uint16_t cell,
uint 16_t endpoint,
uint16_t iface,
void *done_hdl)
其中:int registrant_hdl--本驱动在io-net中的句柄,注册时由io-net生成;
nptk_t *npkt --需要处理的包的指针;
int off--底层协议包头长度,如以太网帧头部长度;
int framelen_sub--尾部填充的长度,对于
以太网这个值为零;
uint16_t cell、uint16_t endpoint--endpoint和cell是io-net在注册的时候分配的用来区别不同的驱动;
uint16_t iface--接口号,可以让同一个驱动负现多个相同硬件;
void *done_hdl--该
指针指向tx_done()函数需要的额外数据。
当上层模块需要硬件传送包的时候,会调用io-net管理器的rx_down()函数。
int(*rx_down)(npkt_t*npkt,
void *func_hdl)
rx_down函数入口参数中,npkt是指向需要传送的数据的结构指针,func_hdl是相应
驱动模块在io-net中的句柄。其中npt结构包含许多成员,其中的重要成员如:
cell、endpoint、iface 需要处理该包的硬件标识
buffers 指向包的指针
tot_iov 包含数据包的所有I/O矢量
驱动模块在接收到io-net的调用后,就要配置网络设备,让它完成数据的发送工作。网络设备发送数据所需要的信息都会在相应的数据结构中,如net_buf_t结构中保存了等待传送的
数据包的链接列表,配置DMA所需的物理地址在net_iov_t中等。
驱动模块要等待硬件完成这些包的传送,并调用io-net的tx)done()函数通知上层模块
驱动程序已经完成了数据的发送。
网络设备信息的统计
应用程序或者用户可以通过网络信息接口nicinfo工具来了解
网络工作状态。信息的查询都是通过io-net来进行的。
驱动程序必须维护相应的状态数据,方便io-net的查询。网络设备有一些共同的状态属性,如收到和发出的包的个数、发送错误的包的个数等,不同的网络设备还会具有不同的属性和状态,这些都可以在驱动程序中用数据结构详细列明。
需要维护的数据结构中,主要的是Nic_t,它包括四个子结构;
CustNicStats--网络信息入口;
EthernesStats_t--以太网状态;
GenStats_t--常用统计信息;
NetStats_t--网络信息(包含常用统计信息)。
以上是
驱动程序需要维护的数据。当用户或应用程序要查询这些信息的时候,它们就通过Nicinfo工具对/dev/io-net/en0调用devctl()函数来取得网络信息。信息的取得是必须通过io-net来完成的,io-net对信息的查询则是通过调用io_net_register_funs_t结构中所指向的函数来取得信息的。例:
#include<sys/nic.h>
int generic_eth_devctl(void *hdl,int dcmd,void *data,
size_tsize,int *ret)
{
Nic_t *nic=(Nic_t *)hdl;
int status;
status=EOK;
switch(dcmd){
case DCMD_IO_NET_NICINFO;
memcpy(data,nic,min(size,sizeof(Nic_t)));
break;
default:
status=ENOTSUP;
break;
}
return(status);
}
结束语
网络设备的驱动是网络系统的最低层和最基础的模块,是如今
嵌入式开发中首先要解决的问题之一。由于QNX具有
微内核的特点,其网络
设备驱动程序的开发不需要内核调试,更适合初学者掌握。本文对QNX操作系统及网络设备驱动程序的介绍,可以帮助读者对相关内容作初步了解。
QNX的系统服务:
QNX
* 多种资源管理器,包括各种文件系统和设备管理,支持多个文件系统同时运行,包括提供完全POSⅨ.1及UNⅨ语法的POSⅨ文件系统,支持多种闪存设备的嵌入式文件系统,支持对多种文件服务器(如Windows NT/95、LAN Manager等)的透明访问的SMB文件系统、DOS文件系统、CD-ROM文件系统等。
* 设备管理。在进程和
终端设备间提供大吞吐量、低开销接口服务。
* 图形/窗口支持。包括QNX Windows、X Window System for QNX、对MS Windows NT/95和X Window系统的远程图形连接。
* TCP/IP for QNX。
* 高性能、容错型QNX网络——FLEET,使得所有连入网络的计算机变成一个逻辑上的超级计算机。
* 透明的
分布式处理。FLEET网络处理与消息传递和
进程管理原语的集成,将本地和网络IPC统一起来,使得网络对IPC而言是透明的。
QNX的开放性:
* QNX的POSⅨ兼容性和其提供的UNⅨ特色的
编译器、
调试器、X Window和TCP/IP都是UNⅨ程序员所熟悉的。
* 支持多种CPU:AMD ElanSC300/310/400/410、Am386 DE/SE、Cyrix MediaGX、x86处理器(386以上)、Pentium系列、STMicroelectronics 的STPC。
* 多种总线:CompactPCI、EISA、ISA 、MPE (RadiSys)、STD、STD 32、PC/104、PC/104-Plus、PCI、PCMCIA、VESA、VME。
* 各种外设:多种SCSI设备、IDE/EIDE驱动器、10M/100M以太网卡、Token Ring网卡、FDDI接口卡、多种PCMCIA设备、闪存、声卡等等。
华丽的图形界面和快捷的运行速度
QNX有一个非常华丽的图形界面,并且号称运行速度比Windows或Linux更快。不用不知道,一用你会忘不掉:P
垄断的微软Windows操作系统和自由的Linux操作系统都是很多朋友熟知的计算机主要的操作系统。但是您听说过QNX
计算机操作系统吗?如果我告诉您QNX操作系统运行的速度比Windows或Linux还快,而且用户界面也十分华丽,您相信吗?
别以为QNX是刚刚诞生的计算机操作系统,它早就在20年前就诞生了,但是QNX作为一种专业的操作系统,至今它还未能进入普通用户的计算机为我们服务。其中的原因无疑是很复杂的。
有趣的发音
QNX的发音也十分有趣,大家知道Linux用汉语发音就是“里讷克斯”,而QNX的发音就是“cue-nix”:)。如果您使用的是Pentium处理器系列的计算机,那么在这台计算机的硬盘上安装QNX操作系统是很容易的事情,QNX可以在Windows下安装,它和Linux一样,是一种类UNⅨ的操作系统。另人惊异的是QNX也是免费的操作系统,可以直接到QNX的网站上下载这个原版操作系统。当然,购买一张QNX的
CD-ROM也是很方便的。一张QNX的安装盘CD-ROM售价为30美元。在QNX的主页上有很详细的介绍和资料,还有关于QNX的新闻及应用软件可供用户阅读下载。
可以和Windows切换
有了QNX,您计算机里的操作系统不只是Windows独霸了,QNX完全可以取代霸道的Windows平台。很多初学计算机的朋友因为接触最多的是Windows平台,以至于他们误认为Windows98就是“OS”的唯一选择。现在不同了,使用QNX同样也能很好的管理计算机了。
简单的说,操作系统就是给计算机一个灵活的大脑,一个强健的心脏和突出的个性。没有操作系统,计算机什么也做不了,只能是一堆废物。
QNX是由一家位于加拿大的QNX软件系统公司(简称QSSL)推出的。该公司位于
渥太华(加拿大城市)的市郊。最近从该公司传来好消息说,该公司已经面向普通用户推出了可以免费使用、非商业用的个人用户版本的QNX实时平台或称作QNX RTP,最小的在Windows下安装文件只有24MB。当这个版本正式向公众推出的时候,大约有400000人次从网上下载了这个QNX RTP版本。这大大出乎了意料,没有想到竟然有这么多人对这个操作系统感兴趣。因为很多人在以前根本就没有听说过世界上还有这么一个免费的QNX操作系统。
该公司已被
RIM(Research In Motion)收购。
现在要在这么一台电脑上试装这个QNX操作系统。电脑的硬件配置为233 MHZ AMD K6 处理器,96MB内存,ATI All-in-Wonder Pro显示卡,Sound Blaster AWE 32 声卡,两个
硬盘驱动器和两个
CD-ROM驱动器,一个SCSI硬盘和一块标准的网卡。
在安装的过程中除了遇到一个小故障之外,一切还算顺利。那块SCSI卡没有能被QNX自动配置。查阅QSSL公司的资料,该公司说他们正在努力的修正这个SCSI的问题。
如果您是一位有经验的Linux用户,那么QNX会使您很快就能上手。虽然它和Linux有很大的区别。QNX RTP使用的命令和操作是和Linux的许多“shell”命令是兼容的。更令人满意的是QNX的文件分级目录(组织,文件名和目录)和Linux几乎是一样的。可以说QNX RTP和旧的Linux是十分相象的。这对许多喜欢Linux,对Linux有一定实际操作经验的用户来说无疑是一个福音。QNX在他们手里很快就能玩转。
但QNX和Linux最大的不同就是QNX的图形
用户界面设计的十分漂亮。尽管Linux使用的是经久世故的X Window系统,但是和QNX的称为“Photon”的
图形用户界面相比还是显得Linux略胜一筹。
QNX RTP的
图形用户界面-Photon MicroGUI非常酷
QNX的Photon MicroGUI窗口系统是最“酷”的GUI(图形用户界面)。安装QNX后,你就会发现QNX的默认桌面背景“炫”得让你晕倒,得让人给你叫个医生来。
另外要提到的是,QNX RTP 的运行速度是那样的快,是否所有的用户都能够接受?没有错,在同样的电脑硬件配置情况下,QNX确实运行速度要比其他的Windows系统要快得多。在使用鼠标和窗口的操作界面下,QNX的运行速度确实是让人满意的。给人以一种“豪爽”的感觉。
以上关于QNX的优点介绍得让你立刻想鼓掌,狠不得马上下载一个QNX试一试,但是有些问题是要说清楚的。QNX尽管是非常好的一个操作系统。但是你平时主要工作如果需要处理
电子表格,管理金融等等,那么QNX可能不太适合你。因为能在QNX下运行的应用软件并不多。这也是制约QNX发展的一个重要原因了。
但是也不必太担心软件不够用的问题,起码QNX能让你进行很多基本的操作。你可以用QNX来计算数据,播放CD音乐,使用电子邮件程序,进行文字处理工作,简单的图象浏览,还有一些Linux上已经除去的
屏幕保护程序,桌面背景转换,软件的安装管理功能等等。甚至你还可以在QNX上添加专用版本的Real Player软件,喜欢玩游戏的朋友还可以安装Quake这个著名的游戏。所有在QNX上玩过Quake的朋友都说Quake在QNX上的运行速度比任何操作系统都要快。这确实是一个对游戏迷来说是非常好的消息。
所有优点
好了,现在我们来总结一下QNX的所有优点:
速度极快:QNX的运行速度非常快,其他的操作系统没有办法和它相比。
系统非常安全:QNX上没有计算机病毒,这是和Linux一样的,所以QNX RTP不存在被病毒破坏资料的危险,只有在微软Windows系统中才会有被病毒感染的噩梦。另外,QNX的用户管理相当出色,它绝对不会让一个没有输入正确密码的人闯入计算机系统中。
QNX有一个最好的
网页浏览器:QNX里的网页浏览器叫做“Voyager”,浏览网页的速度快得象火箭。和Voyager相比,微软的IE和
网景公司的NC浏览器简直就是一辆破旧的老爷车。但是这个Voyager浏览器目前还有些BUG,QSSL公司的
软件工程师正在改进它。
QNX的最大不同:QNX完全不像Windows,那是一件好事情。它是免费的操作系统,可以在网上下载安装使用。它的使用和操作也十分的容易。
- vxworks 实时操作系统
VxWorks 是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统.Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似Mi ...
- VxWorks Fuzzing 之道:VxWorks 工控实时操作系统漏洞挖掘调试与利用揭秘
转载:freebuf 0×00 前言 关于VxWorks,这里引用44CON议题<攻击 VxWorks:从石器时代到星际>探究 一文章中的介绍: VxWorks 是世界上使用最广泛的一种在 ...
- ucos实时操作系统学习笔记——内核结构和任务创建
对于ucos实时操作系统,邵贝贝的那本书已经写得很详细了,我因为之前不深的研究过ucos,所以在这里做一个笔记,写一些个人对该操作系统的理解,仅仅是个人理解,如果有人看到这边随笔有不对的地方,望给我指 ...
- ucos实时操作系统学习笔记——操作系统在STM32的移植
使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...
- 嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析
/*************************************************************************************************** ...
- 第三周作业、实时操作系统µC/OS介绍及其它内容
作业要求 见<实时控制软件设计>第三周作业 1 阅读笔记--µC/OS 1.1 基本介绍 µC/OS是由Micrium公司研发的实时操作系统,以µC/OS-II或µC/OS-III为内核, ...
- RTX51 Tiny实时操作系统学习笔记—初识RTX51 Tiny
一,RTX51 Tiny简单介绍 RTX51 Tiny是一种实时操作系统(RTOS),能够用它来建立多个任务(函数)同一时候运行的应用(从宏观上看是同一时候运行的,但从微观上看,还是独立运行的 ...
- TI 实时操作系统SYS/BIOS使用总结
1:概述: SYS/BIOS 是一个可扩展的实时的操作系统.具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片) ...
- 嵌入式实时操作系统Nucleus PLUS综述
近些年来,随着嵌入式系统飞速的发展.嵌入式实时操作系统广泛地应用在制造工业.过程控制.通讯.仪器仪表.汽车.船舶.航空航天.军事.装备.消费类产 品等方面. Nucleus PLUS 是为实时嵌入式应 ...
随机推荐
- redhat 挂载 iso文件 提示 mount :not a directory
- 应用dom4j读取xml的例子
1. 样例xml <?xml version="1.0" encoding="UTF-8"?> <students> <stude ...
- Java反射机制(Class类的使用)
1:通过无参构造实例化对象 package cn.itcast; /* * 通过无参构造实例化对象 * 通过Class类本身实例化对象,使用newInstance方法 * 需要注意的是:实例化类中存在 ...
- LightOJ 1236 Pairs Forming LCM (LCM 唯一分解定理 + 素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1236 Pairs Forming LCM Time Limit:2000MS Memor ...
- ThinkPad X220i 安装 Mac OSX
联想笔记本是安装黑苹果相对比较容易的~~ ThinkPad X220i配置 型号:ThinkPad X220i CPU: i3 内存:4G 显卡:HD3000 其他: X220i的通用硬件 确认以 ...
- commondline 之二 执行类
E:\cn\zno\commandline\Test.class package cn.zno.commandline; import java.lang.management.ManagementF ...
- Spring JTA应用JOTM & Atomikos I Application
关于Spring JTA的介绍非常多了,这里就不再一再阐述其优越性怎么怎么了,直接开始正题.一个大致的需求如下,用户在进行增删改操作时,会同时更新2至3个数据库的数据表,操作需要事务来包裹,以便在操作 ...
- 圣杯VS双飞翼
双飞翼: <!DOCTYPE html> <html> <head> <title>推荐封面</title> <meta name=& ...
- UI:MVC设计模式
不是因为有些事情难以做到,我们才失去自信:而是因为我们失去了自信,有些事情才显得难以做到.自信的第一步就是去尝试.不是因为有希望才坚持,而是因为坚持才有了希望.坚持尝试,就有可能成功.加油! Xcod ...
- ActionBar PopuMenu
PopupMenu popupmenu可以非常方便得实现在指定view下弹出一个菜单,实现类似ActionBar中的效果. public void showPopupMenu(View view){ ...