Nucleus源码分析IOWord下载.docx
- 文档编号:19624190
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:11
- 大小:36.26KB
Nucleus源码分析IOWord下载.docx
《Nucleus源码分析IOWord下载.docx》由会员分享,可在线阅读,更多相关《Nucleus源码分析IOWord下载.docx(11页珍藏版)》请在冰豆网上搜索。
1.3文件信息3
数据结构3
程序分析6
1.4ioc.c程序6
1.4.1创建驱动6
1.4.2删除驱动7
1.4.3驱动程序操作请求8
1.4.4释放驱动8
1.4.5挂起驱动9
1.5ioce.c文件程序10
1.6iof.c程序11
1.7ioi.c程序11
概述
1.1功能描述
I/O设备管理组件负责所有的NucleasPLUS输入输出设备。
NucleasPLUSI/O提供标准的I/O设备接口:
初始化、分配、释放、输入输出、状态、终止。
该接口通过一个通用的数据结构来操作,使得应用程序以相似的或完全相同的方式处理不同的外围设备。
任务在等待一个外部设备时可以被挂起,I/O设备可以被用户动态创建和删除。
1.2实现原理
应用程序和驱动程序交流信息主要是通过一个叫做“操作请求结构NU_DRIVER_REQUEST”的数据结构来完成,应用程序事先把要请求的操作信息填入NU_DRIVER_REQUEST,然后再通过NU_Request_Driver函数把NU_DRIVER_REQUEST信息传递给驱动程序,驱动程序根据NU_DRIVER_REQUEST中的信息作相应的处理,包括有设备初始化、分配、释放、输入输出、状态、终止。
1.3文件信息
I/O组件(I/O)包括7个文件,每个文件命名如下:
文件名称
内容描述
IO_DEFS.H
定义IO组件特定的数据结构和常量。
IO_EXTR.H
定义IO组件的外部接口函数。
IOD.C
定义IO组件的全局数据结构。
IOI.C
IO组件的初始化代码
IOF.C
提供IO组件信息的函数
IOC.C
IO组件的核心函数,实现基本的输入输出
IOCE.C
具有外壳检测IOC.C中的函数
数据结构
驱动初始化结构:
structNU_INITIALIZE_STRUCT
{
VOID*nu_io_address;
/*IO寄存器基址*/
UNSIGNEDnu_logical_units;
/*逻辑单元数目*/
VOID*nu_memory;
/*内存指针*/
INTnu_vector;
/*设备所用的中断向量号*/
};
指派结构:
structNU_ASSIGN_STRUCT
UNSIGNEDnu_logical_unit;
INTnu_assign_info;
/*追加指派信息*/
释放结构:
structNU_RELEASE_STRUCT
INTnu_release_info;
/*追加释放信息*/
输入结构:
structNU_INPUT_STRUCT
UNSIGNEDnu_offset;
/*输入偏移量*/
UNSIGNEDnu_request_size;
/*请求输入数据量大小*/
UNSIGNEDnu_actual_size;
/*实际输入数据量大小*/
VOID*nu_buffer_ptr;
/*输入缓冲区指针*/
输出结构:
structNU_OUTPUT_STRUCT
/*输出偏移量*/
/*请求输出数据量大小*/
/*实际输出数据量大小*/
/*输出缓冲区指针*/
状态结构:
structNU_STATUS_STRUCT
VOID*nu_extra_status;
/*状态单元指针*/
终止结构:
structNU_TERMINATE_STRUCT
驱动请求结构:
typedefstructNU_DRIVER_REQUEST_STRUCT
INTnu_function;
/*请求功能*/
UNSIGNEDnu_timeout;
/*请求超时*/
STATUSnu_status;
/*请求状态*/
UNSIGNEDnu_supplemental;
/*补充信息*/
VOID*nu_supplemental_ptr;
/*补充信息指针*/
/*请求的数据结构类型联合.*/
unionNU_REQUEST_INFO_UNION
{
structNU_INITIALIZE_STRUCTnu_initialize;
structNU_ASSIGN_STRUCTnu_assign;
structNU_RELEASE_STRUCTnu_release;
structNU_INPUT_STRUCTnu_input;
structNU_OUTPUT_STRUCTnu_output;
structNU_STATUS_STRUCTnu_status;
structNU_TERMINATE_STRUCTnu_terminate;
}nu_request_info;
}NU_DRIVER_REQUEST;
驱动本身结构:
typedefstructNU_DRIVER_STRUCT
UNSIGNEDwords[NU_DRIVER_SIZE];
/*CS_NODE_STRUCT*/
CHARnu_driver_name[NU_MAX_NAME];
/*驱动名字*/
VOIDnu_info_ptr;
/*信息*/
UNSIGNEDnu_driver_id;
/*驱动内部ID*/
/*驱动入口函数*/
VOID(*nu_driver_entry)(structNU_DRIVER_STRUCT*,
NU_DRIVER_REQUEST*);
}NU_DRIVER;
全局数据:
IOD_Created_Drivers_List驱动控制块链表头指针
IOD_Total_Drivers总创建驱动数目。
IOD_List_ProtectIO组件的保护数据结构。
程序分析
1.4ioc.c程序
1.4.1创建驱动
原型:
STATUSIOC_Create_Driver(NU_DRIVER*driver,CHAR*name,
VOID(*driver_entry)(NU_DRIVER*,NU_DRIVER_REQUEST*))
功能:
创建一个驱动程序。
被调用:
应用程序、IOCE_Create_Driver函数。
调用:
CSC_Place_On_List链表节点加入
HIC_Make_History_Entry日志
TCT_Check_Stack堆栈检测
TCT_Protect数据保护
TCT_Unprotect解除保护
输入参数:
driver驱动控制块指针
name驱动程序名字
driver_entry驱动处理函数入口
函数执行步骤:
1)堆栈检测。
2)日志。
3)nu_driver_id初始化0。
4)传递参数。
5)进入数据保护。
6)修改nu_driver_id为IO_DRIVER_ID。
7)把驱动控制块植入系统链表。
8)系统驱动总数IOD_Total_Drivers加1。
9)退出保护。
10)返回。
1.4.2删除驱动
STATUSIOC_Delete_Driver(NU_DRIVER*driver)
删除一个驱动程序。
CSC_Remove_From_List链表节点删除
执行步骤:
3)进入数据保护状态。
4)nu_driver_id清0。
5)删除链表节点。
6)系统驱动总数IOD_Total_Drivers减1。
7)退出保护
8)返回。
1.4.3驱动程序操作请求
STATUSIOC_Request_Driver(NU_DRIVER*driver,NU_DRIVER_REQUEST*request)
向驱动发一个操作请求。
应用程序、IOCE_Request_Driver外壳函数。
HIC_Make_History_Entry日志
TCT_Check_Stack堆栈检测
request操作请求结构
3)调用驱动程序入口函数。
4)返回。
1.4.4释放驱动
STATUSIOC_Resume_Driver(NU_TASK*task)
释放挂起的驱动。
应用程序、IOCE_Resume_Driver外壳函数。
调用函数:
HIC_Make_History_Entry
TCC_Resume_Task
TCT_Control_To_System
TCT_Check_Stack
TCT_Get_Current_Protect
TCT_Set_Current_Protect
TCT_System_Protect
TCT_System_Unprotect
TCT_Unprotect
TCT_Unprotect_Specific
task需要释放的任务控制块指针
流程图:
1.4.5挂起驱动
STATUSIOC_Suspend_Driver(VOID(*terminate_routine)(VOID*),
VOID*information,UNSIGNEDtimeout)
挂起一个驱动程序。
应用程序、IOCE_Suspend_Driver外壳函数。
TCC_Suspend_Task
TCT_Current_Thread
TCT_Set_Suspend_Protect
terminate_routine终止、超时清理处理例程。
Information清理处理例程的信息指针。
Timeout挂起超时请求。
2)操作日志。
3)获得当前保护环境并保存到suspend_protect。
4)切换到系统保护TCT_System_Protect。
5)则释放最初的保护,设置挂起保护环境。
6)挂起调用驱动的任务(TCC_Suspend_Task)。
7)返回。
1.5ioce.c文件程序
函数:
STATUSIOCE_Create_Driver(NU_DRIVER*driver,CHAR*name,
驱动创建
STATUSIOCE_Delete_Driver(NU_DRIVER*driver)
驱动删除
STATUSIOCE_Request_Driver(NU_DRIVER*driver,NU_DRIVER_REQUEST*request)
向驱动发送一个请求。
STATUSIOCE_Resume_Driver(NU_TASK*task)
挂起访问驱动的一个任务。
STATUSIOCE_Suspend_Driver(VOID(*terminate_routine)(VOID*),
释放因访问驱动而挂起的任务。
1.6iof.c程序
UNSIGNEDIOF_Established_Drivers(VOID)
返回系统已创建的驱动数目。
UNSIGNEDIOF_Driver_Pointers(NU_DRIVER**pointer_list,
UNSIGNEDmaximum_pointers)
获得驱动处理函数指针列表
1.7ioi.c程序
VOIDIOI_Initialize(VOID)
初始化IO组件的全局变量。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Nucleus 源码 分析 IO