《企业管理从Cfgdemo项目来分析协议栈的启动.docx》由会员分享,可在线阅读,更多相关《企业管理从Cfgdemo项目来分析协议栈的启动.docx(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、企业管理从Cfgdemo项H来分析协议找的启动从 Cfgdemo工程来分析协议端的启动工程中静忐创立的任务有两个:一个是空间任务,一个是StackTest任 务,main身数是空的。任务StackTest的优先级(5J比空网任务高。整个 程序的初始化局部执行完之后,就会执行StackTest任务,从而轨行Stack Test ()法教。StackTest ()函数首先调用了 NC_Sy stemOpen ()的数,来完成协议 找宗统的初始化工作。必须注意的是:在使用协议找之前必须最先调用该 函教。接下来调用%数CfgNew()来创立一个配置(Configuration J并获 得该百乙置的句柄
2、,接下来的工作就是在配置中增添配置项(Configuration Entry J ,增添配置选项是通过调用CfgAddEntryf)必教实现的。该工程 中首 先增添的配置项为 Host name :从CFGDEMO工程来分析林以杨的启动CfgAddEnUy( hCfg, CFGTAG_SYSINFO, CFGITEMDHCP_HOSTNAME, 0, 蛔,(UINT8 *)hn, 0);一 N接着增添的配置项为Telnet服务,那么协议找条统在启动之后会启动T elnet服务(创走了一 个名为telnetd的任务):CI_SERVICE_TELNET telnet; p廖B tibug.gif
3、 cfgstart.cgi. cfgpass.cgi cfgdone.cgi ; 这 5 个文件中, 前两个 文件的数据分别存放在数组DEFAULT 口,TIBUG口中,而后三个文件实际是 cgi程序,这三个cgi程序分别完成来之客户端的命令请求:View configur ation. Change password Submit configuration, 与之同时,它们动志修改 并发送了两个网页并CONFIG. USERMSGo接着增添的配置项为 服务,那么协议找启动之后会启动 服务 (创 建一个名为 server的 任务)CI_SERVICE_ ; 口口黑项(及 ,曲q典rttp);
4、一h也由我gSJEMte = INADDRgANY;。.城中簿妁期里双?勒尊 =熬也睫胴映其源C3MEg(hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE- , Og$臃域独均),(UINT8 *)& , 0 );p接着的增添的配置项为CFGITEM_OS_DBGPRINTLEVEL,来选择打印的 信息内家:CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL, CFG_ADDMODE_UNIQUE,由然的岫,(UINT8。);/接下来调用函数CfgSave ()来获取配置的大小并讲配置数据存入一个 缓存中去,并粹放配置。接下来调用舀数NetBoot
5、 ()来启动协议栈。这个国数是NDK的用户自 己写的一个国教,在 这个函数中,调 用了协议找启 动函数NC_NetStart (), 这个舀数属于Network Control API,该自数的派代玛可以在tiNDKsrc netctrlnetctrl.c中找到。其舀教接口如下:M NC Netstmc HANDLE hCfg. ”期虢怨掇tOO, /-UDQPM 皿西 NetBoot ()左调用NC_NetStart ()之前调用CfgNew()来创立一个新的 空的配置,然后再调用CfgLoad ()来把之南存入缓冲区中的配置好的配 置数据我入新的配置中去,并杷它作为参数传入NC_NetSt
6、art 3中去,接 着 就调用NC_NetStart ()启动协议找。NC.NetStart ()的数首先调用了 4个硬件抽象层CHALJ的四个初始化 名教,由它们来完成底层硬件的初始化(T具体细节过程等待进一步研究):UTiinerliutO: / Initialize the timers llUserLedliutO; / Initialize the User LED driver _啖感砌顼10;/ Initialize the serial portJlPacketliutj); / Initialize the packet drivers J接着该国数调 用CfgSetDefa
7、ult ()耙传入NC_NetStart (T )及教中构建好的 配置设置为默认配置。由于编程方法上的需要,协议找就使用配置是统一 为一个配置句柄指向的配置。这样CfgSetDefault ()的本质就是把该配置 句柄指向传入 NC_NetStart ()的数中构建好的配置。接着把传入NC_NetStart ()必教的三个函数指针赋值给三个全局变量, 以方便后面适.当的时候调用:区啖WjUDto = N感WStopFw = N或 S娅;p阳ih询=嗨期酎氐接着调用伊议找的核心 API函数ExecOpen ()来初始化例议找的executiv e ( t己意会这个概念)o接着动去创立一个名为Co
8、nfigBoot的任务,其优先级为1 5 (最高), 其执行的国数是NS_BootTask 3。由于DSP/BIOS是占先式实时OS,所 以一旦任务嵩优先级的任务创立,OS内核的调度模块就会自动切换到高优 先级的任务执行。很显然,接下来执行的是函数NS_BootTask ()。这个 %数的 源码在tiNDKsrcnetctrl netsrv.c中可以找到。NS_BootTask ()舀教首先调用 CfgSetService 3 来 Set Service CallB ack Funtions for Every Configuration Tag,其意思是为每个 Configuratio n
9、Tag设置一个回调函数,其百的是为了在修改完配置之后能及时更新协 议找系统,也就是使协议找条统随着配置的改变而实时地改变。 回调的 教的接口定义如下:int CbSiv( HANDLE hCfg, uint Tag, uint Item, uint Op, HANDLE hCfgEntry), hCfei HANDLE to Cojiflg 一 TaglTag value of entry changed 一|Item value of entry char管 d 【飞OpOperation (CFGOP_ADD or CFGOP_REMOVE)一hCfgEhtiyNon-Rjeference
10、d HANDLE to entry added or removed在 NDK的协议找中,Configuration Tag共有如下8个:define CFGTAG_OS define CFGTAG_IP /define CFGTAG_SERVICiE #define CFGTAGJPNET #define CFGTAG_ROUTE define CFGTAG_CLIENT define CFGTAG_SYSINFO define CFGTAG ACCT0x0001/ OS Configuration0x0002/ IP Stack Configuration0x0003/ Service0x
11、0004/ IP Network p0x0005/ Gateway Routed0x0006 恃/ DHCPS Clients0x0007/ System Information10x0008/ User Account u其中需要配置回调 法数的有如下 几个:CFGTAG_OS、CFGTAG_IP、C FGTAG_SERVICE、CFGTAG_IPNET . CFGTAG_ROUTE ,它 们的回调函数 分别为:SPConfig ( ) 、SPConfig ( ) 、SPService ( ) 、 SPIpNet 3 、S PRoute ( J ,这些 回调函数的实现源代码都在tiNDKsr
12、cnetctrl netsrv.c 可以找到O下面分析以下SPConfig 3 函数是怎样实现实时更新系统的:SPConfi g C J函致是 作为CFGT AG_OS CFGTAG_IP的 回调函 数的,所以 它必须 负责处理增添 CFGTAG_OS CFGTAG_IP 两种类型的 Configuration Entry 时的系统实 时更新工作。系统在 调CfgAddEntry的 数来增 添一个CFGTAG_ OS、CFGTAG_IP类型的配置项后(注意:CfgAddEntry只把配置数据添加 到配置中去),会调用与该种配置类型捆绑的的回调函数SPConfig ( CfgS etServic
13、e法数来完成掴绑工作的),SPConfig身数调用CfgEntrylnfo来获 取该配置项的数据缓冲区的指针并存放在变量pi中,接着更具Configurati on Tag的类型来获取具体需要修改的系统配置参数结构体;CFGTAG_OSeOSENVCFG _oscfg. oscfgcopy / CFGTAG_IP elPCONFIG _ipcfg. ipcf gcopy,这两个都是全局变量,它们的数据结构类型如下:/ (Configuration Structuretvpedef struct osenvcfe: uM Debug msg print threshholduinotDhgAbo
14、rWeyel;/ Debug msg sys abort itehtoldintTaskPriLow;/ Lowest priority for stack taskJintlaskPriNorm;/ Normal prioritv for stack task/域/ High priority for stack task.域侬; / KemeLlevel priority (Wglest)intTaskStkLow;/ Minimum stack sizeJ域驰以q即/ Normal stack size p如7High;/ Stack size for hili volume tasks
15、 OSENVCFG; Configuration Structure typedef struct _ipconfig uint IcmpDoRedirect;(1 =Yes)uint IcmpTtl;s 64uint IpReasmMaxSize;esuint TcpReasmMaxPkt;ketuint RtcEnableDebug;= On)uintRte AdvTime;t)&nbs/ Max reasm pkts held by TCP soc/ Enable Route Control Messages (1/ Time in sec to send RtAdv (0 = dont
16、p; uint RtcAdvLife;int Rte AdvPref;uint RtArpDownTime;ec)uintRtKeepaliv eTime;uint RtCloneTimeout;uint RtDefaultMTU;/ Litetime of route in RtAdv/ Preference Level (signed) in RtAdv/ Time 5 failed ARPs keep Rt down (s/ VALIDATED route timeout (sec)/ INITIAL route timeout (sec)/ Default MTU for intern
17、al routuint SockTtlDefault;uint SockTosDefault;int SockMaxConnect;/ Default Packet TTL/ Default Packet TOS/ Max Socket Connections/ Update RtTable on ICMP redirect/ TTL for ICMP messages RFC 1700 saysuint IcmpTtlEcho;TTL for ICMP echo RFC1700 says 64/ Max reassembly packet sizeuintIplndex;/ IP Start
18、 IndexuintIpForwarding;/ IP Forwarding (1 = Enabled)uintIpNatEnable;/ IP NAT Enable (1 = Yes)uintIpFilterEnable;/ IP Filtering Enable (1 = Yes)uintIpReasmMaxTime;/ Max reassembly time in secondsuint IpDirectedBCast;uint IpDirectedBCast;/ Look for directed BCast IP addresseuint Soc kTim eConnectuint
19、SockTimelo;int SockBufMax;/ Max time to connect (sec)/ Default Socket IO timeout (sec) &nbsP;/ Absolute max Socket buffer sizeint SockBufMinTx;int SockBufMinRx;uint PipeTimelo;int PipeBufSize;int PipeBufMinTx ;int SockBufMinTx;int SockBufMinRx;uint PipeTimelo;int PipeBufSize;int PipeBufMinTx ;/ Min
20、Tx space for nable to write/ Min Rx data for able to read/ Default Pipe IO timeout (sec)/ Pipe internal buffer size/ Min Tx space for able to writeint PipeBufMinRx;int PipeBufMinRx;/ Min Rx data for able to read IPCONFIG;大彖应该注意到所有的成员都是32佳的数据类型,所以这里的pi和pDs t指针都定义为指向32枚类型数据的指针。在做完必要性的检测之后,就会 把pi指向数据缓冲
21、中的数据直接拷贝到pDst+Item指向的数据缓冲中去。 两个细节性的问题:1)为什么只拷一个32佳?因为这两种类型的Configuration的Configu ration Entry都是32枚类型的数据。2)为什么Item要事先减一?因为Tag=CFGTAG.OS / CFGTAG_IP, Item 的值都是从 1 开始的。这样余统的配置就被修改了,后面程序的执行就会根据新的配置去掾作。 这里只分析了 AddEntry的过程,RemoveEntry的过程基本上差不多,不同 的是用系统默认配置的值去覆盖系统配置。/ SPConfigO - CFGTAG_IP and CFGTAG_OS Se
22、rvice Provider/static int SPConfig(HANDLE hCfg, uint Tag, uint Item, uint Op, HAND LE hCfgEntry) uint *pi,*pdst,*pdef; (void)hCfg;/ Get the informationif( CfgEntryInfo( hCfgEntry, 0, (UINT8 *)(&pi) ) CFGITEM_IP_MAX ) return( -1 );pdst = (uint *)&_ipcfg; pdef = (uint *)&ipcfgcopy;Jelse if( Tag
23、= CFGTAG_OS ) / Bound the value of Item if( Item CFGITEM_OS_MAX ) return( -1 );pdst = (uint *)&_oscfg; pdef = (uint *)&oscfgcopy; else return( -1 );)/ Verify Itemif( !Item ) return( -1 );Item -/ If this is an add”,add the entry if( Op = CFGOP_ADD )*(pdst + Item) = *pi;/ Else if remove,restore the de
24、fault Jelse if( Op = CFGOP.REMOVE )*(pdst + Item) = *(pdef+Item);/ Return successreturn(1);)到这里大家可能觉察到一个问题:我们的CfgAddEntry函数在StackTest任 务的开始就被调用,而我们的回调西教是在后来才安装上去的,那么这些添 加的配置项是不是没有被更新到系统配置中去呢?没错,确实没有!那我们 怎么办呢?由于一开始我们添加了多个配置项,那么这些配置项更新封条统 统应该有一个先后顺序(可能它们之间有什么依赖关系吧),因此,首先 要调用函数 CfgSetExecuteOrder ()来设置
25、,需要注意的是这个困教不仅 设定配置项更新到系统配置中的顺序,同时也设定了这些配置项从条统配置 置中删除的顺序。做好这些准备工作之后,调用CfgExecute ()(其中fE xecute参数值为1)来使配置项可以更新到系统配置中去,同也使能以后添加的配置项也能实时更新利余统配置中去。注意:这个函数必须调用,否 那么你用 CfgAddEntry的数添加的配置项都不能更新利系统配置中去,即使 你在安装好回调困教后调用CfgAddEntry也不能。至此,TCP/IP协议找条统 已经启动,应用程序可以调用协议栈的API函数来实现网络通信等应用。 :有关CfgExecut前一个疑问:这段数是怎样把配置
26、项都更新到系统配置中去的呢?;:是通过前面安装好的回调函数么?病么后面还要调用SennceScan呢?欢迎大家和:我一起来研究这个问题mailto: anqian8 8etang.c om/:接着调用函数NC_BootComplete (),该的数除了设置相应的标志外, 主要是来执行一个用户程序。大家应该还记得NC_NetStart函数的接口吧, 它有三个函数指针作为参数符人,其中第一个就在NC_BootComplete () 中调用:*NetStart,该函数指针所指向的函数是由用户来实现,从而向用 户提供一个机会,由用户自己决定协议找启动之后做什么工作。接着NS_ BootTask中调用T
27、askExit ()来结束该任务(任务的状态由RunningeTerm inated J ,那么接下来通过DSP/BIOS内核的调度,使得StackTest任务继续 运行OStackTest任务接着调 用函数 NetScheduler,它是协议找的调度器,用来 检测并处理所有与网络相关的事件。该舀数是一个无F艮循环,因此任务StackTest最终就成为了网络事件调度任务,也就是说它的角色发生了改 变,因此其优先级需要做适当的调整。有关网络事件调度任务的具体细节 后面再论。至此,整个余统就跑起来了,但是我们的应用程序怎样添加到这个系统 中去并 使用这个协议找呢?大彖应该还记得NC.BootCom
28、plete函数调 用的 NetStart函数指针指向的函数吧,它是由用户实现的一个国数,在协议找启 动之后调用。因此用户的应用程序(与网络相关的应用)可以在该国数中 动态创立(应用程序作为任务的形式添加利系统中),CfgDemo工程就是这 么做的。CfgDemo工程中NetStart函数指针指向的函数为 NetworkOpen ()代码如 T :static void 以典磁KQp期0。J/ If we dont have any kind of IP in our configuration, we do a conHg by ping”。/ function. The calling pa
29、rameter is the/ inteiface index to configure*寝!飒侦戏畋I AhGet!P= TaskQte( JMIE -GetlP, OS_TASKPRINORM, 0x1000,1, 0,0);/ Create our local servers phEcho = IaskCreate( 2chp$戏;氏加5亚口 TASKPRINORM, 0x1400, 0,0,0); hData = IaskCreate( datasiy, DataSiy1, OS TASKPRINORM, 0x1400, 0, 0, 0); hNuU = TaskCreate( nullsrv, tiNuUSivei, OS TASKPRINORM, 0x1400, 0,0,0);hOob= TaskCreate( oobsiy, ,QpbSiy, OS TASKPRINORM, 0x1000, 0,0,0 );由此可见该国数动态创立了五个任务,其优先级相同,均为OS_TASKPRIN ORM (5),而且这五个任务的状态都为处于Ready状去。但是由于随后网 络事件调度任务调整了自己的优先级,此四个任务都从Ready状宓转为 Blocked状态。一旦网络事件调度任务检测到网络事件就会通知相应的任务 使之迷人Running状态,处理网络事务。
限制150内