Nucleus源码分析Pipe.docx

上传人:b****3 文档编号:2993015 上传时间:2022-11-16 格式:DOCX 页数:23 大小:346.62KB
下载 相关 举报
Nucleus源码分析Pipe.docx_第1页
第1页 / 共23页
Nucleus源码分析Pipe.docx_第2页
第2页 / 共23页
Nucleus源码分析Pipe.docx_第3页
第3页 / 共23页
Nucleus源码分析Pipe.docx_第4页
第4页 / 共23页
Nucleus源码分析Pipe.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

Nucleus源码分析Pipe.docx

《Nucleus源码分析Pipe.docx》由会员分享,可在线阅读,更多相关《Nucleus源码分析Pipe.docx(23页珍藏版)》请在冰豆网上搜索。

Nucleus源码分析Pipe.docx

Nucleus源码分析Pipe

 

Nucleus源码分析--Pipe模块

 

大唐微电子技术有限公司

邵壮

页数

修改后版本

修改者

修改日期

修改说明

备注

Documentinformation

FileLocation

D:

\××××\×××××××.doc(请说明在文档服务器上的位置)

Lastsaved

2005-1-610:

27

目录

1.概述3

1.1功能描述3

1.2文件信息3

2.实现原理4

2.1管道结构4

2.2管道管理4

2.3管道挂起管理4

2.4紧急挂起管理5

3.数据结构5

3.1PI_PCB管道控制块5

3.2PI_SUSPEND管道挂起控制块5

3.3模块变量(全局)6

4.程序分析6

4.1接口函数映射表6

4.2PIC.C程序6

4.2.1PIC_Create_Pipe6

4.2.2PIC_Delete_Pipe7

4.2.3PIC_Send_To_Pipe10

4.2.4PIC_Receive_From_Pipe11

4.2.5PIC_Cleanup14

4.3PIS.C程序15

4.3.1PIS_Reset_Pipe15

4.3.2PIS_Send_To_Front_Of_Pipe17

4.3.3PIS_Broadcast_To_Pipe18

4.4其它20

4.4.1PID.C20

4.4.2PII.C20

4.4.3PIF.C21

4.4.4PICE.C21

4.4.5PISE.C21

1.

概述

功能描述

管道提供了一种传输多种消息的机制。

发送消息请求将消息拷贝到管道中,接收消息请求从管道中将消息取出来。

消息即既可以放在管道的开头也可以放在管道尾。

管道消息包含一个或多个bytes。

既可以是固定长度的也可以是变长度的。

消息格式的类型在管道建立的时候设置。

变长消息管道需要在每条消息的开头添加额外32位字符。

此外接收变长消息管道的消息请求要声明最大消息尺寸,对定长消息请求声明实际消息尺寸。

管道消息收发服务提供三种挂起方式:

无条件被挂起、超时挂起和不被挂起。

任务被管道挂起有几种原因。

如果一个任务向一个空的管道请求消息,它就会被挂起。

此外,一个任务试图向一个满管道发送消息,它也会被挂起。

一旦管道可以满足挂起任务的要求,任务就将恢复运行。

例如,假设一个任务由于等待管道里的一个消息而被挂起,一旦消息到达管道以后,挂起的任务将会恢复。

  多个任务可能被同一个管道挂起。

任务按FIFO或Priority顺序被挂起,在管道建立的时候就设置好。

如果管道支持FIFO挂起,任务恢复的顺序与他们挂起的顺序一致。

如果管道支持优先级挂起,任务的恢复按照告优先级到低优先级的顺序。

管道消息可以被广播。

这种服务类似于发送请求,所有都在等待此管道消息的任务都将得到一个广播消息。

文件信息

管道组件(PI)包括9个文件,列表如下:

文件名称

内容描述

PI_DEFS.H

该文件定义PI组件特定的数据结构和常量

PI_EXTR.H

该文件定义PI组件的外部接口

PID.C

该文件定义PI组件的全局数据结构

PII.C

该文件包括PI组件的初始化代码

PIF.C

该文件包括提供PI组件信息的相关函数

PIC.C

该文件包括PI组件的核心函数

PIS.C

该文件包括PI组件的附加函数

PICE.C

该文件包括有错误检查的定义在PIC.C中的函数

PISE.C

该文件包括有错误检查的定义在PIS.C中的函数

2.实现原理

管道结构

管道内消息可为定长或变长,变长消息时消息前有一个32位字指示消息长度。

读指针pi_read指向第一个消息,写指针pi_write指向最后一个消息后。

其结构如下:

 

管道管理

应用程序在创建管道前应建立一个NU_PIPE类型的控制块,空间由应用程序提供。

所有已创建管道的控制块都将被加入由PID_Created_Pipes_List所指向的双向链表中,删除管道则将其从此双向链表中删除。

结构如下图所示:

模块变量PID_List_Protect用于保护对于此链表的多重访问。

管道挂起管理

当任务接收或发送消息至管道时,在任务栈内会形成一个局部管道挂起控制块,若因此次调用而挂起,则将该控制块加入此管道的挂起链表。

结构如下:

当需从挂起恢复时,遍历此链表即可。

紧急挂起管理

当任务发送消息至管道中已有消息前时(PIS_Send_To_Front_Of_Pipe),在任务栈内会形成一个局部管道挂起控制块,若因此次调用而挂起,则将该控制块加入此管道的紧急挂起链表。

当从管道中接收消息时,首先从此紧急链表中接收,保证发送的消息在已有消息前被接收。

 

3.数据结构

PI_PCB管道控制块

typedefstructPI_PCB_STRUCT

{

CS_NODEpi_created;/*已创建管道双向链表结点*/

UNSIGNEDpi_id;/*内部PCBID*/

CHARpi_name[NU_MAX_NAME];/*管道名称*/

DATA_ELEMENTpi_fixed_size;/*定长消息标志*/

DATA_ELEMENTpi_fifo_suspend;/*挂起类型标志*/

#ifPAD_2

DATA_ELEMENTpi_padding[PAD_2];

#endif

UNSIGNEDpi_pipe_size;/*总大小*/

UNSIGNEDpi_messages;/*消息数*/

UNSIGNEDpi_message_size;/*每消息大小*/

UNSIGNEDpi_available;/*空余字节数*/

BYTE_PTRpi_start;/*管道首*/

BYTE_PTRpi_end;/*管道末+1*/

BYTE_PTRpi_read;/*读指针*/

BYTE_PTRpi_write;/*写指针*/

UNSIGNEDpi_tasks_waiting;/*等待任务数*/

structPI_SUSPEND_STRUCT

*pi_urgent_list;/*紧急挂起链表*/

structPI_SUSPEND_STRUCT

*pi_suspension_list;/*挂起链表*/

}PI_PCB;

PI_SUSPEND管道挂起控制块

typedefstructPI_SUSPEND_STRUCT

{

CS_NODEpi_suspend_link;/*挂起列表结点*/

PI_PCB*pi_pipe;/*管道指针*/

TC_TCB*pi_suspended_task;/*挂起任务指针*/

BYTE_PTRpi_message_area;/*管道空间指针*/

UNSIGNEDpi_message_size;/*请求消息大小*/

UNSIGNEDpi_actual_size;/*消息实际大小*/

STATUSpi_return_status;/*返回的状态*/

}PI_SUSPEND;

模块变量(全局)

CS_NODE*PID_Created_Pipees_List;//已创建管道链表头指针

UNSIGNEDPID_Total_Pipees;//已创建管道数量

TC_PROTECTPID_List_Protect;//防止已创建管道链表被多重访问

4.程序分析

接口函数映射表

API函数

对应的内部函数

(NoErrorCheck)

对应的内部函数

(ErrorCheck)

NU_Create_Pipe

PIC_Create_Pipe

PICE_Create_Pipe

NU_Delete_Pipe

PIC_Delete_Pipe

PICE_Delete_Pipe

NU_Reset_Pipe

PIS_Reset_Pipe

PISE_Reset_Pipe

NU_Send_To_Front_Of_Pipe

PIS_Send_To_Front_Of_Pipe

PISE_Send_To_Front_Of_Pipe

NU_Send_To_Pipe

PIC_Send_To_Pipe

PICE_Send_To_Pipe

NU_Broadcast_To_Pipe

PIS_Broadcast_To_Pipe

PISE_Broadcast_To_Pipe

NU_Receive_From_Pipe

PIC_Receive_From_Pipe

PICE_Receive_From_Pipe

NU_Established_Pipes

PIF_Established_Pipes

PIF_Established_Pipes

NU_Pipe_Information

PIF_Pipe_Information

PIF_Pipe_Information

NU_Pipe_Pointers

PIF_Pipe_Pointers

PIF_Pipe_Pointers

PIC.C程序

PIC_Create_Pipe

函数原型:

STATUSPIC_Create_Pipe(NU_PIPE*pipe_ptr,CHAR*name,

VOID*start_address,UNSIGNEDpipe_size,

OPTIONmessage_type,UNSIGNEDmessage_size,

OPTIONsuspend_type)

功能描述:

创建管道

扇入函数:

Application

PICE_Create_Pipe

扇出函数:

CSC_Place_On_List

[HIC_Make_History_Entry]

[TCT_Check_Stack]

TCT_Protect

TCT_Unprotect

输入参数:

pipe_ptr管道控制块指针

name管道名字7个字符,以空字符结束

suspend_type挂起类型

start_address起始地址

pipe_size空间大小

message_type消息类型

message_size消息大小

suspend_type挂起类型

返回值:

NU_SUCCESS成功完成函数调用

实现流程:

PIC_Delete_Pipe

函数原型:

STATUSPIC_Delete_Pipe(NU_PIPE*pipe_ptr)

功能描述:

删除管道并从已创建链表中移出

扇入函数:

Application

PICE_Delete_Pipe

扇出函数:

CSC_Remove_From_List

[HIC_Make_History_Entry]

[TCT_Check_Stack]

TCT_Protect

TCT_System_Protect

TCT_Unprotect

TCC_Resume_Task

TCT_Control_To_System

TCT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1