Nucleus源码分析PipeWord下载.docx
《Nucleus源码分析PipeWord下载.docx》由会员分享,可在线阅读,更多相关《Nucleus源码分析PipeWord下载.docx(23页珍藏版)》请在冰豆网上搜索。
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;
/*紧急挂起链表*/
*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_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
NU_Pipe_Information
PIF_Pipe_Information
NU_Pipe_Pointers
PIF_Pipe_Pointers
PIC.C程序
函数原型:
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成功完成函数调用
实现流程:
STATUSPIC_Delete_Pipe(NU_PIPE*pipe_ptr)
删除管道并从已创建链表中移出
PICE_Delete_Pipe
CSC_Remove_From_List
TCT_System_Protect
TCC_Resume_Task
TCT_Control_To_System
TCT