《从Cfgdemo项目来分析协议栈的启动14290.docx》由会员分享,可在线阅读,更多相关《从Cfgdemo项目来分析协议栈的启动14290.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、从Cfgdemo项目来分析协议栈的启动项目中静态创建的任务有两个:一个是空闲任务,一个是StackTest任务,main函数是空的。任务StackTest的优先级(5)比空闲任务高。整个程序的初始化部分执行完之后,就会执行StackTest任务,从而执行StackTest()函数。StackkTesst()函函数首先先调用了了NC_SysstemmOpeen()函函数,来来完成协协议栈系系统的初初始化工工作。必必须注意意的是:在使用用协议栈栈之前必必须最先先调用该该函数。接接下来调调用函数数CfggNeww()来来创建一一个配置置(Coonfiigurratiion)并并获得该该配置的的句柄,
2、接接下来的的工作就就是在配配置中增增添配置置项(CConffiguurattionn Enntryy),增增添配置置选项是是通过调调用CffgAdddEnntryy()函函数实现现的。该该项目中中首先增增添的配配置项为为Hosst nnamee:从CFGDDEMOO项目来来分析协协议栈的的启动接着增添的的配置项项为Teelneet服务务,那么么协议栈栈系统在在启动之之后会启启动Teelneet服务务(创建建了一个个名为ttelnnetdd的任务务):接着通过过调用eefs_creeateefille()创创建5个个文件,其其名字分分别为:inddex.htmml、ttibuug.ggif、cc
3、fgsstarrt.ccgi、ccfgppasss.cggi ccfgddonee.cggi;这这5个文文件中,前前两个文文件的数数据分别别存放在在数组DDEFAAULTT、TTIBUUG中,而而后三个个文件实实际是ccgi程程序,这这三个ccgi程程序分别别完成来来之客户户端的命命令请求求:Viiew connfigguraatioon、CChannge passswoord、SSubmmit connfigguraatioon,与与之同时时,它们们动态修修改并发发送了两两个网页页并COONFIIG、UUSERRMSGG。接着增增添的配配置项为为HTTTP服务务,那么么协议栈栈启动之之后会启
4、启动Htttp服服务(创创建一个个名为hhttpp seerveer的任任务) 接着着的增添添的配置置项为CCFGIITEMM_OSS_DBBGPRRINTTLEVVEL,来来选择打打印的信信息内容容:接下来调用用函数CCfgSSavee()来来获取配配置的大大小并讲讲配置数数据存入入一个缓缓存中去去,并释释放配置置。 接下来来调用函函数NeetBooot()来来启动协协议栈。这这个函数数是NDDK的用用户自己己写的一一个函数数,在这这个函数数中,调调用了协协议栈启启动函数数NC_NettStaart(),这这个函数数属于NNetwworkk Coontrrol APII,该函函数的源源代码可
5、可以在tiNDKKsrrcnnetcctrllneetcttrl.c中找找到。其其函数接接口如下下:NetBooot()在在调用NNC_NNetSStarrt()之之前调用用CfggNeww()来来创建一一个新的的空的配配置,然然后再调调用CffgLooad()来来把之前前存入缓缓冲区中中的配置置好的配配置数据据载入新新的配置置中去,并并把它作作为参数数传入NNC_NNetSStarrt()中中去,接接着就调调用NCC_NeetSttartt()启启动协议议栈。 NC_NettStaart()函函数首先先调用了了4个硬硬件抽象象层(HHAL)的的四个初初始化函函数,由由它们来来完成底底层硬件件
6、的初始始化(具具体细节节过程等等待进一一步研究究):接着该函数数调用CCfgSSetDDefaaultt()把把传入NNC_NNetSStarrt()函函数中构构建好的的配置设设置为默默认配置置。由于于编程方方法上的的需要,协协议栈就就使用配配置是统统一为一一个配置置句柄指指向的配配置。这这样CffgSeetDeefauult()的的本质就就是把该该配置句句柄指向向传入NNC_NNetSStarrt()函函数中构构建好的的配置。 接着把把传入NNC_NNetSStarrt()函函数的三三个函数数指针赋赋值给三三个全局局变量,以以方便后后面适当当的时候候调用:接着调用协协议栈的的核心AAPI函函
7、数ExxecOOpenn()来来初始化化协议栈栈的exxecuutivve(自自己意会会这个概概念)。 接着动动态创建建一个名名为CoonfiigBooot的的任务,其其优先级级为155(最高高),其其执行的的函数是是NS_BoootTaask()。由由于DSSP/BBIOSS是占先先式实时时OS,所所以一旦旦任务高高优先级级的任务务创建,OOS内核核的调度度模块就就会自动动切换到到高优先先级的任任务执行行。很显显然,接接下来执执行的是是函数NNS_BBoottTassk()。这这个函数数的源码码在ttiNNDKsrccneetcttrl neetsrrv.cc中可以以找到。NS_BoootT
8、Taskk()函函数首先先调用CCfgSSetSServvicee()来来Sett Seerviice CalllBaack Funntioons forr Evveryy Coonfiigurratiion Tagg,其意意思是为为每个CConffiguurattionn Taag设置置一个回回调函数数,其目目的是为为了在修修改完配配置之后后能及时时更新协协议栈系系统,也也就是使使协议栈栈系统随随着配置置的改变变而实时时地改变变。 回调函函数的接接口定义义如下:在NDK的的协议栈栈中,CConffiguurattionn Taag共有有如下88个:其中需要配配置回调调函数的的有如下下几个:C
9、FGGTAGG_OSS、CFFGTAAG_IIP、CCFGTTAG_SERRVICCE、CCFGTTAG_IPNNET、CCFGTTAG_ROUUTE,它它们的回回调函数数分别为为:SPPConnfigg()、SSPCoonfiig()、SSPSeerviice()、SSPIppNett()、SSPRooutee(),这这些回调调函数的的实现源源代码都都在ttiNNDKsrccneetcttrl neetsrrv.cc可以找找到。下面分析以以下SPPConnfigg()函函数是怎怎样实现现实时更更新系统统的:SSPCoonfiig()函函数是作作为CFFGTAAG_OOS、CCFGTTAG_I
10、P的的回调函函数的,所所以它必必须负责责处理增增添CFFGTAAG_OOS、CCFGTTAG_IP两两种类型型的Coonfiigurratiion Enttry时时的系统统实时更更新工作作。系统统在调CCfgAAddEEntrry函数数来增添添一个CCFGTTAG_OS、CCFGTTAG_IP类类型的配配置项后后(注意意:CffgAdddEnntryy只把配配置数据据添加到到配置中中去),会会调用与与该种配配置类型型捆绑的的的回调调函数SSPCoonfiig(CCfgSSetSServvicee函数来来完成捆捆绑工作作的),SSPCoonfiig函数数调用CCfgEEntrryInnfo来来获
11、取该该配置项项的数据据缓冲区区的指针针并存放放在变量量pi中,接接着更具具Connfigguraatioon TTag的的类型来来获取具具体需要要修改的的系统配配置参数数结构体体;CFFGTAAG_OOS OSEENVCCFG _osscfgg、osscfggcoppy / CCFGTTAG_IP IPPCONNFIGG _iipcffg、iipcffgcoopy,这这两个都都是全局局变量,它它们的数数据结构构类型如如下:/ Coonfiigurratiion Strructtureetypeddef strructt _iipcoonfiig uinnt IIcmppDoRRediirecc
12、t; / Upddatee RttTabble on ICMMP rrediirecct (1=YYes) uinnt IIcmppTtll; / TTTL ffor ICMMP mmesssagees RRFC117000 saays 64 uinnt IIcmppTtllEchho;TTL ffor ICMMP eechoo RFFC17700 sayys 664 uinnt IIpInndexx; / IPP Sttartt Inndexx uinnt IIpFoorwaardiing; / IPP Foorwaardiing (1 = EEnabbledd) uinnt IIpNaat
13、Ennablle; / IPP NAAT EEnabble (1 = YYes) uinnt IIpFiilteerEnnablle; / IP Fillterringg Ennablle (1 = Yees) uinnt IIpReeasmmMaxxTimme; / Maxx reeasssembbly timme iin ssecoondssuint IpRReassmMaaxSiize; / Maax rreasssemmblyy paackeet ssizee uinnt IIpDiireccteddBCaast; / Loook ffor dirrectted BCaast IP a
14、dddresssess uinnt TTcpRReassmMaaxPkkt; / Maxx reeasmm pkkts helld bby TTCP socckett uinnt RRtcEEnabbleDDebuug; / Enaablee Rooutee Coontrrol Messsagges (1=On) uinnt RRtcAAdvTTimee; / Tiime in secc too seend RtAAdv (0=donnt)&nbssp; uinnt RRtcAAdvLLifee; / Liitettimee off rooutee inn RttAdvv intt RRtcA
15、AdvPPreff; / Prrefeerennce Levvel (siigneed) in RtAAdv uinnt RRtArrpDoownTTimee; / TTimee 5 faiiledd ARRPs keeep RRt ddownn (ssec) uinnt RRtKeeepaalivveTiime; / VALLIDAATEDD rooutee tiimeoout (seec) uinnt RRtClloneeTimmeouut; / INIITIAAL rroutte ttimeeoutt (ssec) uinnt RRtDeefauultMMTU; / Deefauult
16、MTUU foor iinteernaal rrouttes uinnt SSockkTtllDeffaullt; / Deffaullt PPackket TTLL uinnt SSockkTossDeffaullt; / Deffaullt PPackket TOSS intt SSockkMaxxConnnecct; / MMax Socckett Coonneectiionss uinnt SSockkTimmeCoonneect; / Maxx tiime to connnecct (secc) uinnt SSockkTimmeIoo; / Deefauult Socckett I
17、OO tiimeoout (seec) intt SSockkBuffMaxx; &nnbsp; / AAbsoolutte mmax Socckett buuffeer ssizee intt SSockkBuffMinnTx; / Miin Tx sspacce ffor abble to wriite intt SSockkBuffMinnRx; / Miin RRx ddataa foor ablle tto rreadd uinnt PPipeeTimmeIoo; / Deefauult Pippe IIO ttimeeoutt (ssec) intt PPipeeBuffSizze
18、; / Piipe intternnal buffferr siize intt PPipeeBuffMinnTx;/ Miin TTx sspacce ffor abble to wriite intt PPipeeBuffMinnRx; / Miin RRx ddataa foor ablle tto rreadd IIPCOONFIIG; 大家应应该注意意到所有有的成员员都是332位的的数据类类型,所所以这里里的pii和pDDst指指针都定定义为指指向322位类型型数据的的指针。在在做完必必要性的的检测之之后,就就会把ppi指向向数据缓缓冲中的的数据直直接拷贝贝到pDDst+Iteem指
19、向向的数据据缓冲中中去。两两个细节节性的问问题:1)为什么么只拷一一个322位?因因为这两两种类型型的Coonfiigurratiion的的Connfigguraatioon EEntrry都是是32位位类型的的数据。22)为什什么Ittem要要事先减减一?因因为Taag = CFFGTAAG_OOS / CFFGTAAG_IIP, Iteem的值值都是从从1开始始的。这样系统的的配置就就被修改改了,后后面程序序的执行行就会根根据新的的配置去去操作。这这里只分分析了AAddEEntrry的过过程,RRemooveEEntrry的过过程基本本上差不不多,不不同的是是用系统统默认配配置的值值去覆盖
20、盖系统配配置。 /-/ SPPConnfigg() - CCFGTTAG_IP andd CFFGTAAG_OOS SServvicee Prroviiderr/-statiic iint SPCConffig(HANNDLEE hCCfg, uiint Tagg, uuintt Ittem, uiint Op, HAANDLLE hhCfggEnttry) uuintt *ppi,*pdsst,*pdeef; (vooid)hCffg; / GGet thee innforrmattionn iif( CfggEnttryIInfoo( hhCfggEnttry, 0, (UUI
21、NTT8 *)(&pii) ) CCFGIITEMM_IPP_MAAX ) reeturrn( -1 ); pdsst = (uuintt *)&_iipcffg; ppdeff = (uiint *)&ipccfgccopyy; elsse iif( Tagg = CFFGTAAG_OOS ) / Bouund thee vaaluee off Ittem if( Ittem CCFGIITEMM_OSS_MAAX ) reeturrn( -1 ); pdsst = (uuintt *)&_ooscffg; pdeef = (uuintt *)&osscfggcoppy; ellse ret
22、turnn( -1 ); / VVeriify Iteem iif( !Ittem ) retturnn( -1 ); IItemm - -; / IIf tthiss iss ann aadd, aadd thee enntryy iif( Op = CFGGOP_ADDD ) *(ppdstt+Ittem) = *pii; / Ellse if reemovve, reestoore thee deefauult elsse iif( Op = CFGGOP_REMMOVEE ) *(ppdstt+Ittem) = *(ppdeff+Ittem); / RRetuurn succcesss
23、 rretuurn(1); 到这里大大家可能能觉察到到一个问问题:我我们的CCfgAAddEEntrry函数数在SttackkTesst任务务的开始始就被调调用,而而我们的的回调函函数是在在后来才才安装上上去的,那那么这些些添加的的配置项项是不是是没有被被更新到到系统配配置中去去呢?没没错,的的确没有有!那我我们怎么么办呢?由于一一开始我我们添加加了多个个配置项项,那么么这些配配置项更更新到系系统应该该有一个个先后顺顺序(可可能它们们之间有有什么依依赖关系系吧),因因此,首首先要调调用函数数CfggSettExeecutteOrrderr()来来设置,需需要注意意的是这这个函数数不仅设设定配置
24、置项更新新到系统统配置中中的顺序序,同时时也设定定了这些些配置项项从系统统配置中中删除的的顺序。做做好这些些准备工工作之后后,调用用CfggExeecutte()(其其中fEExeccutee参数值值为1)来使使配置项项可以更更新到系系统配置置中去,同同也使能能以后添添加的配配置项也也能实时时更新到到系统配配置中去去。注意意:这个个函数必必须调用用,否则则你用CCfgAAddEEntrry函数数添加的的配置项项都不能能更新到到系统配配置中去去,即使使你在安安装好回回调函数数后调用用CfggAdddEnttry也也不能。至至此,TTCP/IP协协议栈系系统已经经启动,应应用程序序可以调调用协议议
25、栈的APII函数来来实现网网络通信信等应用用。 接着调用函函数NCC_BoootCCompplette(),该该函数除除了设置置相应的的标志外外,主要要是来执执行一个个用户程程序。大大家应该该还记得得NC_NettStaart函函数的接接口吧,它它有三个个函数指指针作为为参数传传入,其其中第一一个就在在NC_BoootCoomplletee()中中调用:*NeetSttartt,该函函数指针针所指向向的函数数是由用用户来实实现,从从而向用用户提供供一个机机会,由由用户自自己决定定协议栈栈启动之之后做什什么工作作。接着着NS_BoootTaask中中调用TTaskkExiit()来来结束该该任务
26、(任任务的状状态由RRunnninggTerrminnateed),那那么接下下来通过过DSPP/BIIOS内内核的调调度,使使得SttackkTesst任务务继续运运行。StackkTesst任务务接着调调用函数数NettSchheduulerr,它是是协议栈栈的调度度器,用用来检测测并处理理所有与与网络相相关的事事件。该该函数是是一个无无限循环环,因此此任务StackkTesst最终终就成为为了网络络事件调调度任务务,也就就是说它它的角色色发生了了改变,因因此其优优先级需需要做适适当的调调整。有有关网络络事件调调度任务务的具体体细节后后面再论论。 至此,整个个系统就就跑起来来了,但但是我们
27、们的应用用程序怎怎样添加加到这个个系统中中去并使使用这个个协议栈栈呢?大大家应该该还记得得NC_BoootCoomplletee函数调调用的NNetSStarrt函数数指针指指向的函函数吧,它它是由用用户实现现的一个个函数,在在协议栈栈启动之之后调用用。因此此用户的的应用程程序(与与网络相相关的应应用)可可以在该该函数中中动态创创建(应应用程序序作为任任务的形形式添加加到系统统中),CfgDemo项目就是这么做的。CfgDeemo项项目中NNetSStarrt函数数指针指指向的函函数为NNetwworkkOpeen()代代码如下下:由此可见该该函数动动态创建建了五个个任务,其其优先级级相同,均均为OSS_TAASKPPRINNORMM(5),而而且这五五个任务务的状态态都为处处于Reeadyy状态。但但是由于于随后网网络事件件调度任任务调整整了自己己的优先先级,此此四个任任务都从从Reaady状状态转为为Blockked状状态。一一旦网络络事件调调度任务务检测到到网络事事件就会会通知相相应的任任务使之之进入RRunnningg状态,处处理网络络事务。