天泽苑在线cs窗口路径怎么设置?

CS 1.6天泽在线那个广告你搞定没,我也中招了。妈的太恶心了。_百度知道
CS 1.6天泽在线那个广告你搞定没,我也中招了。妈的太恶心了。
我有更好的答案
按默认排序
呵呵,是有点。不过你这问题说的不是很清楚
是啊 采纳吧
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁y的主页 - 日记
一杯好茶,甘之如饴,连皮肤都爱喝!茶--“神农尝百草之滋味,水源之甘苦,令民知所避就,当此之时,日遇七十二毒,得荼而解”,“荼”便是茶的古称,历代著名的医书皆记载了茶的功效,包括明目、令人思维敏捷、轻身换骨等。
肌肤也爱喝好茶
  茶的好处不言自明。在东方的养生之术里,茶具有非常重要的地位,公元1211年日本僧侣Eisai在其著作《饮茶养生》一书中写道:“茶是养生的神奇良方,对延年益寿具有超凡...
据说左手的无名指有一根血管直接与心脏联系,所以新人一定要把结婚戒指亲手戴在对方的左手无名指上。&爱你到心里!情愿为你的爱而受戒!&戒指戴在不同的手指有不同的意义呀。&右手和左手都有不同的意义。右手小指:不谈恋爱。&右手无名指:热恋中。&右手中指:名花有主。&右手食指:单身贵族。&左手小指:不婚族。&左手无名指:结婚。&左手中指:订婚。&左手食指:未婚。&大拇指都是代表权势的意思,也可以做自信的意思。&戴戒指是有讲究的。按西方的传统习惯来说,左手显示的是上帝赐给你的运气,因此,戒指通常戴在左手上。&国际上比较流行的戴法是:食指———想结婚,表示未婚;中指———已经在恋爱中;无名指———表示...
现代社会环境污染日益严重,及时排除体内的有害物质及过剩营养,保持体内清洁是身体健康的重要保障。这里介绍10种有助于排毒的食物,以飨读者。
一、蜂蜜:味甘,性平,自古就是滋补强身、排毒养颜的佳品。蜂蜜富含维生素B、维生素D、维生素E、果糖、葡萄糖、麦芽糖、蔗糖、优质蛋白质、钾、钠、铁、天然香料、乳酸、苹果酸、淀粉酶、氧化酶等多种元素,对润肺止咳、润肠通便、排毒养颜有显著功效。蜂蜜中的主要成分葡萄糖和果糖(含量65%一80%),很容易被人体吸收利用,此外,还含有多种人体所需的氨基酸、维生素B1、维生素B2、维生素C、铁、磷等。常吃蜂蜜能达到排出毒素、美容养颜的效果,对防治心血管疾病和神...
&&恒达系列软件【注册版】01.恒达办公用品管理软件完美注册版&&&&下载地址:#
02.恒达仓库管理软件V9.0完美注册版&&&&下载地址:#
03.恒达ERP完美注册版&&&&&&&&&&&&&...
在日本发生了一件千真万确的事:有人为了装修家里,拆开了墙;日式住宅的墙壁通&&常是中间架了木板后,两边批上泥土,其实里面是空的。&
&&他拆墙壁的时候,发现一只&&&壁虎被困在那里一根从外面钉进来的钉子钉住了那只壁虎的尾巴。那人见状,既觉可&&&怜又感好奇,他仔细看了看那根钉子,天啊!那根钉子是十年前盖那房子的时候钉的。&
&&&&&&&到底怎么回事?那只壁虎竟然困在墙壁里活了整整十年!黑暗中的墙壁里的十年,真&&不简单。不对呀?他继而寻思,尾巴被钉住了,一个步子也跨不出的这只壁虎,到底&靠什么撑过了这十年?他于是暂时停止了装修工程看看它到底吃了什么&!他要一探究&&竟。&
第一章&&&&&&&&《计算机基本知识》
1.1&&计算机的产生、发展与应用
一、产生和发展
1、世界上第一台电子计算机(1946年2月、美国、名为ENIAC)
2、计算机的发展经历了四代:
第一代(46年-58年):电子管计算机;
第二代(58年-64年):晶体管计算机;
第三代(64年-71年):中、小规模集成电路计算机;
第四代(71年--):大、超大规模集成电路计算机;
而第五代计算机(智能计算机),正在研制当中。
3、我国计算机的发展概况:
&&&&&1953年开始研究,1958年研制出第一台计算机(即&103型通用数字电子计算机&...
患者:“医生,你有什么妙药可以治好我的梦游症呢?”
&&&&医者:“这里有一个装有特殊物品的盒子,可以治好你的病。你每天上床以后,把盒子里的东西撤到床的周围。”
&&&&患者:“盒子里是什么东西?”
&&&&医者:“图钉。”
EXCEL2000的编辑窗口,插入、移动、复制、删除工作表。&
第一课Excel(156页)
Excel是一个强有力的电子表格处理软件,它主要用于对数据的处理、统计分析与计算。
一、基本概念:
1.一个Excel文件称为一个工作簿。在一个工作簿中可以包括若干工作表。
2.工作表——工作簿中的每一张表称为工作表。每个工作表下面都会有一个标签,第一张工作表默认为Sheet&1以此类推。
二、同时选定多行...
讲解WORD2003工作界面,保存文档、打开文档、新建文档(教科书第六章90-105页)
Word&2003是一个字处理软件。
启动Word&2003,在桌面上双击Word&2003图标。
一、标题栏,...
讲解word2003工作界面,保存文档,新建文档(教科书第六章90-105页)
word2003是一个文字处理软件。
启动word2003,在桌面双击word2003图标。
一、标题栏,它位于窗口的最上端,它的作用是显示当前正在编辑的文件名。
二、word2003的九项菜单分别是文件、编辑、视图、插入、格式、工具、表格、窗口、帮助。
三、窗口右上角分别是:最小化、还原、关闭、最大化按钮。
四、标点符号、英文字母、空格和各种特殊符号等,这些统称为字符。
五、新建文件(ctrl+n)、保存文件(ctrl+s)、打开文件(ctrl+0)、关闭文件、退出程序(alt+f+...日更新_维库仪器仪表交易网
让卖家找上门
您所在的位置: & 今日更新 (864)
每日更新今日更新产品条数: 864 ,专题软件合集
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
不生产软件,我们只是软件的搬运工,如果不会下载请看【】如果您发现该软件不能下载,请点击【】谢谢!.
为了保证您快速的下载速度,我们推荐您使用[]等专业工具下载.
为确保下载的软件能正常使用,请使用[ ]或以上版本解压本站软件,如需解压密码请查看压缩包注释.
站内提供的破解版及注册版均来自互联网纯属学习交流之用,请在24小时内删除,如侵犯您的版权请与我们联系,我们会尽快改正.
3363491474221003688375982229728145856358268515115098450543406773942338261368703686735089342363399729486
没有相关软件嵌入式linux的系统搭建与配置_百度经验
&&&&&&互联网
分享有回报:
嵌入式linux的系统搭建与配置
目录1.摘要………………………………………………………22.UBOOT,LINUX内核,文件系统的介绍及相互关系..32.1嵌入式系统简介………………………………………32.2嵌入式Linux概述……………………………………32.3 UBOOT简介………………………………………….43.UBOOT的启动过程……………………………………..64.内核的主要功能和裁剪……………………………………74.1Linux的编译…………………………………………………74.2嵌入式Linux的配置和剪裁…………………………………..85.文件系统的制作过程………………………………………86.交叉编译器的搭建和环境变量的设置…………………..97.驱动程序的编写过程与关键点…………………………117.1Linux网络驱动程序的结构………………………………117.2 网络驱动程序的基本方法………………………………127.3 网络驱动程序中用到的数据结构……………………….127.4 常用的系统支持………………………………………….147.5编写Linux网络驱动程序中需要注意的问题…………188.参考文献………………………………………………..20
摘要嵌入式系统是以应用为中心,以计算机为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序4部分组成,用于实现对其它设备的控制、监视或管理等功能。其广泛应用于控制领域、消费电子产品等行业,已成为现代电子领域的重要研究方向之一。嵌入式Linux的研究已经成为当前信息技术研究的热点,它的应用蕴含着巨大的商业价值,并且己经广泛的应用于各种信息家电、通讯产品、工业控制中。论文首先介绍了ARM和嵌入式Linux操作系统的特点和当前的发展概况。然后阐述了嵌入式Linux开发流程以及移植到具体硬件平台需要完成的工作,如U-Boot的移植、Linux内核的编译与裁剪、文件系统的制作、驱动程序的编写等。关键字:嵌入式;ARM;嵌入式Linux; Linux内核;驱动程序
LINUX,UBOOT,文件系统的介绍及相互关系2.1嵌入式系统简介嵌入式系统是以应用为中心,以计算机为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。单片机、单板机控制系统以及一些专用的工业控制计算机都可以称作嵌入式系统,它是嵌入式系统领域的重要组成部分,只是更着重于对各自硬件系统的研究。嵌入式系统更着重于对软件系统进行研究,顺应了软硬件协同设计以及应用需求的发展。目前,嵌入式系统己逐步发展成为一门学科,朝着系统化和规范化的方面发展。嵌入式系统学科和产业的发展使得设计人员能够从容地面对越来越复杂的应用需求,通过软件和硬件的模块化设计大大地简化和加快应用系统的开发.嵌入式系统主要包括硬件和软件两部分。硬件包括处理器、存储器及外部设备、I/0端口和图形控制器等;软件部分包括操作系统(OS)和用户应用程序。嵌入式系统硬件的核心是嵌入式微处理器。它的功能、外设集成度、速度、功耗、体积、成本、可靠性和电磁兼容性等方面均受到应用要求的制约,是各个半导体厂商之间竞争的热点。嵌入式系统的软件是实现嵌入式系统功能的关键,软件要求固化存储,代码的高质量、高可靠性和高实时性在许多场合也是基本要求。多任务嵌入式操作系统是知识集成的平台,是嵌入式系统走向工业标准化道路的基础,是嵌入式系统研究的重要方向。现在人们讲嵌入式系统时,某种程度上是指近些年来比较热门的具有操作系统的嵌入式系统。2.2嵌入式Linux概述Linux操作系统源于芬兰一位大学生—LinusTorvalds的课余作品,随着Intemet的发展,Linux操作系统在全球计算机爱好者的关怀下,不断地发展和成长,己成为当前最流行的免费操作系统,任何人都可以自由的使用Linux源程序。嵌入式Linux操作系统的组成,我们可以和PC机相对应来理解,在PC机上,Windows的启动大致有BIOS、内核、文件系统和初始化程序几个部分;那么相对而言,嵌入式Linux的移植有Bootloader、Linux内核、文件系统、初始化和用户的应用程序几部分,Bootloader完成系统的初始化和引导。Linux操作系统具有以下几大特点:(1)开放源码,丰富的软件资源Linux遵循GPL(GNU通用许可证),用法律保障了用户免费获得内核源代码的权利。由于嵌入式系统千差万别,往往需要针对某一具体应用去修改和优化系统,这样,能否获得源代码就至关重要。Linux是自由的操作系统,它的开放源代码使用户获得了最大的自由度。Linux上的软件资源十分丰富,每种通用程序在Linux上都可以找到,并且每天都在增加。在Linux上往往不需要从头做起,而是先选择一个类似的自由软件,进行二次开发。这就大大节省了开发工作量,缩短了开发时间。(2)功能强大的内核,性能高效、稳定、多任务Linux的内核非常稳定。它的高效和稳定性已经在各个领域,尤其在网络服务器领域得到了事实的验证,而且Linux内核小巧灵活,易于裁剪。这使Linux能很适合嵌入式系统的应用。(3)支持多种体系结构Linux能支持X86,ARM,MIPS,POWERP,ALPHA,SPARC等多种体系结构。目前,Linux己被移植到数十种硬件平台上,几乎所有流行的CPU,Linux都支持。(4)完善的网络通信、图形和文件管理机制Linux自产生之日起就与网络密不可分,网络是Linux的强项。另外,它支持ext2,fatl6,fat32,romfs等多种文件操作系统。在图形系统方面,Linux上既有成熟的xWindow,也有embedcd QT,MiniGUI等嵌入式图形用户界面GUI,还有ysvgalib,framebuffer等优秀工具,可以适合不同的用途。(5)支持大量的周边硬件设备,驱动丰富Linux上的驱动己经非常丰富了,支持各种主流硬件设备和最新硬件技术,而且随着Linux的广泛应用,许多芯片厂家也已经开始提供Linux上的驱动。这一步促进了Linux各种硬件平台上的应用。(6)大小功能都可定制Linux继承了Unix的优秀设计思想,内核与用户界面是完全独立的。它非常灵活,各部分的可定制性都很强,能适合多种需求。2.3 UBOOT简介U—Boot是一个非常复杂的东酉,它也体现了嵌入式系统的一个非常重要的特征:自己定制。它脱胎于PC机的Linux,可从网站上直接下载,U.Boot和其它任何BOOTLOADER都是一样的,主要实现对系统进行初始化、系统引导、FLASH操作等功能。开发平台的U.Boot主要是对板子的硬件进行初始化,包括:时钟和PLL、定时器、调试串D(DebugDART)等等。有了U.B00t我们可以在主机的超级终端通过调试串口和目标机进行通信和设置。2.3.1编译U-Boot在Linux系统下,用下面的命令对U.Boot进行编译$cdU.BOOT;进入目录Smakeat91rm9200dk_eonfig;编译Smakeall$gzip_cu-boot.bin&u-boot.gz;压缩为gz文件编译boot.bin$cdBootSmake编译loader.bin$cdLoaderSmake2.3.2 &U.Boot命令在本系统中,采用的是U-Boot,U-Boot在嵌入式系统中相当于Pc机的BIOS加上操作系统引导头部的内容,并且引导操作系统进行装载和运行,U.Boot启动后有一系列的命令,使得我们能够方便的对FLASH、RAM进行操作,U.Boot已经对系统的频率、定时器进行了设置,初始化了一个调试串口,我们可以通过串口或者以太网进行数据的下载。下面是U.Boot常用的命令:go 一在地址’addr’处开始程序执行run一运行命令bootm 一从内存中进行应用程序影像运行bootp 一通过网络用BootP/TFTP协议来启动影像tf砸boot 一通过网络用TFTP协议、设置服务器和客户机的IP地址进行影像文件传送loadb 一通过串口线(kermitmode)来装载二进制文件pfintcnv 一打印环境变量 .setcnv 一设置环境变量saveenv 一保存环境变量到内存下面是U.Boot的简单环境变量baudrate 一波特率bootdelay--Boot延迟bootcmd --Boot命令bootargs —Boot参数ipaddr 一客户机IP地址servefip 一服务器地址loadaddr 一装载地址etlladdr 一网卡MAC地址
UBOOT的启动过程嵌入式Linux系统一般没有自举程序,必须通过启动程序来引导硬件系统进入操作系统。启动程序的工作包括:改变系统时钟、关闭WATCHDOG、初始化存储控制器等。本文针对本嵌入式控制系统所需的硬件方案,植入Uboot1-3.4启动程序。U-Boot是一种功能强大的引导转载程序。它不仅支持Linux、Vxworks等操作系统,还支持PowerPC、ARM等多种系列处理器。 Uboot启动过程分为两个阶段。第一阶段由汇编来实现,用于完成依赖于CPU体系结构的初始化,并调用第二阶段的代码。第二阶段由C语言实现,完成相关初始化后,进入命令循环以等待用户命令,或将参数传给内核,引导Linux内核启动。图中给出了Uboot的启动流程。& &&& Uboot-1.3.4中对at91rm9200dk系列的开发板有很好的支持,只需做少量修改即可使用。但是在目前U-Boot-1.3.4引导系统中,不能识别本论文中采用的8MB NOR Flash(SPANSION公司的S29GL064N90TFI04)和1GB NAND Flash(SAMSUNG公司的K9K8G08U0A)两款芯片,需要自行移植。
Linux的编译,内核配置和裁剪4.1Linux的编译在配置内核前的须做必要的设置,主要在内核原码中设置文件Makefile,用下列指令打开Makefile文件:$viMakefile在Makefile中主要设置两个地方:ARCH CROSSCOMPILE。ARCH:=arm;表示目标板为arm。CROSS COMPILE=交叉编译工具的地址 ;设置交叉编译工具的地址,例如CRoSSCOMPILE=lusr/10cal/arm/2.95.3、birdarm.1inux。还要在脚本文件mkimage中把路径改为9200/bootldr/u-boot-1.0.O/tools。(具体的路径和你的u-boot放的位置有关)然后按如下命令顺序进行内核编译即可:内核配置:Smake&&& menuconfig& 或makcxeon!ig内核编译:Smaketiean&& $make& dep& $make& $./mkimage;运行mkimage脚本文件4.2嵌入式Linux的配置和剪裁在Linux下,用makemenuconfig或makexeontig进入配置界面。在内核配置中,一般有四种选择:Y(选择)、N(不选)、M(模块)和数字,用户可以根据剪裁需要进行设置,最后配置完毕,选择是否对配置结果进行保存?保存为.eonfig文件。
嵌入式Linux文件系统的制作过程嵌入式系统可以使用硬盘和光盘,但是这与嵌入式系统的便携式特性相违背,所以一般采用Flash作为存储介质。和硬盘相比,Flash有自己独特的物理特性,所以必须使用专门的文件系统。嵌入式系统对文件的操作是通过层次结构实现的。对于用户程序来说,文件是有结构的文件,用户程序通过文件I/O函数操作文件。嵌入式文件系统是嵌入式系统的一部分,它的任务是对逻辑文件进行管理,其工作包括提供对逻辑文件的操作(复制、删除、修改等)接口,方便用户操作文件和目录。在文件系统的内部,又根据存储设备的特点,适用不同的文件组织模式来实现文件的逻辑结构,比如磁带终使用的顺序文件以及大多数操作系统适用的树状文件。此外,文件系统要对管理文件的安全性负责。目前支持闪存的文件系统技术有以下几种:eJFFS2和Yaffs。这些文件系统可以使用在没有初始化的NANDFlash和有CFI接口的NORFlash中。eTrueFFS,该文件系统相当于Linux中的MTD层,必须配合其他文件系统。eFTL/NTFL,它是一种中间层解决方案的统称,为上层文件系统提供接口。eRAMFS、CRAMFS和ROMFS,这些文件系统用于早期的小容量闪存设备,系统功能比较简单,仅提供基本接口,只属于只读的闪存文件系统。适合存储空间小的系统。可按照如下步骤制作自己的文件系统:解开压缩的文件系统:$gamzipramdisk.gz文件系统挂载:$mount_oloopramdisk/mnt/nweramdisk(注:newramdisk是新建的目录)。进入newramdisk目录进行操作,随意的增减文件:Sod/nmt/newramdisk(注:进入目录后敲入命令随意的增减文件)退出newramdisk目录后御载文件系统:Sumount/mnt/newramdisic压缩文件系统,生成新的文件系统映象:$gzip-c-、,9ramdisk&./newramdisk
Linux中交叉编译器的搭建和环境变量的设置1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装一下(如果已经安装好的话,就可以免去这一步了):   #sudo apt-get install gcc g++ libgcc1 libg++ make gdb 2. 下载arm-linux-gcc-3.4.1.tar.bz2到任意的目录下。 3. 解压 arm-linux-gcc-3.4.1.tar.bz2 &  #tar -jxvf arm-linux-gcc-3.4.1.tar.bz2   解压过程需要一段时间,解压后的文件形成了 usr/local/ 文件夹,进入该文件夹,将arm文件夹拷贝到/usr/local/下   # cd usr/local/&   #cp -rv arm /usr/local/   现在交叉编译程序集都在/usr/local/arm/3.4.1/bin下面。 4.  修改环境变量,把交叉编译器的路径加入到PATH。&&&  方法一:修改/etc/bash.bashrc文件 &&&&&&&&&&&&&&&& #vim /etc/bash.bashrc && & & & & & & & 在最后加上: &&&&&&&&&&&&&&& export PATH=$PATH:/usr/local/arm/3.4.1/bin &&&&&&&&&&&&&&& export PATH &&   方法二:修改/etc/profile文件: &&& &&& & & & & # vim /etc/profile &&& &&&&&&&&&& 增加路径设置,在末尾添加如下,保存/etc/profile文件: &&& &&& &&&&&& export PATH=$PATH:/usr/local/arm/3.4.1/bin &   方法三:#export PATH=$PATH:/usr/local/arm/3.4.1/bin  &&& &&& & & & && 注:(这只能在当前的终端下才是有效的!) 5. 立即使新的环境变量生效,不用重启电脑: &&&  对应方法一:#source /root/.bashrc &&  对应方法二:# source /etc/profile 6. 检查是否将路径加入到PATH: &&&   # echo $PATH && 显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成。 7. 测试是否安装成功 && # arm-linux-gcc -v & 上面的命令会显示arm-linux-gcc信息和版本:  Reading specs from /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/specs  Configured with&:/work/crosstool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc- 3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/usr/local/arm/3.4.1 --with-headers=/usr/local/arm/3.4.1/arm -linux/include --with-local-prefix=/usr/local/arm/3.4.1/arm-linux --disable -nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable- languages=c,c++ --enable-shared --enable-c99 --enable-long-long  Thread model: posix  gcc version 3.4.1 8.编译Hello World程序,测试交叉工具链 & 写下下面的Hello World程序,保存为hello.c &&& #include &stdio.h& &&& int main() &&& { &&& printf(&Hello World!/n&); && &&& return 0; &&& } &&&执行下面的命令: &&& # arm-linux-gcc -o hello hello.c-------------------------------------------------------------修改环境变量这一步修改/etc/profile文件在path中添加arm-linux-gcc路径if [ &`id -u`& -eq 0 ]; then & PATH=&/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/arm/3.4.1/bin& else & PATH=&/usr/local/bin:/usr/bin:/bin:/usr/games& fi再source /etc/profile就可以刷新环境变量
驱动程序的编写过程与关键点7.1Linux网络驱动程序的结构所有的Linux网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device 结构),它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就可以存取自身的数据(类似面向对象程序设计时的this引用)。 一个网络设备最基本的方法有初始化、发送和接收。|deliver packets   |  |receive packets queue||(dev_queue_xmit())|  |them(netif_rx()) |-------------------    ---------------------| methods and variables(initialize,open,close,hard_xmit,|| interrupt handler,config,resources,status...)         -------------------------------------------------------   |       |                                  ----------------------|send to hardware |            |receivce from hardware|             -----------------------------------------------------| hardware media |-----------------------------------------------------初始化程序完成硬件的初始化、device中变量的初始化和系统资源的申请。发送程序是在驱动程序的上层协议层有数据要发送时自动调用的。一般驱动程序中不对发 送数据进行缓存,而是直接使用硬件的发送功能把数据发送出去。接收数据一般是通过硬件中断来通知的。在中断处理程序里,把硬件帧信息填入一个skbuff结构中,然后调用netif_rx()传递给上层处理。7.2 网络驱动程序的基本方法网络设备做为一个对象,提供一些方法供系统访问。正是这些有统一接口的方法,掩蔽了硬件的具体细节,让系统对各种网络设备的访问都采用统一的形式,做到硬件无关性。下面是最基本的方法。(1) 初始化(initialize)(2)打开(open)(3)关闭(stop)(4) 发送(hard_start_xmit)(5) 接收(reception)(6)硬件帧头(hard_header)(7) 地址解析(xarp)(8) 参数设置和统计数据7.3 网络驱动程序中用到的数据结构最重要的是网络设备的数据结构。定义在include/linux/netdevice.h里。7.4 常用的系统支持7.4.1 内存申请和释放include/linux/kernel.h里声明了kmalloc()和kfree()。用于在内核模式下申请和释放内存。&Void *kmalloc(unsigned int len,int priority);void kfree(void *__ptr);与用户模式下的malloc()不同,kmalloc()申请空间有大小限制。长度是2的整次方。可以申请的最大长度也有限制。另外kmalloc()有priority参数,通常使用时可以为GFP_KERNEL,如果在中断里调用用GFP_ATOMIC参数,因为使用GFP_KERNEL则调用者可能进入sleep状态,在处理中断时是不允许的。 Kfree()释放的内存必须是kmalloc()申请的。如果知道内存的大小,也可以用kfree_s()释放。7.4.2 request_irq()、free_irq()这是驱动程序申请中断和释放中断的调用。在include/linux/sched.h里声明。Request_irq()调用的定义:&int request_irq(unsigned int irq,void (*handler)(int irq, void *dev_id, struct pt_regs *regs),unsigned long irqflags,const char * devname,void *dev_id);irq是要申请的硬件中断号。在Intel平台,范围0--15。Handler是向系统登记的中断处理函数。这是一个回调函数,中断发生时,系统调用这个函数,传入的参数包括硬件中断号,device id,寄存器值。Dev_id就是下面的request_irq时传递给系统的参数dev_id。Irqflags是中断处理的一些属性。比较重要的有SA_INTERRUPT,标明中断处理程序是快速处理程序(设置SA_INTERRUPT)还是慢速处理程序(不设置SA_INTERRUPT)。快速处理程序被调用时屏蔽所有中断。慢速处理程序不屏蔽。还有一个SA_SHIRQ属性,设置了以后运行多个设备共享中断。Dev_id在中断共享时会用到。一般设置为这个设备的device结构本身或者NULL。中断处理程序可以用dev_id找到相应的控制这个中断的设备,或者用irq2dev_map找到中断对应的设备。&Void free_irq(unsigned int irq,void *dev_id);7.4.3 时钟时钟的处理类似中断,也是登记一个时间处理函数,在预定的时间过后,系统会调用这个函数。在include/linux/timer.h里声明。&Struct timer_list {struct timer_list *struct timer_list *unsigned long unsigned long void (*function)(unsigned long);};void add_timer(struct timer_list * timer);int del_timer(struct timer_list * timer);void init_timer(struct timer_list * timer);使用时钟,先声明一个timer_list结构,调用init_timer对它进行初始化。 Time_list结构里expires是标明这个时钟的周期,单位采用jiffies的单位。 Jiffies是Linux一个全局变量,代表时间。它的单位随硬件平台的不同而不同。 系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位 就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间 间隔了。所以expires/HZ就是以秒为单位的这个时钟的周期。 Function就是时间到了以后的回调函数,它的参数就是timer_list中的data。 Data这个参数在初始化时钟的时候赋值,一般赋给它设备的device结构指针。 在预置时间到系统调用function,同时系统把这个time_list从定时队列里清除。所以如果需要一直使用定时函数,要在function里再次调用add_timer()把这个timer_list加进定时队列。7.4.4 I/OI/O端口的存取使用:&inline unsigned int inb(unsigned short port);inline unsigned int inb_p(unsigned short port);inline void outb(char value, unsigned short port);inline void outb_p(char value, unsigned short port);在include/adm/io.h里定义。Inb_p()、outb_p()与inb()、outb_p()的不同在于前者在存取I/O时有等待 (pause)一适应慢速的I/O设备。为了防止存取I/O时发生冲突,Linux提供对端口使用情况的控制。在使用端口 之前,可以检查需要的I/O是否正在被使用,如果没有,则把端口标记为正在使用,使用完后再释放。系统提供以下几个函数做这些工作。&Int check_region(unsigned int from, unsigned int extent);void request_region(unsigned int from, unsigned int extent,const char *name);void release_region(unsigned int from, unsigned int extent);其中的参数from表示用到的I/O端口的起始地址,extent标明从from开始的端口数目。Name为设备名称。7.4.5 中断打开关闭系统提供给驱动程序开放和关闭响应中断的能力。是在include/asm/system.h 中的两个定义。&#define cli() __asm__ __volatile__ (&cli&::)#define sti() __asm__ __volatile__ (&sti&::)7.4.6 打印信息类似普通程序里的printf(),驱动程序要输出信息使用printk()。在include /linux/kernel.h里声明。&Int printk(const char* fmt, ...);其中fmt是格式化字符串。...是参数。都是和printf()格式一样的。7.4.7 注册驱动程序如果使用模块(module)方式加载驱动程序,需要在模块初始化时把设备注册到系统设备表里去。不再使用时,把设备从系统中卸除。定义在drivers/net/net_init.h里的两个函数完成这个工作。&Int register_netdev(struct device *dev);void unregister_netdev(struct device *dev);dev就是要注册进系统的设备结构指针。在register_netdev()时,dev结构一般填写前面11项,即到init,后面的暂时可以不用初始化。最重要的是name指针和 init方法。Name指针空(NULL)或者内容为'\0'或者name[0]为空格(space),则系统把你的设备做为以太网设备处理。以太网设备有统一的命名格式,ethX。对以太网这么特别对待大概和Linux的历史有关。 Init方法一定要提供,register_netdev()会调用这个方法让你对硬件检测和设置。Register_netdev()返回0表示成功,非0不成功。7.4.8 sk_buffLinux网络各层之间的数据传送都是通过sk_buff。Sk_buff提供一套管理缓冲区的方法,是Linux系统网络高效运行的关键。每个sk_buff包括一些控制方法和一块数据缓冲区。控制方法按功能分为两种类型。一种是控制整个buffer链的方法,另一种是控制数据缓冲区的方法。Sk_buff组织成双向链表的形式,根据网络应用的特点,对链表的操作主要是删除链表头的元素和添加到链表尾。Sk_buff的控制方法都很短小以尽量减少系统负荷。(translated from article written by Alan Cox)常用的方法包括:.alloc_skb() 申请一个sk_buff并对它初始化。返回就是申请到的sk_buff。.dev_alloc_skb()类似alloc_skb,在申请好缓冲区后,保留16字节的帧头空间。主要用在Ethernet驱动程序。.kfree_skb() 释放一个sk_buff。.skb_clone() 复制一个sk_buff,但不复制数据部分。.skb_copy()完全复制一个sk_buff。.skb_dequeue() 从一个sk_buff链表里取出第一个元素。返回取出的sk_buff,如果链表空则返回NULL。这是常用的一个操作。.skb_queue_head() 在一个sk_buff链表头放入一个元素。.skb_queue_tail() 在一个sk_buff链表尾放入一个元素。这也是常用的一个操作。网络数据的处理主要是对一个先进先出队列的管理,skb_queue_tail()和skb_dequeue()完成这个工作。.skb_insert() 在链表的某个元素前插入一个元素。.skb_append() 在链表的某个元素后插入一个元素。一些协议(如TCP)对没按顺序到达的数据进行重组时用到skb_insert()和skb_append()。.skb_reserve() 在一个申请好的sk_buff的缓冲区里保留一块空间。这个空间一般是用做下一层协议的头空间的。.skb_put() 在一个申请好的sk_buff的缓冲区里为数据保留一块空间。在alloc_skb以后,申请到的sk_buff的缓冲区都是处于空(free)状态,有一个tail指针指向free空间,实际上开始时tail就指向缓冲区头。Skb_reserve()在free空间里申请协议头空间,skb_put()申请数据空间。见下面的图。.skb_push() 把sk_buff缓冲区里数据空间往前移。即把Head room中的空间移一部分到Data area。.skb_pull() 把sk_buff缓冲区里Data area中的空间移一部分到Head room中。&--------------------------------------------------| Tail room(free) |--------------------------------------------------After alloc_skb()--------------------------------------------------| Head room | Tail room(free) |--------------------------------------------------After skb_reserve()--------------------------------------------------| Head room | Data area | Tail room(free) |--------------------------------------------------After skb_put()--------------------------------------------------|Head| skb_ | Data | Tail room(free) ||room| push | | || | Data area | |--------------------------------------------------After skb_push()--------------------------------------------------| Head | skb_ | Data area | Tail room(free) || | pull | | || Head room | | |After skb_pull()7.5.编写Linux网络驱动程序中需要注意的问题7.5.1 中断共享Linux系统运行几个设备共享同一个中断。需要共享的话,在申请的时候指明共享方式。系统提供的request_irq()调用的定义:&int request_irq(unsigned int irq,void (*handler)(int irq, void *dev_id, struct pt_regs *regs),unsigned long irqflags,const char * devname,void *dev_id);如果共享中断,irqflags设置SA_SHIRQ属性,这样就允许别的设备申请同一个 中断。需要注意所有用到这个中断的设备在调用request_irq()都必须设置这个属 性。系统在回调每个中断处理程序时,可以用dev_id这个参数找到相应的设备。一 般dev_id就设为device结构本身。系统处理共享中断是用各自的dev_id参数依次调用每一个中断处理程序。7.5.2 硬件发送忙时的处理主CPU的处理能力一般比网络发送要快,所以经常会遇到系统有数据要发,但 上一包数据网络设备还没发送完。因为在Linux里网络设备驱动程序一般不做数据 缓存,不能发送的数据都是通知系统发送不成功,所以必须要有一个机制在硬件不 忙时及时通知系统接着发送下面的数据。一般对发送忙的处理在前面设备的发送方法(hard_start_xmit)里已经描述过, 即如果发送忙,置tbusy为1。处理完发送数据后,在发送结束中断里清tbusy,同时用mark_bh()调用通知系统继续发送。但在具体实现我的驱动程序时发现,这样的处理系统好象并不能及时地知道硬件已经空闲了,即在mark_bh()以后,系统要等一段时间才会接着发送。造成发送效率很低。2M线路只有10%不到的使用率。内核版本为2.0.35。我最后的实现是不把tbusy置1,让系统始终认为硬件空闲,但是报告发送不成功。系统会一直尝试重发。这样处理就运行正常了。但是遍循内核源码中的网络驱动程序,似乎没有这样处理的。不知道症结在哪里。7.5.3 流量控制(flow control)网络数据的发送和接收都需要流量控制。这些控制是在系统里实现的,不需要驱动程序做工作。每个设备数据结构里都有一个参数dev-&tx_queue_len,这个参数标明发送时最多缓存的数据包。在Linux系统里以太网设备(10/100Mbps)tx_queue_len一般设置为100,串行线路(异步串口)为10。实际上如果看源码可以知道,设置了dev-&tx_queue_len并不是为缓存这些数据申请了空间。这个参数只是在收到协议层的数据包时判断发送队列里的数据是不是到了tx_queue_len的限度,以决定这一包数据加不加进发送队列。发送时另一个方面的流控是更高层协议的发送窗口(TCP协议里就有发送窗口)。达到了窗口大小,高层协议就不会再发送数据。接收流控也分两个层次。Netif_rx()缓存的数据包有限制。另外高层协议也会有一个最大的等待处理的数据量。发送和接收流控处理在net/core/dev.c的do_dev_queue_xmit()和netif_rx()中。7.5.4 调试很多Linux的驱动程序都是编译进内核的,形成一个大的内核文件。但对调试 来说,这是相当麻烦的。调试驱动程序可以用module方式加载。支持模块方式的 驱动程序必须提供两个函数:int init_module(void)和void cleanup_module(void)。 Init_module()在加载此模块时调用,在这个函数里可以register_netdev()注册 设备。Init_module()返回0表示成功,返回负表示失败。Cleanup_module()在驱动程序被卸载时调用,清除占用的资源,调用unregister_netdev()。模块可以动态地加载、卸载。在2.0.xx版本里,还有kerneld自动加载模块,但是2.2.xx中已经取消了kerneld。手工加载使用insmod命令,卸载用rmmod命令,看内核中的模块用lsmod命令。编译驱动程序用gcc,主要命令行参数-DKERNEL -DMODULE。并且作为模块加载的驱动程序,只编译成obj形式(加-c参数)。编译好的目标文件放在/lib/modules/2.x.xx/misc下,在启动文件里用insmod加载。7.6.进一步的阅读Linux程序设计资料可以从网上获得。这就是开放源代码的好处。并且没有什么“未公开的秘密”。我编写驱动程序时参阅的主要资料包括:Linux内核源代码&& by Michael K. Johnson&& by Ori Pomerantz&& by olly in BBS可以选择一个模板作为开始,内核源代码里有一个网络驱动程序的模板,drivers/net/skeleton.c。里面包含了驱动程序的基本内容。这个模板是以以太网设备为对象的,以太网的处理在Linux系统里有特殊“待遇”,所以如果不是以太网设备,有些细节上要注意,主要在初始化程序里。
参考文献【1】许海热等编著.嵌入式系统技术与应用.【2】王田苗编著.嵌入式系统设计与实例开发.【3】魏忠等编著.嵌入式开发详解。北京:电子工业出版【4】马忠梅马广云徐英慧天泽编著.ARM嵌入式处理器结构与应用基础.北京航空航天大学出版社,【5】杜春雷编著.ARM体系结构与编程.清华大学出版社,【6】6陈文智等编著.嵌入式系统开发原理与实践.清华大学出版社,【7】胡晓军张爱成编著.USB接口开发技术.西安电子科技大学出版社,2005.5,l~74【8】皱思轶编著.嵌入式Linux设计与应用.清华大学出版社,1—282【9】T_学龙,嵌入式Linux系统设计与应用.清华大学出版社,3~358【10】孙天泽袁文菊张海峰编著.嵌入式设计及Linux驱动开发指南.基于ARM9处理器,电子工业出版社
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
第1期你不知道的iPad技巧1313次分享
第1期win7电脑那些事2221次分享
第2期新人玩转百度经验346次分享
第1期Win8.1实用小技巧1051次分享
第1期小白装大神501次分享
请扫描分享到朋友圈

我要回帖

更多关于 天泽电力 的文章

 

随机推荐