Tornado和VxWorks学习笔记

Tornado和VxWorks学习笔记
Tornado和VxWorks学习笔记

Tornado and vxWorks学习笔记-myc

环境配置相关:

1.tornado

2.2在启动时,弹出一个警告窗口如下:

Warning: Cannot find a valid Tornado Registry on host "".

You need to have access to a Tornado Registry to connect to any targets. For instructions on how to start the Tornado Registry, please refer to the documentation.

应该如何解决?

解决方法:启动Tornado后,选择Tool options→Tornado Registry→勾选Local registry。

问题原因:Tornado Registry即Tornado目标服务器注册表,这种注册表可以使主机通过名称连接目标服务器(运行主机工具的主机和运行目标服务器的机器可以不同)。也即说,这个注册表必须一致处于运行状态,否则主机工具就不能联系上运行目标服务器的机器,也就不能与目标机进行通信。

而由于我们的机器同时运行主机工具和目标服务器,因此,我们只需要将Tornado Registry建立为本地的就可以了。所以,要勾选Local registry。

(由于Tornado工具与目标机通信的方式无关,所以无论与目标机的通信方式是通过网络还是通过串口,注册表都是必须的。)

2.目标机代理执行的模式有三种:

㈠任务模式:目标机代理作为VxWorks的一个任务,用户可以再不影响目标系统运行的情况下隔离某个任务。

㈡系统模式

㈢双模式

3.Tornado Launch工具条是一个下拉列表,显示了当前运行的并注册过的目标服务器。如果没有目标服务器列出,

或没有用户需要的目标服务器,则用户必须配置和启动一个目标服务器。

4.目标服务器管理Tornado主机工具和VxWorks目标机代理间的通信。在主机工具与目标机交互前,必须针对该

目标机配置并启动目标服务器。

5.在Tornado内建立一个开发环境,具体步骤如下:

㈠设好目标机硬件

㈡定义主机环境变量,配置好网络软件;在\x86-win32\bin下,有torwars.bat脚本程序,用来设置环境变量;

网络要配置好TCP/IP协议,修改主机host文件。

㈢开启Tornado目标服务器注册表。

㈣指明目标机启动参数(boot parameters),并启动目标机。(最开始学习的时候,没有目标机的话,就用VxSim 吧)

㈤配置并启动目标服务器(target sever),目标服务器是管理主机开发工具和目标机通讯的。

6.VxWorks具有可移植性的原因是采用了模块化的设计,它将所有硬件的功能函数分别放到一系列库中,这些库

就称之为板级支持包BSP(Board support Package)。

7.BSP库为实现所有目标板上各种硬件的功能提供了相同的软件接口,包括如下功能:

㈠硬件初始化

㈡中断的产生与处理

㈢硬件时钟和定时器管理

㈣本地及总线存储空间映射

㈤设置存储空间大小

㈥等等

8.*在一块新的目标板上安装VxWorks操作系统是很困难滴,是因为我们不能无法使用VxWorks的开发工具,并且,

也没有相对应的BSP。但是,Tornado软件为我们提供了VxWorks的BSP开发工具包,这个BSP的开发工具包提供的一些策略可以使VxWorks的安装变得容易点。(BSP工具包的用户应该具备低级c语言和汇编语言的编程经验,熟悉设备驱动程序,熟悉中断处理程序以及软硬件之间的接口)

BSP工具包包含一套文献资料和一些软件。

其中,文献资料包括:①安装指南②用户手册

软件包括:

㈠BSP合法性测试包

㈡BSP模板

㈢驱动程序模板

㈣SCSI测试包(SCSI:small computer system interface,小型计算机系统接口)

9.在运行具有网络功能的vxsim full simulator的时候, 如果在启动targetServer时遇到如下错误:

Error: rpccore backend client Timed outfailed.

则需要检查以下几点:

1)检查ULIP虚拟网络适配器的ip地址是否配置为:192.168.255.254

2)VxWorks组件中, development tool components/WDB agent components/select WDB connection/中, 应当仅选

择WDB END driver connection选项.

同时, select WDB mode应当仅选择WDB task debugging选项.

3)Target Server的配置里面, Target Server Properties应当选择Back End(表示通过网口调试), Available Back处应

选择wdbrpc选项.

Target Name/Ip Address可以填目标机地址. 例如:192.168.255.1

(还有一次, 直接target server都打不开,之前一直好好的, 忽然间就出错了, 一直遇到这种错误:

error :simulator failed to initialize before timeout

我是这么解决的: 先新建了一个project, 然后重新编译了一个最原始的vxworks.exe, 然后打开.

再之后又重新开之前的那个vxworks.exe 然后居然就正常了)

10.如果想要能够有ping功能, 需要包含组件network conmponents/networking protocols/network applications/PING

client.

11.如果vxsim0和vxsim1不能互相ping通, 但vxsim0和vxsim1可以ping通主机, 则说明组件:

network conmponents/networking protocols/core TCP/IP conmponents/ICMPv4没有被包含进去.

12.Simulator与其它主机的通信

假设host0(你的主机, simulator运行于此机上)的Ip为10.12.9.113, host1的Ip为10.12.9.129. 如果host1想与simulator通讯, 只需在host1的路由表中增加一项:

Route add 192.168.255.1 10.12.9.113 metric 1

然后可以分别在host1上ping 192.168.255.1和simulator上ping 10.12.9.129进行验证.

网络编程相关:

Tcp(基于连接的)编程

1.相关概念:

端口: RFC1700规定常用的端口号从0-1023, 1024-49151是已注册的端口号.

这个端口号很重要, 比如在客户机/服务器模型下, 服务器端有一个任务在指定的端口等待客户来连接(在vxworks当中, 是先通过listen函数监听端口, 然后accept函数接受来自client端的连接来实现的), 一旦连接上之后, 就可以按设计的数据交换方法和格式进行数据传送.

2.客户机/服务器通信过程:

对server来说, 包括如下几个步骤(注意:结构体struct sockaddr_in和struct sockaddr是不一样滴两个结构):

1)创建一个tcp socket.

eg: int sd=socket(AF_INET,SOCK_STREAM,0); /*其中, sd是socket描述符, 由socket函数返回. AF_INET得看Help文件具体才知道是什么意思, 反正大多都用这个. SOCK_STREAM 说明是建立的一个基于连接的socket, 也即tcp socket. */

2)分配一个server的端口给第1步中创建的socket. 也即让创建的那个socket和某个端口绑定起来, 否则server到

哪监听想要连过来的client呢? 绑定了之后相当于server就在这个端口这里等待client的连接请求了.

VxWorks下面, 是通过bind函数绑定socket和分配的端口的, 如下:

bind(sd,(struct sockaddr *)&serverAddr,sizeof(struct sockaddr_in))

这里的sd即是刚才的建立的socket, 可是端口号在哪里呢? 端口号是在serverAddr里面的一个成员里面存着的. serverAddr是struct sockaddr_in类型的结构体. 其中:

serverAddr.sin_family = AF_INET;/*这个AF_INET 我也不明白是何意*/

serverAddr.sin_port = htons(SERVER_NUM);/* SERVER_NUM 即为分配的端口号, 例如6000(随便自己分一个, 大于1023就ok了), htons是将主机字节序转换成网络字节序的意思, 因为端口号存在这个结构体当中规定是要存网络字节序滴! 所以这里要转换一下*/

这个结构体里还有其它两个变量, 一个是长度(暂时不知道是什么意思, 反正不填也没事). 还有一个是serverAddr.sin_addr.s_addr是用来存放server的ip地址的(经转换过的长整形ip地址), 这个地址在server上面也没什么用, 可以不填, 因为运行在server上的程序不必要还知道自己的ip地址, 但在client上运行的程序代码中, 这个地址就需要填了, 因为client需要通过server的ip地址来找寻建立socket连接的目标, 没有server ip地址, client就不知道该去找谁通信了

3)经过上面两步, socket和端口就绑定起来了. 我是这么理解滴:

第1步建立一个tcp socket, 就相当于找了一截水管, 端口号就相当于server上一个固定的洞口, 把socket和端口号绑定, 就相当于是把这截水管的一段连住那个洞口了. 连住之后, 就等待监听水管的另一头有没有人(client)把它也用个另一根管子接起来.

监听(listen函数):

Listen(sd, 4);/*可以理解为server这时在这里等着, 看看这个socket和端口结合体有没有client愿意伸跟水管和它连通, 4表示等待排列的最大连接数*/

4)接受(accept函数):

当server在listen的时候, 发现有个client想要和自己连接(即发现有个client也伸了一根水管想要和自己的水管接起来), 这个时候server就做出处理, 可以连接. 于是, accept函数就把server自己伸出去的水管和client伸过来的水管给连起来了. 同时, 还把client的一些相关信息给带了回来, 保存在结构clientAddr和返回值clientsd 里了. 如下:

clientsd=accept(sd,(struct sockadd*)&clientAddr,&clientLen); /*其中, clientsd 即表示client伸过来的socket描述符. Client的ip地址被保存在了clientAddr.sin_addr 中*/

当然了, 这里的clientLen最开始初始化的时候, 应该初始化为sizeof(struct sockaddr_in), 也即clientAddr的大小, 否则accept就得不到client的ip地址了(这是个很恶心的问题, 但是必须初始化一下, 具体为啥不知道, 得看help)

5)水管都接好了, 那就通信(”放水,接水”)吧, 如下:

recBytes=recv(clientsd,receiveMessage,sizeof(receiveMessage),0) ; /*从clientsd 里面接受数据, 数据存放在receiveMessage 这个buffer里面*/

对client来说, 就包括下面几个步骤:

1)建立一个Tcp socket.

2)把这个socket和server连接起来

注意: 这里说把socket和server连接起来, 并不是说把socket和server的socket连接起来. 因为client又没有监听机制, 并不知道server的socket是多少. 对于client来说, 知道的仅仅是server的ip地址以及分配的端口号(其实端口号就对应一种服务, 例如常用的端口号telnet(23), ftp(21), smtp(25), http(80)都是分配好的. 如果你想写一个telnet的client程序, 那么你就知道要用server的23号端口来进行通信).

连接的方法如下:

connect(sd,(struct sockaddr *)&serverAddr,sizeof(serverAddr));

(注意: 这里的serverAddr在初始化的时候, 一定一定一定要记得bzero一下, 否则connect的时候打死的连不上.)

其中, sd是client的socket, serverAddr. sin_family一般填AF_INET, serverAddr. sin_port就需要填写服务对应的端口号, serverAddr. sin_addr.s_addr 需要填写server端的ip地址(vxworks中需要用inet_addr函数将其转换成长整形的ip地址)

当client端发出connect请求, 如果此时server段空闲, 并accept了这个connet请求, 那么就可以进行通信了.

3)通信:

send(sd,sendMessage,sizeof(sendMessage),0); /*发送数据, sendMessage 即为需要发送的数据*/

udp(基于非连接的)编程

1.通信进程

对于server来说, 步骤如下:

1)建立socket (同tcp一样)

2)绑定端口(同tcp一样)

3)接受数据.

Udp通信由于不是面向连接的通信, 提供的是不可靠服务, 因此不需要建立连接. 直接可以接收数据.

Vxworks下面是通过recvfrom来实现. 如下:

recvfrom(sd,receiveMessage,sizeof(receiveMessage),0,(struct sockaddr_in*)&clientAddr,&clientLen);

/*其中, sd为socket, receiveMessage 为一个保存接收数据的buffer, clientAddr在函数返回的时候(也即接收到数据的时候)会将发送数据端的地址保存下来, clientLen为保存clientAddr长度的一个变量, 需要注意的是: 这个clientLen在recvfrom函数调用之前必须初始化为sizeof(struct sockaddr_in), 否则得不到发送端的地址!

这一点很恶心, 具体原因需见help*/

4)根据需要, 回复发送端. (如果不需要通知发送端数据已收到, 这步也可省略)

sendto(sd,responseMeg,sizeof(responseMeg),0,(struct sockaddr *)&clientAddr,clientLen);

/*其中, responseMeg 是回复的内容, clientAddr 即是通过recvfrom函数得到的发送端地址.*/

对于client来说, 步骤如下:

1)建立socket

2)发送数据

sendto(sd,sendMessage,sizeof(sendMessage),0,(struct sockaddr *)&serverAddr,sizeof(serverAddr));

/*其中serverAddr需要填的内容有sever端地址和端口号, sendMessage 为要发送的内容.*/

此处不需要绑定端口, 直接即可通过socket发送数据.

3)如果需要接受server端的回复, 可通过recvfrom函数接收消息.

MUX编程

1.相关概念.

END驱动与MUX接口概述

VxWorks下增强型网络驱动-END(EnhancedNetworkDriver)是一个数据链路层驱动程序,增强型网络驱动(END)是OSI模型中数据链路层的实现, 通过MUX函数与网络协议层通讯. END驱动程序是基于MUX模式, 网络驱动程序被划分为协议组件和硬件组件. MUX作为数据链路层和网络层之间的接口, 它管理网络协议接口和低层硬件接口之间的交互, 将硬件从网络协议的细节中隔离出来; 删除使用输入钩例程来过滤接收从协议来的数据包, 和删除了使用输出钩例程来过滤协议包的发送; 并且链路层上的驱动程序需要访问网络层(IP或其他协议)时, 也会调用相关的MUX例程. 值得注意的是, 网络层协议和数据链路层驱动程序不能直接通讯, 它们必须通过MUX. MUX的目的是提供一个接口, 隔离网络接口驱动和网络服务, MUX支持两种网络驱动接口类型: –END: Enhanced Network Driver, 一种面向帧结构的驱动.

–NPT: Network Protocol Toolkit, 一种面向分组的驱动,所有链路层信息被去除.

个人理解, 以交换机为例. 一个交换机的接口就是一个end driver, 物理层的信息暂时就不管了, 我们在编程时看到的是链路层. 也就是说, 这个enddriver在接受\发送数据包时都是以帧为单位的(比如说0x00,0x04,0x67,0x00,0x00,0x01,……). 假如现在要编写一个处理包的协议, 需要对帧进行处理, 那么在编写协议代码的时候, 需要通过mux来将end接口收到的包送到指定的处理函数里面. 同时, 需要发送包的时候, 将编辑或处理过的包通过mux送到end接口, 然后让end接口发送出去.

因此, mux是连接enddriver和协议之间的接口, 编写协议的人员即可以不用去理会driver的具体实现过程, 通过mux, 可以实现协议的灵活裁剪.

网络协议是OSI模型中网络层和传输层的实现.在基于END驱动vxWorks中,网络协议通过MUX接口与数据链路层进行通信,所有与具体网络接口相关的事务都在数据链路层驱动中进行处理,如发送和接收数据等.

2.muxBind函数

void * muxBind

(

char * pName, /* interface name, for example, ln, ei,... */

int unit, /* unit number */

BOOL (* stackRcvRtn) (void* , long, M_BLK_ID, LL_HDR_INFO * , void* ), /* receive function to be called. */

STATUS (* stackShutdownRtn) (void* , void* ),/* routine to call to shutdown the stack */

STATUS (* stackTxRestartRtn) (void* , void* ),/* routine to tell the stack it can transmit */

void (* stackErrorRtn) (END_OBJ* , END_ERR* , void* ),/* routine to call on an error. */

long type, /* protocol type from RFC1700 and many */

/* other sources (for example, 0x800 is IP) */

char * pProtoName, /* string name for protocol */

void * pSpare /* per protocol spare pointer */

)

For example:

muxBindCookie=muxBind(ifName,unit,StackRecvRtn,StackShutdownRtn,StackTxRestartRtn,StackErrorRtn,MYOWN_P ROTO,pProtoName,pSpare);

参数:

ifName: enddriver也即一个物理接口的名称.

unit: enddriver的编号.

StackRecvRtn: 用户自定义的用来处理接受到的包的函数, 函数原型为:

STATUS StackRecvRtn (void *pCookie ,long type, M_BLK_ID pMblk, LL_HDR_INFO * pLinkHdr,void *pSapre );

StackShutdownRtn: 关闭处理函数.

StackTxRestartRtn: 重启处理函数.

StackErrorRtn: 出错处理函数.

MYOWN_PROTO: 自己定义的一个协议类型, 如#define MYOWN_PROTO 0xfff9

pProtoName: 协议名称.

pSpare: 协议的备用指针, 可以用来存储一些需要的数据结构, 在muxBind之后, 该指针会传入到StackRecvRtn 函数中去.

muxBindCookie: 为muxBind的函数返回值指针. 这个Cookie记录了协议函数和enddriver之间的相关联信息. 有了这个cookie, 即可以方便的知道协议函数是和哪一个enddriver绑定了. 这个cookie指向的是一

个MUX_BIND_ENTRY结构, 当调用完muxBind之后, 也即当把用户自定义的包处理函数和enddriver绑

定之后, 这个结构的就会被填充起来记录相关信息. 具体如下:

typedef struct muxBindEntry

{

int unitNo; /* unit号*/

char devName[END_NAME_MAX]; /* 设备名*/

long netSvcType; /* 协议类型,值等于muxBind函数的type值, 如0xfff9 */

long netDrvType; /* network Driver type, 设备类型*/

UINT32 flags; /* BIB entry flags , 暂时不知道*/

END_OBJ* pEnd; /*绑定的end信息*/

void* pNetCallbackId; /*和用户传进的pSpare指针指向的内容一样*/

FUNCPTR addrResFunc; /* reference to Address resolution function */

FUNCPTR netStackRcvRtn; /* 用户定义的那个包处理函数地址*/

}MUX_BIND_ENTRY, *MUX_ID;

包处理函数的介绍:

muxBind函数的几个参数, 以stackRcvRtn函数最为重要了, 当一个enddriver接受到相应的(即符合定义的协议类型)包之后, 即会将包送至这个函数进行处理. 这里可能有些疑惑, 一个底层的driver, 如何会在接收到包之后即知道将包根据协议类型送至哪个函数处理? 这就是mux层的功劳了. 在系统启动的时候, 一个enddriver 会被加载(通过muxDevLoad函数实现的), muxDevLoad会默认将enddriver收到的包交给一个称之为muxReceive 的函数进行处理, 而事实上, 这个muxReceive函数是一个钩子函数, 用户在编写协议代码时调用muxBind, 即可以将用户自己定义的包处理函数的地址赋值给这个muxReceive函数指针. 因此, 底层的enddriver在接收到包之后, 即可将包送上来鸟.

包处理函数的原型为:

STATUS StackRecvRtn (void *pCookie ,long type, M_BLK_ID pMblk, LL_HDR_INFO * pLinkHdr,void *pSapre );

其中, pCookie和调用muxBind函数返回的那个cookie是一样的, type指协议类型, pMblk保存的即是接收到的包的内容, pLinkHdr暂时还不知道是什么东东, pSapre为备用指针, 其值为用户在调用muxBind时传入的那个pSpare.

至于pMblk指向的数据, 为一个M_BLK类型的结构体, 具体需要看vxworks关于内存池的管理相关类容才能具体了解了.

3.muxSend函数

muxSend函数的原型为:

STATUS muxSend(

void * pCookie, /* muxBind()函数返回的cookie */

M_BLK_ID pNBuff /* 要进行发送的数据包*/)

4.关于给vxsim发包的问题:

程序写好之后, 如何测试? 可以通过发包软件给vxsim发包. 然后观察vxsim收发包的情况.

vxsim0的地址可以通过在shell里ping “192.168.255.254”,3 这个命令让vxsim发包, 然后通过抓包软件获得vxsim 的mac地址!

我得到的vxsim0的mac地址是00:00:00:00:00:01.

发包的时候, 对着虚拟网卡发包, 目的地址写成vxsim的mac地址就ok了.(当然协议类型也要填对!)

5.附件, 看过的文章中, 对于mux层的解释.

1)END驱动与MUX接口概述

VxWorks下增强型网络驱动-END(EnhancedNetworkDriver)是一个数据链路层驱动程序,增强型网络驱动(END)是OSI模型中数据链路层的实现,通过MUX函数与网络协议层通讯。END驱动程序是基于MUX 模式,网络驱动程序被划分为协议组件和硬件组件。MUX作为数据链路层和网络层之间的接口,它管理网络协议接口和低层硬件接口之间的交互,将硬件从网络协议的细节中隔离出来;删除使用输入钩例程来过滤接收从协议来的数据包,和删除了使用输出钩例程来过滤协议包的发送;并且链路层上的驱动程序需要访问网络层(IP或其他协议)时,也会调用相关的MUX例程。值得注意的是,网络层协议和数据链路层驱动程序不能直接通讯,它们必须通过MUX。MUX的目的是提供一个接口,隔离网络接口驱动和网络服务,MUX支持两种网络驱动接口类型:

–END: Enhanced Network Driver,一种面向帧结构的驱动

–NPT: Network Protocol Toolkit,一种面向分组的驱动,所有链路层信息被去除。

2)用MUX-API实现网络协议

(1) 网络协议是OSI模型中网络层和传输层的实现.在基于END驱动vxWorks中,网络协议通过MUX接口与

数据链路层进行通信,所有与具体网络接口相关的事务都在数据链路层驱动中进行处理,如发送和接收数据等。

3)实现过程详解

*Step 1: 使用muxBind()函数将协议类型与特定的网络接口绑定

muxBind()函数原型如下:

void * muxBind

(

char * pName, /* interface name, for example, ln, ei,... */

int unit, /* unit number */

BOOL (* stackRcvRtn) (void* , long, M_BLK_ID, LL_HDR_INFO * , void* ),

/* receive function to be called. */

STATUS (* stackShutdownRtn) (void* , void* ),

/* routine to call to shutdown the stack */

STATUS (* stackTxRestartRtn) (void* , void* ),

/* routine to tell the stack it can transmit */

void (* stackErrorRtn) (END_OBJ* , END_ERR* , void* ),

/* routine to call on an error. */

long type, /* protocol type from RFC1700 and many */

/* other sources (for example, 0x800 is IP) */

char * pProtoName, /* string name for protocol */

void * pSpare /* per protocol spare pointer */

)

其中: pName为网络接口的名字, unit为接口号, stackRcvRtn为协议数据处理函数,负责对接收的数据(或者发送的数据,当协议类型为MUX_PROTO_OUTPUT时), stackShutdownRtn, stackTxRestartRtn, stackErrorRtn 分别为关闭,重启和错误处理函数, 若不用则设置为NULL, type为指定的协议类型, pProtoName为协议名称, pSpare为每个协议的备用指针

协议类型及含义:

MUX_PROTO_SNARF: 在所有标准协议接收之前调用stackRcvRtn()处理函数;

MUX_PROTO_PROMISC: 在所有标准协议接收之后调用stackRcvRtn()处理函数;

MUX_PROTO_OUTPUT: 在数据被送到物理层(DRIVER)之前调用stackRcvRtn()函数.

在用muxSend()发送数据时,需要从网络数据缓冲池中申请内存,这里需要用到END_OBJ指针,

取得END_OBJ 的方法

第一种方法:

END_OBJ * endFindByName

(

char * pName, /* device name to search for */

int unit

)

第二种方法:

利用muxBind()的返回值(void类型的指针),将此指针强制转换为MUX_ID类型(声明在系统头文件"private/muxlibP.h"中),其中的pEnd成员即我们需要的END_OBJ指针.如下:

pEnd = ((MUX_ID)pSendCookie)->pEnd;

/* 接收(或者发送)处理函数[也可以说是过滤函数] */

BOOL stackRcvRtn

(

void * pCookie, /* returned by muxBind() */

long type, /* from RFC1700, or user-defined */

M_BLK_ID pNetBuff, /* packet with link-level info */

LL_HDR_INFO * pLinkHdr, /* link-level header info structure */

void * pSpare /* defined on a per-protocol basis */

)

{

/*process code here*/

return(FALSE/*or TRUE*/);

}

若stackRcvRtn()返回TRUE,则该数据包将不再被传递至上层协议或底层DRIVER

(当为MUX_PROTO_OUTPUT类型时);否则该数据包将继续向上或向下传递.

/*muxSend()发送数据包*/

管道

#include "vxWorks.h"

#include "ioLib.h"

#include "selectLib.h"

#define pipeName1 "pipe1" /*命名管道1的名称*/

#define pipe1MaxMesgNum 2 /*管道1可以容纳的消息数*/

#define pipeName2 "pipe2" /*命名管道2的名称*/

#define pipe2MaxMesgNum 2 /*管道2可以容纳的消息数*/

#define eachMesgMaxByte 50 /**每个消息的最大字节数/

#define STATUS int

STATUS task1();

STATUS task2();

STATUS task3();

STATUS pipeTaskInit()

{

int taskId1,taskId2;

/*创建两个管道, task1,task2分别往管道1和2里发送消息,task3用select函数从管道接收消息*/ if(pipeDevCreate(pipeName1,pipe1MaxMesgNum,eachMesgMaxByte)!=OK)

return ERROR;

if(pipeDevCreate(pipeName2,pipe2MaxMesgNum,eachMesgMaxByte)!=OK)

return ERROR;

if((taskId1=taskSpawn("task1",100,0,10000,(FUNCPTR)task1,0,0,0,0,0,0,0,0,0,0))==ERROR) return ERROR;

if((taskId2=taskSpawn("task2",100,0,10000,(FUNCPTR)task2,0,0,0,0,0,0,0,0,0,0))==ERROR) return ERROR;

if((taskId2=taskSpawn("task3",100,0,10000,(FUNCPTR)task3,0,0,0,0,0,0,0,0,0,0))==ERROR) return ERROR;

return OK;

}

STATUS task1()

{

int pipeFd1=0;

int nBytes=0;

char mesgTask1[]="task1 send message!"; /*发送的消息*/

if((pipeFd1=open(pipeName1,O_RDWR,0))==ERROR) /*利用open函数打开管道1, 返回一个fd*/ return ERROR;

while(1)

{

if((nBytes=write(pipeFd1,mesgTask1,sizeof(mesgTask1)))==ERROR) /*往管道1里面写(发送)数据*/

return ERROR;

taskDelay(sysClkRateGet());

}

return OK;

}

STATUS task2()

{

int pipeFd2=0;

int nBytes=0;

char mesgTask2[]="task2 send message!";

if((pipeFd2=open(pipeName2,O_RDWR,0))==ERROR) /*利用open函数打开管道2, 返回一个fd*/ return ERROR;

while(1)

{

if((nBytes=write(pipeFd2,mesgTask2,sizeof(mesgTask2)))==ERROR) /*往管道2里面写(发送)数据*/ return ERROR;

taskDelay(2*sysClkRateGet());

}

return OK;

}

STATUS task3()

{

int pipeFd1=0,pipeFd2=0;

char messageBuf[50];

fd_set fdset;

memset(messageBuf,0,sizeof(messageBuf));

if((pipeFd1=open(pipeName1,O_RDWR,0))==ERROR)

return ERROR;

if((pipeFd2=open(pipeName2,O_RDWR,0))==ERROR) /*利用open函数分别得到管道1和2的fd */ return ERROR;

while(1)

{/*注意, 以下三行代码不能放错位置了, 最初我就是放在了循环体外面, 导致任务2挂起了.*/ FD_ZERO(&fdset); /*将文件描述符集合全部置0*/

FD_SET(pipeFd1,&fdset); /*置位管道1的文件描述符pipeFd1*/

FD_SET(pipeFd2,&fdset); /*置位管道2的文件描述符pipeFd2*/

select(FD_SETSIZE,&fdset,NULL,NULL,NULL);/*select函数监听管道, 注意, select函数应该是这样一个机制, 监听的是fdset中被置位的fd所对应的文件描述符, 在监听到有fd可读(可写)时, 就把fdset中不可读的fd置0, 可读的不变(仍然置1), 然后返回. 这样一来, 下面就可以通过FD_ISSET宏来确定在fdset中, 是哪一个fd可读了, 也即可以从中读取数据了. 但是呢, 在下一次监听之前, 就必须要将fdset中待监听的fd重新置位一遍才可以, 这也是为什么上述三行代码不能放在循环体之外的原因. */

if(FD_ISSET(pipeFd1,&fdset)) /*检测管道1是否可读*/

{

read(pipeFd1,messageBuf,eachMesgMaxByte);

printf("\r\n %s",messageBuf);

memset(messageBuf,0,sizeof(messageBuf));

}

if(FD_ISSET(pipeFd2,&fdset)) /*检测管道2是否可读*/

{

read(pipeFd2,messageBuf,eachMesgMaxByte);

printf("\r\n %s",messageBuf);

memset(messageBuf,0,sizeof(messageBuf));

}

}

return OK;

}

Tornado IDE与VxSim目标仿真环境

实验六 Tornado IDE 与 VxSim目标仿真环 境 6.1 实验目的 熟悉 Tornado开发环境,编辑、编译、下载、调试程序,熟练使用 GNU/Diab 编译器、 Cross Wind/Wind Shell 调试工具、Brower/Wind View 分析工具、VxSim目标仿真器,了解嵌 入式开发的基本方法和过程。 6.2 实验内容 (1) Hello World和 Goodbye World实验。使用 Tornado集成开发环境新建一个工作空间 和工程,通过编辑器编辑程序,并使用工程工具的 GNU编译程序,将程序下载到运行在主 机上的 VxWorks 目标仿真器,使用Wind Shell 运行程序, (2) 通过调试 Tornado 自带的 cobble 程序,掌握使用 Browse 观察目标仿真器的内存使 用情况,使用 Wind View图形化地跟踪监视示例程序的执行流程,使用Debugger 调试运行 时应用程序的错误。 6.3 实验软硬件环境 硬件: 主机: PIII800 ,内存 256M ,硬盘 30G 及以上 目标机:VxSim目标仿真器 软件: 主机: Windows2000/XP,Tornado2.2 目标机:VxWorks5.5 6.4 实验预备知识 Tornado 软总线体系结构,Tornado的工具集组成及其功能。 6.5 实验项目与步骤 6.5.1 Hello World 与 Goodbye World 实验 在本实验中,要求使用 Tornado工具编写一个“Hello World”的程序。该程序中有两个 函数,可以在 Tornado的 Wind Shell 工具中输入这两个函数的名称来启动这两个函数执行。 步骤见下。

Tornado_VxWorks官方培训教程1

嵌入式培训专题 微迪软件培训中心Tornado &VxWorks 培训 深圳市微迪软件技术有限公司 培训中心

嵌入式培训专题 微迪软件培训中心实时系统概念 ?实时系统是对外来事件在限定时间内能做出反应的系统。 ?指标 –响应时间Response Time –生存时间Survival Time –吞吐量Throughput

嵌入式培训专题 微迪软件培训中心实时系统与普通系统 ? 在实时计算中,系统的正确性不仅仅依赖于计算的逻辑结果而且依赖于结果产生的时间?对于实时系统来说最重要的要求就是实时操作系统必须有满足在一个事先定义好的时间限制中对外部或内部的事件进行响应和处理的能力 ? 此外作为实时操作系统还需要有效的中断处理能力来处理异步事件和高效的I /O 能力来处理有严格时间限制的数据收发应用

嵌入式培训专题 微迪软件培训中心实时系统分类 ?根据不同的分类方法可以分为几种。 –方法一是分为周期性的和非周期性的(p e r i o d i c 和 a p e r i o d i c ) –方法二是分为硬实时和软实时(h a r d r e a l _t i m e 和s o f t r e a l _t i m e ) –专用系统和开放系统 –集中式系统和分布式系统

嵌入式培训专题 微迪软件培训中心实时多任务操作系统与分时多任务操作系统? 分时操作系统,软件的执行在时间上的要求,并不严格,时间上的错误,一般不会造成灾难性的后果。?实时操作系统,主要任务是对事件进行实时的处理,虽然事件可能在无法预知的时刻到达,但是软件上必须在事件发生时能够在严格的时限内作出响应(系统响应时间),即使是在尖峰负荷下,也应如此,系统时间响应的超时就意味着致命的失败。另外,实时操作系统的重要特点是具有系统的可确定性,即系统能对运行情况的最好和最坏等的情况能做出精确的估计。

VxWorks常用命令汇总

VxWorks常用的命令 1.与任务相关的命令 sp function,[arg1],...,[arg9] -启动任务,最多接受9个参数,默认的优先级100、堆栈20000字节 period n,function,[arg1],...,[arg8] -创建一个周期调用function的任务,周期为n秒,最多接受8个参数 repeat m,function,[arg1],...,[arg8] -创建一个反复调用function的任务,调用次数为m,m=0时永久调用,最多也是8个参数 ts tidX -挂起任务 tr tidX -恢复挂起的任务 td tidX -删除任务 i tidX -显示任务基本信息,参数为0时显示全部任务 ti tidX -显示任务详细信息,包括寄存器、堆栈等 tt tidX -显示任务的函数调用关系 checkStack tidX -显示任务堆栈使用的历史统计,参数为0时显示全部任务 [其中tidX可以为任务ID 也可以为任务名] 2、系统信息 lkup ["string"] -在系统符号表中查找并列出含有"string"字符的函数及全局变量,有两个特殊参数: 0,给出符号表统计;""(空字符串),列出全部符号 lkAddr addr -显示addr地址附近的符号表 l addr,[n] -显示addr地址开始的n条指令的反汇编,n省略时默认为10条指令 h [n] -n为0时列出最近执行的shell命令,默认20条;n非0时,设定shell记录的历史命令的数目 d [addr,[number],[width]] -显示addr地址开始的number个单元的内容,width定制每个单元的宽度,可以是1、2、4、8 m addr,[width] -按width宽度修改addr地址的内容,width可以是1、2、4、8 memShow 1 -显示系统分区上空闲和已分配空间的总数等 printErrno value -打印系统定义的错误码的宏 3、与网络相关的命令 ifShow ["ifname"] - show info about network interfaces inetstatShow - show all Internet protocol sockets tcpstatShow - show statistics for TCP udpstatShow - show statistics for UDP ipstatShow - show statistics for IP icmpstatShow - show statistics for ICMP arpShow - show a list of known ARP entries

嵌入式实时操作系统vxworks实验教程[1]

???VxWorks 偠 ? Laboratory Tutorial for Embedded Real ˉtime Operating System VxWorks ?? ? ? ? ? ? ? 2003 10

???VxWorks 偠 ? ? 1 ???? (1) 1.1 ?? (1) 1.2 ??? (7) 2 ? MPC860 (16) 3 ???VxWorks ? ? Tornado (25) 3.1 ???VxWorks (25) 3.2 Tornado? ? (43) 4 VxWorks?BootRom (48) 5 偠 (55) 5.1 偠??Tornado??? (55) 5.2 偠?? ??? ? ? (74) 5.3 偠?? ? ? ?? (78) 5.4 偠 ?? ??? (101) 5.5 偠?? ?????? ?? (110) 5.6 偠 ? ?????? ?? (116) ? A hwa-xpc860 偠 (120)

1 ???? ?? ?? 催? ?? ??? ?? ? ? ?? ??Ё?????? ? ?? ?? ? ? ?? ?? (Embebdded computer) Ё??? ?? ? ??? ⑤?20??60 ?? ????? ? ????? ? 1.1.1 ???? ??? ?? ? Н? ??? ????? ?? ?? ???? ???? ?? ?? ?? ?? ???? ??? ????? ? ?????BIOS? ? ? ???? ?催 ? ? ? ㄝ???? ? ??? ? ? ? ?????????? ???? ?? ? ? ? ? ???? ?? ? ? ???? ?ㄝ???? ???? ??? ? ? ??? ? ???? ? ? ?? ㄝ ?? ? ??? ? ?? ? (control)???Mointer) ??(Managemet)ㄝ ?? 1.1.2 ? ?????? ? ? 1.1. 2.1 ? ?? ? ?? ??4?? ? 1? ? ? ? ?? ? ? ???Ё ????? ???? ?? ? ? ?? ?2? ? ??? ?? ?????? ? ????? ??? П? ??? ??????? ? ?? ???? ? 3? ? ? ? ????? ?? ? 催 ? ? ? 4? ? 乏 ? ?? ?? ? ? ? ??? ? ? Ё??∴??? ?? ?? ?? ? mW??uW??1.1.2.2 ? ???? ???? ?? ?? ? ? ?? ? ??? ?? ? ? ? ? ???1000 ??????? 30 ?? ?

vxworks653编程手册

一.V xWorks653运行时系统 1.1. 运行时层 一个vxworks653模块由下面四层组成: ■core OS—必需 ■partition—至少需要一个(vThreads 或COIL-based),每个都在一个分区的操作系统之中■APEX shared library—ARINC 653 应用所需 ■POSIX shared library—POSIX 应用所需 1.1.1.Core OS层 核心操作系统提供服务给分区。 缺省的,核心操作系统使用ARINC653规范中的时间抢占的调度(TPS)来调度分区。Vxworks653的核心操作系统还可以采用APPS调度策略在TPS调度的空闲时间内调度优先级

抢占调度(PPS)使能的分区。 核心操作系统提供给每个VThreads分区操作系统的服务包括: ●分区系统资源 ●调度分区 ●代表分区的操作系统执行trap异常 ●定义和强制分区边界 ●装载分区 ●使用端口和通道在分区间传递消息 ●处理I/O ●代表应用完成系统调用 ●支持分区的调试 ●监控分区和系统的健康 1.1. 2.vThreads 层 vThreads分区操作系统在核心操作系统分配给该分区的时间内调度vThreads中的线程。vThreads不直接与设备交互,而是通过核心操作系统的系统调用。 1.1.3.APEX 层 构建在vThreads之上,遵循ARINC653规范,并且提供相应功能和API。 1.1.4.POSIX层 构建在vThreads之上,遵循用于实时扩展的POSIX标准(1003.1b)。 1.2. 装载和启动 当目标板加电时,按照下面的步骤进行装载和启动 ●初始的启动码装载核心操作系统,分区操作系统,共享库,以及应用 ●核心操作系统初始化自身,启动它自己的子系统 ●核心操作系统创建分区 ●核心操作系统启动分区调度器,并且让应用初始化自身 核心操作系统可以在初始化完成之后下载在线装载的应用程序到分区。应用可以在分区运行之时装载到分区。

Vxworks任务创建编程学习代码

任务创建编程学习代码一 此代码主要的是创建若干的任务,来学习任务的创建和删除. 程序的结构是: start函数:任务创建函数 stop函数:任务删除函数 其它为任务 请大家仔细分析代码,理解任务内务的创建和删除.本代码是在tornado2.0版本调试成功. 如有疑问联系作者jdvxworks 邮箱:foxqs@https://www.360docs.net/doc/b315328268.html, /********************************* * date:2006.7.10 time:16.08 * maker: jdvxworks * aim: create 4 task * list: task0 task1 task2 task3 * change:_____________________ *********************************/ #include "stdio.h" #include "taskLib.h" #include "vxWorks.h" //#include "semBLib.h" int taskid0; int taskid1; int taskid2; int taskid3; int loopid; SEM_ID sem_id; STATUS Err; void start(void); void test0(void); void test1(void); void test2(void); void test3(void); void stop(void); void taskloop(void); //start init task void start(void) { int i,o; long p=9999999+100000;

最新Python web开发视频教程从入门到精通

最新Python web开发视频教程从入门到精通想学Python web开发?想成为Python web开发工程师?想进入Python行业拿高薪?但还没入行?别急,先看看Python web开发视频教程。 千锋Python基础教程:https://www.360docs.net/doc/b315328268.html,/s/1qYTZiNE Python课程教学高手晋级视频总目录: https://www.360docs.net/doc/b315328268.html,/s/1hrXwY8k Python课程windows知识点:https://www.360docs.net/doc/b315328268.html,/s/1kVcaH3x Python课程linux知识点:https://www.360docs.net/doc/b315328268.html,/s/1i4VZh5b Python课程web知识点:https://www.360docs.net/doc/b315328268.html,/s/1jIMdU2i Python课程机器学习:https://www.360docs.net/doc/b315328268.html,/s/1o8qNB8Q Python课程-树莓派设备:https://www.360docs.net/doc/b315328268.html,/s/1slFee2T 以上是千锋现有的Python web开发视频教程,一起看看千锋Python web开发培训都有哪些内容吧。 千锋Python培训的主要学习内容包括三大模块,十大部分:

一、Python初级开发工程师 1.python语言基础(可以python基础语法入门和项目实践); 2.python语言高级(能够利用python进行一般的数据处理和爬虫); 3.python全栈工程师前端(掌握常用的前端技术); 4.python全栈工程师后端(学会企业级后端框架Django,并可完成大型网站构建); 二、Python高级开发工程师 5.python全栈工程师后端高级(目标是掌握两种轻量级和实时后端框架Flask和Tornado,完成两个实际项目); 6.Linux基础(懂得Linux常用命令和shell开发技术); 7.Linux运维自动化开发(清楚Linux运维自动化开发原理,并完成相应项目实践); 三、Python大神级数据分析师 8.python数据分析(学会python数据分析与可视化,了解数据统计和进入数据分析的原理,完成相应项目); 9.python大数据(掌握python大数据的原理和实践);

VxWorks操作系统RTP介绍和使用方法

VxWorks 操作系统RTP 介绍和使用方法 从VxWorks 6.x开始引入RTP(VxWorks real time process projec模t) 式编程,这种模式的优点是应用程序相互独立,互不影响,而且增加了内核的稳定性,缺点是由于“内核态”与“用户态”的内存拷贝,其执行效率有所降低,随着CPU 速度越来越快,这点效率的牺牲已经越来越不重要。相比较于传统的DKM (downloadable kernel module project ),RTP适合多个团队独立运作,然后汇总 联试,这种模式除了全局函数不能再shell 里直接调用外,其对应用程序几乎不 做任何约束,原有的DKM 工程代码稍作修改即可正常运行。内核变化较大,需 要添加较多的组件,内存需要较好的划分,为保持应用程序直接调用函数调试的 习惯,需要封装接口供用户使用。 现简单的介绍RTP使用方法,并给出demo 代码供参考。 1. 新建并编译工程: (1) File->new-> VxWorks real time process projec如t, 图【1】 图【1】 (2) 一路next 后,选择如图【2】所示的编译器

图【2】 (3) 选择Finish 后,工程新建完毕。 (4) 导入源文件:这里的源文件名称是fooRtpApp.c ,一种较快捷的方式是选 中新建的工程,按下F5,源文件会出现在工程中. (5) 右键选择编译,出现如图【3】,选择Continue 继续。 图【3】 编译完成后,会生成vxe 格式的可执行文件,此处为usrAppA.vxe 。 2. 下载可执行性文件 待板子启动后,使用ftp 将vxe 文件下载到板子中。步骤如下: (1)运行->cmd,打开对话窗口,如图【4】所示:

vxWorks学习笔记

vxWorks学习笔记 vxWorks学习笔记 2006-07-20 11:141.VxWorks开发方式:交叉开发,即将开发分为主机(host)和目标机(target)两部分。 类似于dos下C语言程序的开发。 合并开发的优点:简单 缺点:资源消耗量大,CPU支持,非标准体系的支持 host (Tornado) target(vxWork) 小程序模块 vxWorks实际采用开发模式 Tornado提供:编辑,编译,调试,性能分析工具,是vxWorks 的开发工具 vxWorks:面向对象可以剪裁的实际运行操作系统 2.vxWorks启动方式 Rom方式(vxWork_rom) vxWorks直接烧入rom Rom引导方式(bootrom+vxWorks) 其中bootrom烧入rom,vxWorks可以通过从串口,网口,硬盘,flash等下载!这里的bootrom不是开发环境中的bootable,在开发环境里bootable指的是vxWorks,downloadable指application 3.调试

attach 用来在多任务调试时将调试对象绑定到某个任务 任务级调试(attach taskName) 单个任务的调试不会影响到其他任务的运行,主要用来调用户的应用程序。 全局断点:在调另一任务或本任务时,系统运行本任务断点,则停下。各任务要配合使用。 任务断点:调本任务时,系统运行到本任务断点,则停下。如果没有attach到本任务,不起作用。 一次性断点:跑到一次之后自动删除。 系统级调试(attach system) 把所有task和系统core、中断看成一个整体,可用于调试系统和中断。对中断调试,如果不是系统级调试,无论是那种断点都不起作用 !wdbAgent不在调试范围内,当任务级调试时工作在中断方式,系统级调试工作在轮询方式。 !可是使用命令行方式的调试,参看crossWind教程。 4.调度 优先级调度(无条件) 时间片:同优先级,如果时间片没有打开,任务采取先到先运行,运行完毕在交出cpu,如果打开,则轮流使用cpu。!死循环使比它优先级低的任务都不能运行。

浅谈Tornado2.2下程序调试

浅谈Tornado2.2下程序调试 “调试一段程序的难度是写出这段程序的难度的两倍,因此,如果你的代码尽可能清楚,那么你就不用费力的调试它”-- Brian W. Kernighan “有时周一宁愿休息而不是花一周余下的时间调试周一的代码” -- Christopher Thompson ….. ….. 调试对于软件的成败至关重要,正确使用恰当的调试工具可以提高发现和改正错误的效率。 一、调试前的准备工作 1、保证目标机跟主机能网络正常通信。如果tornado是装在虚拟机中,则要保 证虚拟机跟目标机能网络通信。用ping xx.xx.xx.xx –l 1500命令。之所以后面要加-l 1500是为了保证最大包也能ping通,如果不加-l 则为ARP包,ARP包只有64个字节。在网络通信中会出现小包能ping通,大包ping不通的情况。 2、保证WDB为Ready状态 图1 如果WDB为unReady状态,很可能是WDB的组件没有加。 二、配置Target Server Target Server是Tornado集成交叉开发环境中最重要的工具。这个工具负责主机与目标机的连接,为其他的工具使用提供通信桥梁。 点击”Tools->Targer Server->configure”。出现如下图2所示:

图2 Target server配置界面 配置界面中Targer Server要填入主机的IP地址,Targer Server PropertiesBack End(后端)默认选择wdbrpc ,它是最常用的连接类型,其支持任意种IP连接(如以太网)。Target Name/Ip Address需要填入目标机的IP地址。主机和目标机的IP地址可以在bootrom起来后看到,如图3所示。 图3 bootrom启动打印 Targer Server Properties 之Core File and Symbols,在File选项中选择主机vxworks镜像的路径,如图4所示。

NOCSIM实验教程

NoCsim 使用手册 1、如何开始 1.1 生成可执行文件 如果使用Cygwin程序(Cygwin中已安装gcc组件),假设模拟器src目录路径为C:/NoCsim/src/,则在命令提示符中输入cd /cygdrive/C/NoCsim/src,切换当前工作目录到src目录。 如果使用虚拟机或者直接在linux环境下,则类似进入src文件后,进行编译即可。要求已安装gcc组件。 输入make,对NoCsim进行编译,生成可执行文件NoCsim.exe。 1.2 模拟 假设src目录下当前存在一个配置文件mesh88,则开始模拟命令为:./NoCsim.exe mesh88。 2、配置文件介绍 部分常用配置参数包括: topology: mesh,表示mesh拓扑结构网络; k:任意正整数值,表示 mesh结构网络每一维上的router数目; n:任意正整数值,表示mesh结构网络的维数; routing_function:当前支持取值:single_single,该路由算法用于评估allocator的性能;dim_order_mesh,表示mesh网络上的DOR路由算法;valiant_mesh,表示mesh结构上的Valiant路由算法; num_vcs:任意正整数值,表示每个input port上的input VC条数; vc_buf_size:任意正整数值,表示每条input VC中的buffer单元数; input_speedup:表示在crossbar上是否提供input speedup; routing_delay:表示路由器的路由计算延迟,将其值设为0,可以模拟look-aheading routing算法的性能; vc_alloc_delay:表示路由器进行VC allocation所需延迟; sw_alloc_delay:表示路由器进行switch allocation所需延迟; st_final_delay:表示路由器进行Switch traversal所需延迟。一般而言,上述4个延迟参数都置为1; vc_allocator:VC allocator类型,当前只支持wavefront allocator; sw_allocator:Switch allocator类型,当前只支持wavefront allocator; traffic:traffic pattern类型,当前支持uniform、bitcomp和tornado三种traffic patterns; const_flits_per_packet:每个packet所包含的flit数目;

Dos引导VxWorks

CF卡上引导VxWorks的三种方法 方法一. 直接引导: 引导扇区 >> bootrom.sys >> VxWorks 这种方法最快,但要求bootrom.sys保持连续性(可用chkdsk检查)。 方法二. FreeDOS引导: 引导扇区 >> FreeDOS >> https://www.360docs.net/doc/b315328268.html, >> bootrom.sys >> VxWorks 这种方法牺牲少量启动时间换取灵活性,因为你可以为FreeDOS增加菜单实现选择性启动,而且许多维护性工作也可在DOS下进行。 方法三. GRUB引导: 引导扇区 >> GRUB >> FreeDOS启动盘映像 >> FreeDOS >> https://www.360docs.net/doc/b315328268.html, >> bootrom.sys >> VxWorks 这种方法比上一种更进一步,你可以利用GRUB的强大功能实现多系统引导,不过不是所有的主板都支持GRUB。 grub> kernel --type=netbsd /vxWorks 一共两个分区,都是主分区。C盘为Fat32格式,设为活动分区。D盘为Fat格式,设为非活动分区。C盘装的Winxp,用XP引导Grub4DOS。把DOS的系统文件(IO.sys,MSDOS.sys,https://www.360docs.net/doc/b315328268.html,)拷贝到D盘根目录。 修改menu.lst如下: title DOS6.22 root (hd0,1) chainloader (hd0,1)/IO.SYS title DOSDOS find --set-root (hd0,1)/io.sys chainloader (hd0,1)/io.sys title FINDDOSACT find --set-root (hd0,1)/io.sys

Python基础教程视频全集下载

Python基础教程视频全集下载 现在大数据,量化分析,科学技术,人工智能,游戏很多方面都用到Python,目前国内Python人才需求量上升非常快,薪资也水涨船高。也有同学考虑找些Python基础教程视频进行学习,请看以下链接: 千锋Python基础教程:https://www.360docs.net/doc/b315328268.html,/s/1qYTZiNE Python课程教学高手晋级视频总目录: https://www.360docs.net/doc/b315328268.html,/s/1hrXwY8k Python课程windows知识点:https://www.360docs.net/doc/b315328268.html,/s/1kVcaH3x Python课程linux知识点:https://www.360docs.net/doc/b315328268.html,/s/1i4VZh5b Python课程web知识点:https://www.360docs.net/doc/b315328268.html,/s/1jIMdU2i Python课程机器学习:https://www.360docs.net/doc/b315328268.html,/s/1o8qNB8Q Python课程-树莓派设备:https://www.360docs.net/doc/b315328268.html,/s/1slFee2T

以上是千锋Python视频全集,希望对你有帮助。如果你对于千锋Python 培训的内容感兴趣,请继续阅读。 千锋Python培训的主要学习内容包括三大模块,十大部分: 一、Python初级开发工程师 1.python语言基础(可以python基础语法入门和项目实践); 2.python语言高级(能够利用python进行一般的数据处理和爬虫); 3.python全栈工程师前端(掌握常用的前端技术); 4.python全栈工程师后端(学会企业级后端框架Django,并可完成大型网站构建); 二、Python高级开发工程师 5.python全栈工程师后端高级(目标是掌握两种轻量级和实时后端框架Flask和Tornado,完成两个实际项目); 6.Linux基础(懂得Linux常用命令和shell开发技术); 7.Linux运维自动化开发(清楚Linux运维自动化开发原理,并完成相应项目实践); 三、Python大神级数据分析师 8.python数据分析(学会python数据分析与可视化,了解数据统计和进入数据分析的原理,完成相应项目);

VxWorks操作系统MakeFile

VxWorks操作系统MakeFile(一) 时间:2008-8-24 夜 版权申明:本文为水煮鱼为水煮鱼@博客园撰写,不得用于商业用途,如需摘用,请与水煮鱼联系。 1、介绍 本文将介绍为什么要将你的C源代码分离成几个合理的独立文档,什么时候需要拆分,那又怎么拆分呢? 然后再介绍如何使用GUN Make使你的编译和链接步骤自动化。可能你使用的是其他的make工具,但是其实道理都差不多。当然如果你对自己的编程工具有怀疑的话,可以不妨实际的试试。 2、多文件项目介绍 a. why? 为什么使用多文件项目?他们有什么好处呢? 从表面上看,多文件项目是够复杂的了,又要头文件,又需要extern申明,并且如果你要查找一个文件的话,还需要在更多的文件里搜索。 但是如果把其考虑成一个项目,那一个项目根据功能划分为小的模块,那就不难理解了。 想想如果是一个一万行代码,如果你把其放到一个文件里,则在编译的时候,则需要对一万行代码进行重新编译。不过如果你如果把其放到不同的文件里,那修改一行,则只需要编译一个文件就可以了。可能你会说,一万行代码,就算全部编译,那点时间也基本可以忽略不计,但是实际情况是,在一个大的系统里,可能代码达到几十万甚至上百万,千万行代码的规模。以我们的项目为例,目前代码规模已经达到了上千万行的级别,如果全部重新编译,则将耗费几个小时甚至半天的时间。如果将其划分多多个文件,则修改一行所引入的编译代码,将不会随着你代码规模的增大而增大。所以多个文件的优点不言自明了。 不过对于不便于搜索的问题,其实只要文件划分得当,也并不会造成多大的困难。其实,从多个目标文件生成一个程序包比从一个单一文件生成程序包要好的多。当然,实际上这是不是一个优势还与你所使用的系统有关。但是当使用gcc/ld(一个GUN C编译器/连接器)把一个程序包连接到一个程序时,在连接的过程中,它会尝试不去连接没有使用到的部分,但它每次只能从程序包中把一个完整的目标文件排除在外。因此,如果你修改了一个程序包中某一个目标文档中任何一个符号的话,那么这个目标文件整个都会被连接进来。要是一个程序包被非常充分的分解的话,那么经过链接后,得到的可执行文件会比从一个大目标文件组成的程序包连接得到的文件小的多。 并且常常我们的程序是模块化的,高内聚,低耦合,使得文件之间共享部分被减少到了最少,因此采用多文件的方式,可以比较容易的找到代码中的bug。 b.when? 那什么时候分解你的项目? 如果你开发的是一个大项目,在开始前,应该好好考虑一下你将如何实现,并且将生成几个文件来存放你的代码。当然,在项目的开发过程中,你可以建立新的我文件,但是这将打乱你的整体布局,可能造成你整体结构的调整。因此特别建

学习vxworks中遇到的问题

1预期目标 用两台pc机建立起由网络进行通讯的vxworks开发环境,开发工具是tornado 2.2 for pentium,vxworks版本为5.5。 2硬件描述 宿主机是一台装有windows xp和tornado 2.2的带有网络接口的笔记本电脑,ip设置为192.168.1.101,目标机是研华的610L型号工控机,后发现在vxworks系统下驱动工控机自带网卡有困难,于是购置了一块tp-link的pci网卡,装在工控机上,网卡芯片是realtek 8139d。 3建立开发环境的方案 目标工控机上已经装有windows xp,文件系统是fat32,经试验得知工控机支持usb-zip启动,考虑到不对windows系统产生影响,决定使用u盘启动作为系统启动的方式。用u盘启动bootrom后通过网络下载存放在笔记本电脑上的vxworks系统镜像,宿主机和目标机通过网络通讯,从而建立起x86构架下的vxworks开发环境。 4工作现状 u盘启动盘通过ultraISO和tornado 2.2自带的一些工具制作成功,并能在工控机上把bootrom 启动起来到命令行,但是在加载vxworks镜像的时候不能成功。 5遇到的问题 在bsp中添加rtl8139网卡驱动,添加驱动的过程如下 (a)下载rtl8139驱动vxworks-8139(140),是适用于tornado 2.0的。 (b)将目录下的h和src两个文件夹复制到tornado 2.2下target文件夹里,把sysRtl81x9End.c 复制到bsp文件夹下。 (c)运行命令行,在C:\Tornado2.2\target\src\drv\end\unsupported目录下运行 make CPU=PENTIUM 成功,但有警告(环境变量已设置好), 在C:\Tornado2.2\target\lib\objPENTIUMgnuvx目录下生成了rtl81x91.o。 (d)修改bsp文件夹里的config.h 修改的第一处 #elif (CPU == PENTIUM) #define DEFAULT_BOOT_LINE \ "rtl(0,0)host:vxWorks h=192.168.1.101 e=192.168.1.102 u=target pw=target" 修改的第二处 #define INCLUDE_END /* Enhanced Network Driver Support */ #undef INCLUDE_DEC21X40_END /* (END) DEC 21x4x PCI interface */ #undef INCLUDE_EL_3C90X_END /* (END) 3Com Fast EtherLink XL PCI */ #undef INCLUDE_ELT_3C509_END /* (END) 3Com EtherLink III interface */ #undef INCLUDE_ENE_END /* (END) Eagle/Novell NE2000 interface */ #undef INCLUDE_FEI_END /* (END) Intel 8255[7/8/9] PCI interface */ #undef INCLUDE_GEI8254X_END /* (END) Intel 82543/82544 PCI interface */ #undef INCLUDE_LN_97X_END /* (END) AMD 79C97x PCI interface */

TORNADO环境下的命令行编译文件

Tornado环境下的命令行编译文件 Table of contents目录 T ABLE OF CONTENTS目录 (1) 1TORNADO及其编译工具简介 (2) 2两种编译工具下的C/C++文件编译 (4) 2.1GNU T OOL的编译 (4) 2.2D IAB T OOL的编译 (5) 3MAKEFILE的编译 (6) 3.1特殊变量的定义(以DCN DS45XX项目为例) (6) 3.2MAKEFILE.LOCAL的建立 (7) 3.3命令实现 (8) 4REFERENCE DOCUMENTS参考文献 (9)

1Tornado及其编译工具简介 Tornado是嵌入式实时领域里最新一代的开发调试环境。Tornado给嵌入式系统开发人员提供了一个不受目标机资源限制的超级开发和调试环境。Tornado 包含三个高度集成的部分: ·运行在主机和目标机上的强有力的交叉开发工具和实用程序; ·运行在目标机上的高性能、可裁剪的实时操作系统VxWorks; ·连接主机和目标机的多种通讯方式,如:以太网,串口线,ICE或ROM 仿真器等。 对于不同的目标机,Tornado给开发者提供一个一致的图形接口和人机界面,如图1-1所示。 图1-1 当使用Tornado的开发人员转向新的目标机时,不必再花费时间学习或适应新的工具;对深嵌入式应用开发者来说更重要的是,Tornado所有的工具都是驻留在开发平台上的。在嵌入式系统工具发展历史上,Tornado是第一个实现了当目标机资源有限时开发工具仍可使用而且功能齐全的开发环境。另外,所有工具都通过一个中央服务器(Target Server)与目标机的通讯,因此无论连结方式是Ethernet,还是串口线、ICE仿真器、ROM仿真器或客户设计的调试通道,所有工具均可使用。 Tornado提供了一套完整的GNU Tool开发工具链,其中包括: ·CPP:C预处理

vxworks培训教程(10)

Wind River Systems Tornado Training Workshop ? Copyright Wind River Systems 10-1Chapter 10 Exceptions, Interrupts,and Timers Exception Handling and Signals Interrupt Service Routines System Clock, Auxiliary Clock, Watchdog Timers

Wind River Systems Tornado Training Workshop ? Copyright Wind River Systems 10-2Exceptions, Interrupts, and Timers 10.1Exception Handling and Signals Interrupt Service Routines Timers Exception handling Using signals Installing user-de?ned signal handler

Wind River Systems Tornado Training Workshop ? Copyright Wind River Systems 10-3Exception Handling Overview ?An exception is an unplanned event generated by the CPU. Examples include: trap or breakpoint instruction, divide by zero, ?oating point or integer over?ow, illegal instruction, or address error. ?An exception will generate an “internal” interrupt. ?VxWorks installs exception handlers at system startup.These handlers will run on an exception and will try to invoke a user-de?ned exception handler. ? A VxWorks exception handler communicates with a user tasks by sending a signal. The user-installed handler will then run. ?Exceptions vary across CPU architectures. The help page for excLib contains information about generic exception handling, while the page for excArchLib discusses architecture-speci?c routines.

tornado调试工具介绍

T ornado调试工具介绍 网络上海软件开发二部 crossWind (tornado debugger) 重要的设置步骤: 1、配置tools->target server->config a、在target name/ip address中输入目标板子的ip地址。 b、在back end 处选上wdprpc,如果网络不好,可以在timeout中输入2s c、在core file and symbols的文件中选上需要调试的vxWorks或vxWorks.st d、memory cache Size 设置为10000。 e、这样就可以启动这个target server了 2、Debug->Source search path 中加上你要调试的原代码的路径。 典型故障: 1、PING目标机也通,想调试程序,但target server 启不来,现象如下: Connecting to target agent... Error: rpccore backend client Unable to receive failed. 解决:检查target server 的配置,其中Core file应选为下载的vxworsk image。假设target server 的配置是正确的,那么就检查Tornado中对vxworks的配置,选择wdb connection为end 方式。 2、启动target server后,出现 Warning: Target checksum: 0xa7fc (computed from 0x108340 to 0x2170d0). Host checksum: 0xa8fd (computed from 0x1830380 to 0x193f110). Warning: Core file checksums do not match. 解决:下载的VxWorks核和target server路径下的文件不是同一个文件,有可能是因为重新编译了VxWorks(即使不修改任何内容,两次编译的结果仍然会不同)。 3、启动target server后,出现 Warning: Target server cache for agent memory is full. Use the '-m' option to increase the target server cache. 解决:target Server的Memory cache size默认为1M,适当加大。 常用功能: breakPoint:设置断点,当任务执行到本断点后会stop,前提是我们设置了auto attach to task,在没有设置此选项的情况下,必须手工attach 到某一任务。有全局断点和任务断点

Python实战视频教程分享

Python实战视频教程分享 相信大家都清楚,学习一门编程语言,最重要的就是实战。没有实际动手是无法掌握好它的。因此诸如“Python实战视频教程哪里有”的问题在贴吧论坛里出现,小编今天就来解答这个问题。 说到Python实战视频教程,不得不提的就是业界很有名气的千锋教育录制的,接下来一起看看千锋Python实战视频教程都有哪些。 千锋Python基础教程:https://www.360docs.net/doc/b315328268.html,/s/1qYTZiNE Python课程教学高手晋级视频总目录: https://www.360docs.net/doc/b315328268.html,/s/1hrXwY8k Python课程windows知识点:https://www.360docs.net/doc/b315328268.html,/s/1kVcaH3x Python课程linux知识点:https://www.360docs.net/doc/b315328268.html,/s/1i4VZh5b Python课程web知识点:https://www.360docs.net/doc/b315328268.html,/s/1jIMdU2i Python课程机器学习:https://www.360docs.net/doc/b315328268.html,/s/1o8qNB8Q Python课程-树莓派设备:https://www.360docs.net/doc/b315328268.html,/s/1slFee2T

以上就是是千锋今天给大家分享的Python实战视频教程,希望你会喜欢。如果你还想了解千锋Python培训的内容,不妨继续阅读。 千锋Python培训的主要内容有三大模块,包含十大部分: 一、Python初级开发工程师 1.python语言基础(可以python基础语法入门和项目实践); 2.python语言高级(能够利用python进行一般的数据处理和爬虫); 3.python全栈工程师前端(掌握常用的前端技术); 4.python全栈工程师后端(学会企业级后端框架Django,并可完成大型网站构建); 二、Python高级开发工程师 5.python全栈工程师后端高级(目标是掌握两种轻量级和实时后端框架Flask和Tornado,完成两个实际项目); 6.Linux基础(懂得Linux常用命令和shell开发技术); 7.Linux运维自动化开发(清楚Linux运维自动化开发原理,并完成相应项目实践);

相关文档
最新文档