搜档网
当前位置:搜档网 › lwip分析

lwip分析

lwip分析
lwip分析

lwip分析

2008年05月08日星期四 17:11

lwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lwip既可以移植到操作系统上,又可以在无操作系统的情况下独立运行.

LwIP的特性如下:

(1) 支持多网络接口下的IP转发

(2) 支持ICMP协议

(3) 包括实验性扩展的的UDP(用户数据报协议)

(4) 包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)

(5) 提供专门的内部回调接口(Raw API)用于提高应用程序性能

(6) 可选择的Berkeley接口API(多线程情况下)

(7) 在最新的版本中支持ppp

(8) 新版本中增加了的IP fragment的支持.

(9) 支持DHCP协议,动态分配ip地址.

现在网上最新的版本是V1.3.0

1.lwip的进程模型(process model)

tcp/ip协议栈的process model一般有几种方式.

1.tcp/ip协议的每一层是一个单独进程.链路层是一个进程,ip层是一个进程,tcp层是一个进程.这样的好处是网络协

议的每一层都非常清晰,代码的调试和理解都非常容易.但是最大的坏处数据跨层传递时会引起上下文切换(context switch).

对于接收一个TCP segment要引起3次context switch(从网卡驱动程序到链路层进程,从链路层进程到ip层进程,从ip层进程

到TCP进程).通常对于操作系统来说,任务切换是要浪费时间的.过频的context swich 是不可取的.

2.另外一种方式是TCP/IP协议栈在操作系统内核当中.应用程序通过操作系统的系统调用(system call)和协议栈来进行通讯.

这样TCP/IP的协议栈就限定于特定的操作系统内核了.如windows就是这种方式.

3.lwip的process model:所有tcp/ip协议栈都在一个进程当中,这样tcp/ip协议栈就和操作系统内核分开了.而应用层程序既可以

是单独的进程也可以驻留在tcp/ip进程中.如果应用程序是单独的进程可以通过操作系统的邮箱,消息队列等和tcp/ip进程进行通讯.

如果应用层程序驻留tcp/ip进程中,那应用层程序就利用内部回调函数口(Raw API)和tcp/ip协议栈通讯.对于ucos来说进程就是一个系统任务.lwip的process model请参看下图.在图中可以看到整个tcp/ip协议栈都在同一个任务(tcpip_thread)中.应用层程序既可以是独立的任务(如图中的 tftp_thread,tcpecho_thread),也可以在tcpip_thread中(如图左上角)中

利用内部回调函数口(Raw API)和tcp/ip协议栈通讯

2.1 Lwip的操作系统封装层(operating system.emulation layer)

Lwip为了适应不同的操作系统,在代码中没有使用和某一个操作系统相关的系统调用和数据结构.而是在lwip和操作系统之间增加了一个操作系统封装层.操作系统封装层为操作系统服务(定时,进程同步,消息传递)提供了一个统一的接口.在lwip中进程同步使用semaphone 和消息传递采用”mbox”(其实在ucos的实现中我们使用的是Message Queue来实现lwip中的”mbox”,下面大家可以看到这一点)

Operating system emulation layer的原代码在…/lwip/src/core/sys.c中.而和具体的操作系

统相关的代码在../lwip/src/arch/sys_arch.c中.

操作系统封装层的主要函数如下:

void sys_init(void)//系统初始化

sys_thread_t sys_thread_new(void (* function)(void *arg), void *arg,int prio)//创建一个新进程

sys_mbox_t sys_mbox_new(void)//创建一个邮箱

void sys_mbox_free(sys_mbox_t mbox)//释放并删除一个邮箱

void sys_mbox_post(sys_mbox_t mbox, void *data) //发送一个消息到邮箱

void sys_mbox_fetch(sys_mbox_t mbox, void **msg)//等待邮箱中的消息

sys_sem_t sys_sem_new(u8_t count)//创建一个信号量

void sys_sem_free(sys_sem_t sem)//释放并删除一个信号量

void sys_sem_signal(sys_sem_t sem)//发送一个信号量

void sys_sem_wait(sys_sem_t sem)//等待一个信号量

void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)//设置一个超时事件 void sys_untimeout(sys_timeout_handler h, void *arg)//删除一个超时事件…

关于操作系统封装层的信息可以阅读lwip的doc目录下面的sys_arch.txt.文件.

2.2

2.2.1 系统初始化

sys_int必须在tcpip协议栈任务tcpip_thread创建前被调用.

#define MAX_QUEUES 20

#define MAX_QUEUE_ENTRIES 20

typedef struct {

OS_EVENT* pQ;//ucos中指向事件控制块的指针

void* pvQEntries[MAX_QUEUE_ENTRIES];//消息队列

//MAX_QUEUE_ENTRIES消息队列中最多消息数

} TQ_DESCR, *PQ_DESCR;

typedef PQ_DESCR sys_mbox_t;//可见lwip中的mbox其实是ucos的消息队列

static char pcQueueMemoryPool[MAX_QUEUES * sizeof(TQ_DESCR) ];

void sys_init(void)

{

u8_t i;

s8_t ucErr;

pQueueMem = OSMemCreate( (void*)pcQueueMemoryPool, MAX_QUEUES, sizeof(TQ_DESCR), &ucErr );//为消息队列创建内存分区

//init lwip task prio offset

curr_prio_offset = 0;

//init lwip_timeouts for every lwip task

//初始化lwip定时事件表,具体实现参考下面章节

for(i=0;i

lwip_timeouts[i].next = NULL;

}

}

2.2.2 创建一个和tcp/ip相关新进程:

lwip中的进程就是ucos中的任务,创建一个新进程的代码如下:

#define LWIP_STK_SIZE 10*1024//和tcp/ip相关任务的堆栈大小.可以根据情况自

//己设置,44b0开发板上有8M的sdram,所以设大

//一点也没有关系:)

//max number of lwip tasks

#define LWIP_TASK_MAX 5 //和tcp/ip相关的任务最多数目

//first prio of lwip tasks

#define LWIP_START_PRIO 5 //和tcp/ip相关任务的起始优先级,在本例中优先级可

//以从(5-9).注意tcpip_thread在所有tcp/ip相关进程中//应该是优先级最高的.在本例中就是优先级5

//如果用户需要创建和tcp/ip无关任务,如uart任务等,

//不要使用5-9的优先级

OS_STK LWIP_TASK_STK[LWIP_TASK_MAX][LWIP_STK_SIZE];//和tcp/ip相关进程

//的堆栈区

u8_t curr_prio_offset ;

sys_thread_t sys_thread_new(void (* function)(void *arg), void *arg,int prio) {

if(curr_prio_offset < LWIP_TASK_MAX){

OSTaskCreate(function,(void*)0x1111,

&LWIP_TASK_STK[curr_prio_offset][LWIP_STK_SIZE-1],

LWIP_START_PRIO+curr_prio_offset );

curr_prio_offset++;

return 1;

} else {

// PRINT(" lwip task prio out of range ! error! ");

}

}

从代码中可以看出tcpip_thread应该是最先创建的.

2.2.3 Lwip中的定时事件

在tcp/ip协议中很多时候都要用到定时,定时的实现也是tcp/ip协议栈中一个重要的部分.lwip中定时事件的数据结构如下.

struct sys_timeout {

struct sys_timeout *next;//指向下一个定时结构

u32_t time;//定时时间

sys_timeout_handler h;//定时时间到后执行的函数

void *arg;//定时时间到后执行函数的参数.

};

struct sys_timeouts {

struct sys_timeout *next;

};

struct sys_timeouts lwip_timeouts[LWIP_TASK_MAX];

Lwip中的定时事件表的结构如下图,每个和tcp/ip相关的任务的一系列定时事件组成一个单向链表.每个链表的起始指针存在lwip_timeouts的对应表项中.

函数sys_arch_timeouts返回对应于当前任务的指向定时事件链表的起始指针.该指针存在lwip_timeouts[MAX_LWIP_TASKS]中.

struct sys_timeouts null_timeouts;

struct sys_timeouts * sys_arch_timeouts(void)

{

u8_t curr_prio;

s16_t err,offset;

OS_TCB curr_task_pcb;

null_timeouts.next = NULL;

//获取当前任务的优先级

err = OSTaskQuery(OS_PRIO_SELF,&curr_task_pcb);

curr_prio = curr_task_pcb.OSTCBPrio;

offset = curr_prio - LWIP_START_PRIO;

//判断当前任务优先级是不是tcp/ip相关任务,优先级5-9

if(offset < 0 || offset >= LWIP_TASK_MAX)

{

return &null_timeouts;

}

return &lwip_timeouts[offset];

}

函数sys_timeout给当前任务增加一个定时事件:

void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)

{

struct sys_timeouts *timeouts;

struct sys_timeout *timeout, *t;

timeout = memp_malloc(MEMP_SYS_TIMEOUT);//为定时事件分配内存

if (timeout == NULL) {

return;

}

timeout->next = NULL;

timeout->h = h;

timeout->arg = arg;

timeout->time = msecs;

timeouts = sys_arch_timeouts();//返回当前任务定时事件链表起始指针

if (timeouts->next == NULL) {//如果链表为空直接增加该定时事件

timeouts->next = timeout;

return;

}

//如果链表不为空,对定时事件进行排序.注意定时事件中的time存储的是本事件//时间相对于前一事件的时间的差值

if (timeouts->next->time > msecs) {

timeouts->next->time -= msecs;

timeout->next = timeouts->next;

timeouts->next = timeout;

} else {

for(t = timeouts->next; t != NULL; t = t->next) {

timeout->time -= t->time;

if (t->next == NULL ||

t->next->time > timeout->time) {

if (t->next != NULL) {

t->next->time -= timeout->time;

}

timeout->next = t->next;

t->next = timeout;

break;

}

}

}

}

函数sys_untimeout从当前任务定时事件链表中删除一个定时事件

void sys_untimeout(sys_timeout_handler h, void *arg)

{

struct sys_timeouts *timeouts;

struct sys_timeout *prev_t, *t;

timeouts = sys_arch_timeouts();//返回当前任务定时事件链表起始指针

if (timeouts->next == NULL)//如果链表为空直接返回

{

return;

}

//查找对应定时事件并从链表中删除.

for (t = timeouts->next, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {

if ((t->h == h) && (t->arg == arg))

{

/* We have a match */

/* Unlink from previous in list */

if (prev_t == NULL)

timeouts->next = t->next;

else

prev_t->next = t->next;

/* If not the last one, add time of this one back to next */

if (t->next != NULL)

t->next->time += t->time;

memp_free(MEMP_SYS_TIMEOUT, t);

return;

}

}

return;

}

2.2.3 “mbox”的实现:

(1)mbox的创建

sys_mbox_t sys_mbox_new(void)

{

u8_t ucErr;

PQ_DESCR pQDesc;

//从消息队列内存分区中得到一个内存块

pQDesc = OSMemGet( pQueueMem, &ucErr );

if( ucErr == OS_NO_ERR ) {

//创建一个消息队列

pQDesc->pQ=OSQCreate(&(pQDesc->pvQEntries[0]), MAX_QUEUE_ENTRIES ); if( pQDesc->pQ != NULL ) {

return pQDesc;

}

}

return SYS_MBOX_NULL;

}

(2)发一条消息给”mbox”

const void * const pvNullPointer = 0xffffffff;

void sys_mbox_post(sys_mbox_t mbox, void *data)

{

INT8U err;

if( !data )

data = (void*)&pvNullPointer;

err= OSQPost( mbox->pQ, data);

}

在ucos中,如果OSQPost (OS_EVENT *pevent, void *msg)中的msg==NULL 会返回一条

OS_ERR_POST_NULL_PTR错误.而在lwip中会调用sys_mbox_post(mbox,NULL)发送一条空消息,我们在本函数中把NULL变成一个常量指针0xffffffff.

(3)从”mbox”中读取一条消息

#define SYS_ARCH_TIMEOUT 0xffffffff

void sys_mbox_fetch(sys_mbox_t mbox, void **msg)

{

u32_t time;

struct sys_timeouts *timeouts;

struct sys_timeout *tmptimeout;

sys_timeout_handler h;

void *arg;

again:

timeouts = sys_arch_timeouts();////返回当前任务定时事件链表起始指针

if (!timeouts || !timeouts->next) {//如果定时事件链表为空

sys_arch_mbox_fetch(mbox, msg, 0);//无超时等待消息

} else {

if (timeouts->next->time > 0) {

//如果超时事件链表不为空,而且第一个超时事件的time !=0

//带超时等待消息队列,超时时间等于超时事件链表中第一个超时事件的time,

time = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);

//在后面分析中可以看到sys_arch_mbox_fetch调用了ucos中的OSQPend系统调

//用从消息队列中读取消息.

//如果”mbox”消息队列不为空,任务立刻返回,否则任务进入阻塞态.

//需要重点说明的是sys_arch_mbox_fetch的返回值time:如果sys_arch_mbox_fetch //因为超时返回,time=SYS_ARCH_TIMEOUT,

//如果sys_arch_mbox_fetch因为收到消息而返回,

//time = 收到消息时刻的时间-执行sys_arch_mbox_fetch时刻的时间,单位是毫秒

//由于在ucos中任务调用OSQPend系统调用进入阻塞态,到收到消息重新开始执行

//这段时间没有记录下来,所以我们要简单修改ucos的源代码.(后面我们会看到).

} else {

//如果定时事件链表不为空,而且第一个定时事件的time ==0,表示该事件的定时//时间到

time = SYS_ARCH_TIMEOUT;

}

if (time == SYS_ARCH_TIMEOUT) {

//一个定时事件的定时时间到

tmptimeout = timeouts->next;

timeouts->next = tmptimeout->next;

h = tmptimeout->h;

arg = tmptimeout->arg;

memp_free(MEMP_SYS_TIMEOUT, tmptimeout);

//从内存中释放该定时事件,并执行该定时事件中的函数

if (h != NULL) {

h(arg);

}

//因为定时事件中的定时时间到或者是因为sys_arch_mbo_fetch超时到而执行到//这里,返回本函数开头重新等待mbox的消息

goto again;

} else {

//如果sys_arch_mbox_fetch无超时收到消息返回

//则刷新定时事件链表中定时事件的time值.

if (time <= timeouts->next->time) {

timeouts->next->time -= time;

} else {

timeouts->next->time = 0;

}

}

}

}

u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **data, u32_t timeout)

{

u32_t ucErr;

u16_t ucos_timeout;

//在 lwip中 ,timeout的单位是ms

// 在ucosII ,timeout 的单位是timer tick

ucos_timeout = 0;

if(timeout != 0){

ucos_timeout = (timeout )*( OS_TICKS_PER_SEC/1000);

if(ucos_timeout < 1)

ucos_timeout = 1;

else if(ucos_timeout > 65535)

ucos_timeout = 65535;

}

//如果data!=NULL就返回消息指针,

if(data != NULL){

*data = OSQPend( mbox->pQ, (u16_t)ucos_timeout, &ucErr );

}else{

OSQPend(mbox->pQ,(u16_t)ucos_timeout,&ucErr);

}

//这里修改了ucos中的OSQPend系统调用,

//原来的void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)

// err的返回值只有两种:收到消息就返回OS_NO_ERR,超时则返回OS_TIMEOUT

//这里先将err从8位数据改变成了16位数据 OSQPend(*pevent,timeout, INT16U *err) //重新定义了OS_TIMEOUT

//在ucos中原有#define OS_TIMEOUT 20

//改为 #define OS_TIMEOUT -1

//err返回值的意义也改变了,如果超时返回OS_TIMEOUT

// 如果收到消息,则返回OSTCBCur->OSTCBDly修改部分代码如下

//if (msg != (void *)0) { /* Did we get a message? */

// OSTCBCur->OSTCBMsg = (void *)0;

// OSTCBCur->OSTCBStat = OS_STAT_RDY;

// OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;

// *err = OSTCBCur->OSTCBDly;// zhangzs @2003.12.12

// OS_EXIT_CRITICAL();

// return (msg); /* Return message received */

// }

//关于ucos的OSTBCur->OSTCBDly的含义请查阅ucos的书籍

if( ucErr == OS_TIMEOUT ) {

timeout = SYS_ARCH_TIMEOUT;

} else {

if(*data == (void*)&pvNullPointer )

*data = NULL;

//单位转换,从ucos tick->ms

timeout = (ucos_timeout -ucErr)*(1000/ OS_TICKS_PER_SEC);

}

return timeout;

}

semaphone的实现和mbox类似,这里就不再重复了.

Xmodem协议详解以及源代码剖析

研究 Xmodem 协议必看的 11个问题 Xmodem 协议作为串口数据传输主要的方式之一,恐怕只有做过 bootloader 的才有机会接触一下, 网上有关该协议的内容要么是英语要么讲解不详细。笔者以前写 bootloader 时研究过 1k-Xmodem ,参考了不少相关资料。这里和大家交流一下我对 Xmodem 的理解,多多指教! 1. Xmodem 协议是什么? XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。分为标准Xmodem 和 1k-Xmodem 两种,前者以 128字节块的形式传输数据,后者字节块为 1k 即 1024字节,并且每个块都使用一个校验和过程来进行错误检测。在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节 (ACK。由于 Xmodem 需要对每个块都进行认可, 这将导致性能有所下降, 特别是延时比较长的场合, 这种协议显得效率更低。 除了 Xmodem ,还有 Ymodem , Zmodem 协议。他们的协议内容和 Xmodem 类似,不同的是 Ymodem 允许批处理文件传输,效率更高; Zmodem 则是改进的了Xmodem ,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。减少了通信量。 2. Xmodem 协议相关控制字符 SOH 0x01 STX 0x02 EOT 0x04 ACK 0x06 NAK 0x15

CAN 0x18 CTRLZ 0x1A 3.标准 Xmodem 协议(每个数据包含有 128字节数据帧格式 _______________________________________________________________ | SOH | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 | |_____|____________|___________________|__________|____________| 4. 1k-Xmodem (每个数据包含有 1024字节数据帧格式 _______________________________________________________________ | STX | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 | |_____|____________|___________________|__________|____________| 5.数据包说明 对于标准 Xmodem 协议来说,如果传送的文件不是 128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用 CTRL- Z(0x1A来填充。这里可能有人会问,如果我传送的是 bootloader 工程生成的 .bin 文件, mcu 收到后遇到0x1A 字符会怎么处理?其实如果传送的是文本文件,那么接收方对于接收的内容是很容易识别的,因为 CTRL-Z 不是前 128个 ascii 码, 不是通用可见字符, 如果是二进制文件, mcu 其实也不会把它当作代码来执行。哪怕是 excel 文件等,由于其内部会有些结构表示各个字段长度等,所以不会读取多余的填充字符。否则 Xmodem太弱了。对于 1k-Xmodem ,同上理。 6.如何启动传输?

LWIP协议栈的分析和设计

---《计算机网络与控制》论文 LWIP协议栈的分析

摘要 近些年来,随着互联网和通讯技术的迅猛发展,除了计算机之外,大量的嵌入式设备也需求接入网络。目前,互联网中使用的通讯协议基本是TCP/IP协议族,可运行于不同的网络上,本文研究的就是嵌入式TCP/IP协议栈LWIP。文章首先分析了LWIP的整体结构和协议栈的实现,再介绍协议栈的内存管理,最后讲解协议栈应用程序接口。 关键词: 嵌入式系统;协议;LWIP;以太网 Abstract With the rapid development of internet and communication technology, Not only computers but also embeded equipments are need to connect networks. At present, the basic communication protocol using in internet is TCP/IP, it can run in different network. This paper analyses the Light-Weight TCP/IP. The process model of a protocol implementation and processing of every layer are described first, and then gives the detailed management of Buffer and memory. At last, a reference lwIP API is given. Key words: Embedded System, Protocol, Light weight TCP/IP,Ethernet 引言

工作岗位研究原理与应用2018年1月真题

1 (单选题)在一定的时间内,企业中由特定人员所承担的一项或多项职责的集合称为() A、岗位 B、任务 C、职责 D、工作 正确答案:A 2 (单选题)在大量收集与工作相关信息的基础上,详细记录其中关键事件以及具体分析其岗位特征和要求的工作分析方法是() A、面谈法 B、问卷法 C、关键事件法 D、观察法 正确答案:C 3 (单选题)对于工作周期较长的工作适用的观察方法是() A、直接观察法 B、间接观察法 C、阶段观察法 D、工作表演法 正确答案:C 4 (单选题)在现有资料的基础上对每个工作岗位的职责、任务、权力、工作负荷与任职资格等进行系统性的分析、提炼和加工来获取工作信息的工作分析方法是() A、工作日志法 B、资料分析法 C、主管人员分析法 D、主题专家会议法 正确答案:B 5 (单选题)能够监控任职者所从事的工作,对目标工作的相关情况非常了解的主体是() A、工作分析专家 B、工作任职者 C、工作任职者的上级主管 D、组织高层领导 正确答案:C 6 (单选题)提取职位层次绩效考核指标的重要基础和依据是() A、工作概要 B、绩效标准 C、工作识别 D、工作职责 正确答案:B 7 (单选题)工作识别中最重要的项目是() A、工作名称 B、工作身份 C、工作编号 D、工作地点 正确答案:A 8 (单选题)将科学管理与人际关系方法结合起来的工作设计方法是() A、双因素理论 B、社会技术系统理论 C、跨学科理论

D、HP工作设计理论 正确答案:D 9 (单选题)我国的工作分析起源于() A、管理学研究 B、经济学研究 C、社会学研究 D、人事心理学研究 正确答案:D 10 (单选题)下列属于双因素理论中保健因素是() A、成长和发展机会 B、成就 C、增加的工作责任 D、人际关系 正确答案:D 11 (单选题)针对知识型员工的工作设计应遵循的理念是() A、以能为本 B、以知为本 C、以价为本 D、以物为本 正确答案:A 12 (单选题)工作评价是指对企事业单位各类岗位进行衡量的过程,衡量的是岗位之间的() A、责任大小 B、劳动强度 C、绝对价值 D、相对价值 正确答案:D 13 (单选题)根据各种工作的相对价值大小或对组织贡献的大小由高到低对其进行排列的一种工作评价方法是() A、排列法 B、分类法 C、评分法 D、因素比较法 正确答案:A 14 (单选题)利用现有的信息和资料,根据以往的经验,结合组织本身的特点来预测组织在中、短期内的人力资源需求的方法是() A、现状预测法 B、经验预测法 C、自上而下法 D、趋势分析法 正确答案:B 15 (单选题)人员预算实际就是企业的() A、招聘工作计划 B、工作分析计划 C、岗位分析计划 D、培训需求计划 正确答案:A 16 (单选题)设计员工培训方案的基础是() A、工作任务 B、工作评价

工作岗位研究原理与应用试题和答案自考

2012年1月高等教育自学考试工作岗位研究原理与应用试卷 (课程代码11468) 一、单项选择题(本大题共20小题,每小题1分,共20分) 1、为实现某一特定目的所从事的具体活动称为 A A.任务 B.职务 C.职权 D.职责 2、在一个组织内,岗位的功能越大,其能级就越 B A.复杂 B.高 C.简单 D.低 3、让有关人员以书面形式回答有关岗位问题的工作分析方法是 A A.问卷法 B.面谈法 C.关键事件法 D.观察法 4、最为普遍的确定关键事件的方法是 A A.工作会议 B.访谈法 C.问卷法 D.观察法 5、当我们把人视作经济人的时候,往往采用的工作分析方法是 C A.面谈法 B.问卷法 C.工作导向型分析系统 D.人员导向型分析系统 6、最容易接受工作分析活动的群体是 B A.高层经管人员 B.中层经管人员 C.工作分析人员 D.员工 7、工作分析的结果常常表现为有关工作流程与行为的 C A.工作调查 B.工作评价 C.工作描述 D.工作任务

8、岗位设置最基本的原则是 D A.系统化原则 B.最低岗位数量原则 C.因人设岗原则 D.因事设岗原则 9、工作设计的实质是 D A.工作任务变革 B.工作结构变革 C.工作职责变革 D.一场组织变革 10、胜任工作要求具备的主观条件称 C A.职责能力要求 B.知识要求 C.能力要求 D.经历要求 11、通过一定的方法来确定企业内部工作与工作之间的相对价值是 C A.工作分析 B.工作描述 C.工作评价 D.工作考核 12、岗位在工作过程中对任职者技术素质方面的要求是 B A.工作责任 B.工作技能 C.劳动强度 D.工作环境 13、美国联邦政府最初使用的工作评价方法是 B A.评分法 B.分类法 C.排列法 D.因素比较法 14、岗位分类的重要前提是 A.工作分析 B.工作评价 C.工作设计 D.工作调查 15、岗位分类总的原则是 A.以事为中心 B.以人为中心 C.以物为中心 D.以岗位为中心 16、对性质相同的每一个岗位,按其工作难易繁简程度、责任大小、岗位任务大小及岗位任职者所需具备的资料条件等因素进行评价,根据结果进行岗位分类的是 A.岗位纵向分类 B.岗位横向分类

lwip各层协议栈详解

竭诚为您提供优质文档/双击可除lwip各层协议栈详解 篇一:lwip协议栈源码分析 lwip源码分析 -----caoxw 1lwip的结构 lwip(lightweightinternetprotocol)的主要模块包括:配置模块、初始化模块、netif模块、mem(memp)模块、netarp模块、ip模块、udp模块、icmp模块、igmp模块、dhcp模块、tcp模块、snmp模块等。下面主要对我们需要关心的协议处理进行说明和梳理。配置模块: 配置模块通过各种宏定义的方式对系统、子模块进行了配置。比如,通过宏,配置了mem管理模块的参数。该配置模块还通过宏,配置了协议栈所支持的协议簇,通过宏定制的方式,决定了支持那些协议。主要的文件是opt.h。 初始化模块: 初始化模块入口的文件为tcpip.c,其初始化入口函数为: voidtcpip_init(void(*initfunc)(void*),void*arg)

该入口通过调用lwip_init()函数,初始化了所有的子模块,并启动了协议栈管理进程。同时,该函数还带有回调钩子及其参数。可以在需要的地方进行调用。 协议栈数据分发管理进程负责了输入报文的处理、超时处理、api函数以及回调的处理,原型如下: staticvoidtcpip_thread(void*arg) netif模块: netif模块为协议栈与底层驱动的接口模块,其将底层的一个网口设备描述成协议栈的一个接口设备(netinterface)。该模块的主要文件为netif.c。其通过链表的方式描述了系统中的所有网口设备。 netif的数据结构描述了网口的参数,包括ip地址、mac 地址、link状态、网口号、收发函数等等参数。一个网口设备的数据收发主要通过该结构进行。 mem(memp)模块: mem模块同一管理了协议栈使用的内容缓冲区,并管理pbuf结构以及报文的字段处理。主要的文件包括mem.c、memp.c、pbuf.c。 netarp模块: netarp模块是处理arp协议的模块,主要源文件为etharp.c。其主要入口函数为: err_tethernet_input(structpbuf*p,structnetif*netif)

LwIP协议栈源码详解

LwIP协议栈源码详解 ——TCP/IP协议的实现 Created by.. 老衲五木 at.. UESTC Contact me.. for_rest@https://www.sodocs.net/doc/c88161794.html, 540535649@https://www.sodocs.net/doc/c88161794.html,

前言 最近一个项目用到LwIP,恰好看到网上讨论的人比较多,所以有了写这篇学习笔记的冲动,一是为了打发点发呆的时间,二是为了吹过的那些NB。往往决定做一件事是简单的,而坚持做完这件事却是漫长曲折的,但终究还是写完了,时间开销大概为四个月,内存开销无法估计。。 这篇文章覆盖了LwIP协议大部分的内容,但是并不全面。它主要讲解了LwIP协议最重要也是最常被用到的部分,包括内存管理,底层网络接口管理,ARP层,IP层,TCP层,API 层等,这些部分是LwIP的典型应用中经常涉及到的。而LwIP协议的其他部分,包括UDP,DHCP,DNS,IGMP,SNMP,PPP等不具有使用共性的部分,这篇文档暂时未涉及。 原来文章是发在空间中的,每节每节依次更新,后来又改发为博客,再后来就干脆懒得发了。现在终于搞定,于是将所有文章汇总。绞尽脑汁的想写一段空前绝后,人见人爱的序言,但越写越觉得像是猫儿抓的一样。就这样,PS:由于本人文笔有限,情商又低,下里巴人一枚,所以文中的很多语句可能让您很纠结,您可以通过邮箱与我联系。共同探讨才是进步的关键。 最后,欢迎读者以任何方式使用与转载,但请保留作者相关信息,酱紫!码字。。。世界上最痛苦的事情莫过于此。。。 ——老衲五木

目录 1 移植综述------------------------------------------------------------------------------------------------------4 2 动态内存管理------------------------------------------------------------------------------------------------6 3 数据包pbuf--------------------------------------------------------------------------------------------------9 4 pbuf释放---------------------------------------------------------------------------------------------------13 5 网络接口结构-----------------------------------------------------------------------------------------------16 6 以太网数据接收--------------------------------------------------------------------------------------------20 7 ARP表-----------------------------------------------------------------------------------------------------23 8 ARP表查询-----------------------------------------------------------------------------------------------26 9 ARP层流程-----------------------------------------------------------------------------------------------28 10 IP层输入-------------------------------------------------------------------------------------------------31 11 IP分片重装1--------------------------------------------------------------------------------------------34 12 IP分片重装2--------------------------------------------------------------------------------------------37 13 ICMP处理-----------------------------------------------------------------------------------------------40 14 TCP建立与断开----------------------------------------------------------------------------------------43 15 TCP状态转换-------------------------------------------------------------------------------------------46 16 TCP控制块----------------------------------------------------------------------------------------------49 17 TCP建立流程-------------------------------------------------------------------------------------------53 18 TCP状态机----------------------------------------------------------------------------------------------56 19 TCP输入输出函数1-----------------------------------------------------------------------------------60 20 TCP输入输出函数2-----------------------------------------------------------------------------------63 21 TCP滑动窗口-------------------------------------------------------------------------------------------66 22 TCP超时与重传----------------------------------------------------------------------------------------69 23 TCP慢启动与拥塞避免-------------------------------------------------------------------------------73 24 TCP快速恢复重传和Nagle算法-------------------------------------------------------------------76 25 TCP坚持与保活定时器-------------------------------------------------------------------------------80 26 TCP定时器----------------------------------------------------------------------------------------------84 27 TCP终结与小结----------------------------------------------------------------------------------------88 28 API实现及相关数据结构-----------------------------------------------------------------------------91 29 API消息机制--------------------------------------------------------------------------------------------94 30 API函数及编程实例-----------------------------------------------------------------------------------97

lwip协议栈源码分析

LWIP源码分析 ----- caoxw 1 LWIP的结构 LWIP(Light weight internet protocol)的主要模块包括:配置模块、初始化模块、NetIf 模块、mem(memp)模块、netarp模块、ip模块、udp模块、icmp 模块、igmp模块、dhcp 模块、tcp模块、snmp模块等。下面主要对我们需要关心的协议处理进行说明和梳理。 配置模块: 配置模块通过各种宏定义的方式对系统、子模块进行了配置。比如,通过宏,配置了mem管理模块的参数。该配置模块还通过宏,配置了协议栈所支持的协议簇,通过宏定制的方式,决定了支持那些协议。主要的文件是opt.h。 初始化模块: 初始化模块入口的文件为tcpip.c,其初始化入口函数为: void tcpip_init(void (* initfunc)(void *), void *arg) 该入口通过调用lwip_init()函数,初始化了所有的子模块,并启动了协议栈管理进程。同时,该函数还带有回调钩子及其参数。可以在需要的地方进行调用。 协议栈数据分发管理进程负责了输入报文的处理、超时处理、API函数以及回调的处理,原型如下: static void tcpip_thread(void *arg) NetIf模块: Netif模块为协议栈与底层驱动的接口模块,其将底层的一个网口设备描述成协议栈的一个接口设备(net interface)。该模块的主要文件为netif.c。其通过链表的方式描述了系统中的所有网口设备。 Netif的数据结构描述了网口的参数,包括IP地址、MAC地址、link状态、网口号、收发函数等等参数。一个网口设备的数据收发主要通过该结构进行。 Mem(memp)模块: Mem模块同一管理了协议栈使用的内容缓冲区,并管理pbuf结构以及报文的字段处理。主要的文件包括mem.c、memp.c、pbuf.c。 netarp模块: netarp模块是处理arp协议的模块,主要源文件为etharp.c。其主要入口函数为: err_t ethernet_input(struct pbuf *p, struct netif *netif) 该入口函数通过判断输入报文p的协议类型来决定是按照arp协议进行处理还是将该报文提交到IP协议。如果报文是arp报文,该接口则调用etharp_arp_input,进行arp请求处理。 如果是ip报文,该接口就调用etharp_ip_input进行arp更新,并调用ip_input接口,将报文提交给ip层。 在该模块中,创建了设备的地址映射arp表,并提供地址映射关系查询接口。同时还提供了arp报文的发送接口。如下:

LwIP协议栈开发嵌入式网络的三种方法分析

LwIP协议栈开发嵌入式网络的三种方法分析 摘要轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中。本文结合μC/OS-II这一实时操作系统,以建立TCP服务器端通信为例,分析三种方法以及之间的关系,着重介绍基于raw API的应用程序设计。最后在ST公司STM32F107微处理器平台上验证,并给出了测试结果。 关键词LwIP协议栈;μC/OS-II;嵌入式网络;STM32F107; 随着嵌入式系统功能的多样化以及网络在各个领域的中的广泛应用,具备网络功能的嵌入式设备拥有更高的使用价值和更强的通用性。然而大部分嵌入式设备使用经济型处理器,受内存和速度限制,资源有限,不需要也不可能完整实现所有的TCP/IP协议,有时只需要满足实际需求就行。LwIP是由瑞典计算机科学研究院开发的轻量型TCP/IP协议栈,其特点是保持了以太网的基本功能,通过优化减少了对存储资源的占用。LwIP是免费、开源的,任何人可以使用,能够在裸机的环境下运行,当然设计的时候也考虑了将来的移植问题,可以很容易移植到多任务操作系统中。本文介绍了以ARM微处理器STM32F107和PHY接口DP83848为平台,构建的嵌入式系统中,采用LwIP和嵌入式操作系统μC/OS-II,使用协议栈提供的三种应用程序接口,实现嵌入式设备的网络通信功能。 1LwIP和μC/OS-II介绍 1.1 LwIP协议栈 LwIP协议是瑞士计算机科学院的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP含义是light weight(轻型)IP协议,在实现时保持了TCP协议的主要功能基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM 就可以运行,这使LwIP协议栈很适合在低端嵌入式系统中使用。 LwIP协议栈的设计才用分层结构的思想,每一个协议都作为一个模块来实现,提供一些与其它协议的接口函数。所有的TCP/IP协议栈都在一个进程当中,这样TCP/IP协议栈就和操作系统内核分开了。而应用程序既可以是单独的进程也可以驻留在TCP/IP进程中,它们之间利用ICP机制进行通讯。如果应用程序是单独的线程可以通过操作系统的邮箱、消息队列等,与协议栈进程通讯。如果应用程序驻留在协议栈进程中,则应用程序可以通过内部回调函数和协议栈进程通讯。 1.2 μC/OS-II实时操作系统 μC/OS-II是一个源码公开、可移植、可固化、可裁剪及占先式的实时多任务操作系统,是专门为嵌入式应用设计的实时操作系统内核,已广泛的应用在各种嵌入式系统中。 μC/OS-II是多任务系统,内核负责管理各个任务,每个任务都有其优先级,μC/OS-II 最多可以管理64个任务,其每个任务都拥有自己独立的堆栈。μC/OS-II提供了非常丰富的系统服务功能,比如信号量、消息邮箱、消息队列、事件标志、内存管理和时间管理等,这些功能可以帮助用户实现非常复杂的应用。 1.3 LwIP协议栈移植到μC/OS-II LwIP协议栈在设计的时候就考虑到了将来的移植问题,因此把所有与硬件、操作系统、编译器有关的部分都全部独立起来,形成了一个操作系统模拟层。操作系统模拟层用进程间的信号量、邮箱机制处理通信问题,而μC/OS-II是一个基于任务调度的嵌入式实时操作系

工作岗位研究原理与应用(简答与论述题)

工作分析理论与应用总复习重点(简答,论述) 1.工作分析的原则(P2) (1)系统原则(2)能级原则(3)标准化原则(4)最优化原则 2、工作权限分析(P3) 根据工作所需完成的任务,应对工作任职者的权限进行分析。根据责权对等的原则,核查任职者是否具备完 成工作任务所需的权限。 3、工作分析的内容。(P2-4) (1)工作职责分析。工作职责是确定任职资格的依据,是绩效评估的基础和对象,也是在招聘过程中评估应聘者能否胜任工作的基础。(2)工作流程分析;(3)工作权限分析;(4)工作关系分析;(5)工作环境 条件分析;(6)任职资格条件分析。 4、运用面谈法需要注意的问题(P16) (1)面谈法的成功关键在于面谈者之间的坦诚与信任。所以要尊重被询问者,接待要热情、态度要诚恳、讲话要注意方式方法。 (2)要提高面谈的效率必须与主管领导密切配合,找出最了解工作内容和最能客观描述自己职责的员工。 (3)面谈的场地环境要适合面谈,创造一种良好环境气氛,使面谈者感到轻松愉快,能够无拘无束地回答问题。(4)必须尽快和被询问者建立融洽的感情沟通和交流。 (5)运用面谈法收集信息需要提出很多问题,为了避免问题的遗漏、保证面谈的质量,在面谈之前应拟订一份详细的提问提纲。 (6)在面谈中应把握好提问的技巧。 (7)如果被询问者的工作职责比较多,则应要求他将各种职责分别列出,并按重要程序进行顺序排列。 (8)面谈结束后要将信息资料重新与任职者和主管核对一遍,并有针对性地做出适当的修改与补充。 5、工作分析有那几种方法?(P16) ①面谈法②问卷法③关键事件法④观察法⑤工作日志法⑥主管人员分析法⑦资料分析法⑧能力要求法 问卷的设计,一般有三种形式:开放式、封闭式、混合式,都是从更为工作分析的角度出发进行设计的。 开放式问卷,是一种只有问题而没有给出备选答案,需要由被调查者根据自己的判断来填写的问卷方式 封闭式问卷,是一种给出问题的各种备选答案,要求被调查者根据实际情况进行选择的问卷方式。 混合式问卷,是开放式与封闭式问卷的综合 6、在设计问卷时,应注意以下几点:(P19) 1 要根据工作分析的目的确定需要获得的岗位信息,将要收集的信息转换为问卷中的具体问题。 2 问题应有针对性,语言应清晰、简洁、易懂,必要时可附加说明。 3 问卷的具体项目可根据需要进行调整,内容可简可繁。 4 易于回答的问题防在前面,而难以回答的开放式的问题放在后面。 5 问题的排列要有一定的逻辑次序,如按时间先后、按从外部到内部、按从上级到下级等顺序排列。

《工作分析理论与应用》试卷及答案

工作岗位研究原理与应用 一、单项选择题 1、()是对职工所应承担任务的规定。 A、职务 B、责任 C、职责 D、岗位 2、()是严格按照编制员额和岗位的质量要求,为企业每个岗位配备合格的人员。 A、定编 B、定员 C、定额 D、岗位责任制 3、岗位研究中,采用的心理学研究方法有()。 A、测验法、观察法、评定量表法 B、测验法、面谈法、调查法 C、观察法、参与法、测验法 D、面谈法、观察法、参与法 4、美国工程师()是企业科学管理的主要倡导人,举世公认的“科学管理之父”。 A、弗兰克·吉尔·雷斯 B、泰勒C怀特D、迈克尔·朱修斯 5、工作日写实是对操作者整个工作日的工作时利用情况,按()的 顺序进行观察、记录和分析的一种方法。 A、时间消耗 B、工作的繁简程度 C、工作重要性的大小 D、技术操作 6、测时是以工序或某一作业为对象,按照操作顺序进行实地观察,记 录、测量和研究()的一种方法。 A、人力资源B工时消耗C、财力消耗D、体力消耗 7、工作抽样法是根据()的原理,对工作岗位随机地进行抽样调查 的一种方法。 A、微积分和概率论 B、测量学和统计学 C、概率论和数理统计学 D、数理统计学和微积分 8、()是对企业各类岗位的性质、任务、职责、劳动条件和环境以 及职工承担本岗位任务应具备的资格条件所进行系统分析和研究,并制定出岗位规范、工作说明书等人事文件的过程。 A、岗位调查 B、岗位分析 C、岗位评论价 D、岗位分类 9、()是通过调查者直接参与某一岗位的工作,从而细致、深入、 全面地体验、了解和分析岗位特征及岗位要求的方法。 A、面谈法 B、参与法 C、关键事件法 D、书面调查法 10、岗位分析的结果——工作说明书、岗位规范以及职务晋升图必须以 良好的()为基础,才能发挥其应有的作用。 A、岗位分类 B、岗位设计 C、岗位调查 D、岗位评价 11、()是把既可归为熟练工种又可归为技术工种的某些特殊工种, 先分别划岗归级,再根据这些工种在不同类型中的岗位等级,求出技术工种与熟练工种之间的统一岗级换算比例,然后归级。

具体工作岗位研究原理及应用单选及多选.doc

* 为实现某一特定目的所从事的具体活动称为()。――任务 * 由一名员工承担的各项任务组成的工作活动叫做()。――职责 * 在一定的时间内,企业中由特定人员所承担的一项或多项职责的集合叫做()。――岗位* 一组主要职责相近的岗位的集合叫做()。――工作 * 人们在社会中所从事的作为主要生活来源的工作叫做()。――职业 * 在一个组织内,岗位的功能越大,其能级就起()。――高 *企业中各个岗位功能的等级是()。――能级 *由若于既有区别又相互依存的要素所组成的,处于一定环境条件中并具有特定结构和功能 的有机整体称为()。――系统 * 企业中的成员为了完成某一特定的任务,需要做的一系列相关的工作是()。――工作流程* 人力资源管理的基础和前提是()。――工作分析 * 确定任职资格的依据是()。――工作职责 * 工作分析项目的确定依据是()。――工作分析的目的 * 对工作分析理论与方法的创立与初步发展起了巨大推动作用的是()。――泰勒 * 工作分析与工作评价制度首先在()领域得以推广应用。――工商企业 * 我国的工作分析起源于()。――人事心理学研究 * 通过与岗位任职者进行面对面的交谈而收集工作信息的一种方法叫()。――面谈法 * 让有关人员以书面形式回答有关工作岗位问题的工作分析方溘是()。――问卷法 *采用直接观察法进行工作分析时,调查者在()地方观察比较合适。――不引人注意的 *在大量收集工作信息的基础上,详细记录其中的关键事件,进而分析出岗位特征及要求的 方溘是()。――关键事件法 *面谈溘适用于()。――对文字理解有困难的人群 *工作分析人员直接到工作现场,针对特定对象的作业活动进行观察,收集、记录有关工作 信息,并进行分析和归纳总结的方法是()。――观察溘 *任职者按时间顺序详细记录自已的工作内容与工作过程,然后经过归纳,分析,实现工作 分析目的的方溘是()。――工作日志法 * 由主管人员在日常工作中记录与分析所管辖人员的工作任务、责任与要求的方溘是()。――主管人员分析法 *在现有资料的基础上对每个工作岗位的任务、责任、权力、工作负荷、任职资格等进行初 步分析,为进一步调查、分析奠定基础的方溘是()。――资料分析法 *设计问卷时,调查问卷中提问次序的安排,应遵循()问题放在前边的原则。――易于回 答的问题 *工作分析成败的关键是()。――科学的工作分析方法 *只有问题而没有给出备选答案,需要由被调查者根据自已的判断来填写的问卷方式属于 ()。――开放式 * 给出问题的各种备选答案,要求被调查者根据实际情况进行选择的问卷方式属于()。――封闭式 * 最为普遍的确定关键事件的方溘是()。――工作会议 .* 对于工作周期很长和突发事件较多的工作比较适合的观察方溘是()。――工作表演溘 * 海氏计划的信息核心是()。――岗位的性质和范围 * 将以工作为中心的要素和以人为中心的要素结合在一起的工作分析方溘是()。――职业分析清单溘 *职业分析清单法在()领域的应用非常有效。――评价培训需求 *当组织内的工作是高度结构的时候,往往采用的工作分析方法是()。――工作导向型分析

相关主题