从一般意义上来说。组件(Component)是系统中能够明白辨识的组成部分,一个不透明的功能实现体。软件开发中,组件是对数据和方法的简单封装,它具有约定式规范的接口。组件具有面向对象的特征,具有功能独立性、高度的可重用性、与语言和平台无关性等特点。
软件组件是软件系统中具有一定意义的、相对独立的构成部分,是一个通过规定的接口提供一组服务代码的运行单元,这个运行单元的特点是高内聚、低偶合。
组件的接口和组件的实现相分离,调用者仅仅须要知道接口并訪问接口就能够使用组件。
接口相对固定,组件功能和实现的变化不应该引起接口的变化。软件组件是软件复用的关键技术。
组件技术是90年代初出现的一种软件开发技术,它是在结构化设计和面向对象技术的基础上发展起的,是面向对象技术之后的软件开发的标准方法系。是面向对象的开发技术的延伸。软件组件开发主要是开发与维护系统构造过程中用到的组件。
将软件组件作为一个单独的过程,目的是将组件作为构造软件的“零部件”。
有了组件的概念和组件技术。软件开发就能够借鉴建筑学和现代制造业中成功的实例,先构造出软件的整体架构。然后依据组件重用技术,在架构上依据须要组装上所需功能的组件,最后形成应用程序。
版本号更新仅仅须用新的组件替换旧组件就可以实现。而无须修改整个程序,也不须要对整个程序进行又一次编译。
Nucleus PLUS系统採用软件组件的形式构成以添加系统的代码清晰性、可靠性和可重用性,使系统模块化、易于维护。Nucleus PLUS由多个软件组件构成,每一个组件都有唯一的用途和特定的外部接口。每一个组件的使用通过这些接口的调用实现。而组件内部的数据结构绝大多数情况下都不能够被其它组件直接訪问。这样的组件架构使得Nucleus PLUS的每一个软件组件能够被轻松的替换和重用。
每一个软件组件都由两个头文件和若干个源文件组成,当中源文件大多用C语言写成,少数用汇编语言写成。
头文件里一个用于数据类型定义和常量声明,另外一个用于声明组件的外部接口。
下表是每一个组件文件的概述,组件不一定还包括表中全部的文件,当中XX标示组件名缩写。
在支持用户模式和管理模式的处理器架构上。Nucleus PLUS 内核和全部应用任务都执行在管理模式。
这样的做法实现简单、任务系统调用开销小,可是每一个任务都能訪问不论什么资源。
全部须要调用Nucleus PLUS系统服务或者使用Nucleus数据类型的用户代码源文件里都要包括头文件“NUCLEUS.h”。该文件包括数据类型、常量定义以及Nucleus PLUS服务的全部函数声明。其实。“NUCLEUS.h”中全部以“NU_”开头的函数实质上在Nucleus各组件源码中是不存在的。绝大多数Nucleus函数都有一个真正运行操作的函数(各组件中定义)和一个调用真正运行函数前对用户调用进行错误检查的“壳”函数。错误检查功能是能够停用的,不定义宏标示“NU_NO_ERROR_CHECKING”就可以。NU_NO_ERROR_CHECKING的定义与否决定”NU_“函数真正映射的组件函数。
Nucleus Plus 系统共16个组件,分别讨论例如以下(主要描写叙述组件的功能):
全部的Nucleus PLUS组件控制的控制数据结构採用的都是链表,CS即负责提供链接结构和链表操作函数,包含加入、删除节点。
负责初始化和启动Nucleus Plus 系统。初始化和启动过程包括两部分:详细硬件目标板依赖部分(处理器相关和板级初始化)先初始化,然后是Nucleus PLUS各组件和用户程序的初始化。
INT_Initialize 子程序在Nucleus PLUS 系统中是最先执行的。负责全部与目标硬件板相关的初始化。INT_Initialize 完毕后将控制权转移到高级Nucleus PLUS 初始化子程序INC_Initialize上并不再返回。INC_Initialize调用全部的Nucleus plus组件初始化函数、调用Application_Initialize创建用户任务等对象,最后将控制权交给调度函数TCT_schedule,系统启动完毕。初始化详细过程參见博文”Nucleus PLUS的启动、执行线程和中断处理“。
负责Nucleus Plus的抢占式实时任务和HISR的调度管理。
每一个用户应用由多个任务组成,一个任务就是具有特定目的的半独立程序片段,任务处于五种状态之中的一个--执行、就绪、挂起、终止、完毕。任务具有不同的优先级。高优先级任务可以抢占低优先级任务,同优先级任务依照进入”就绪状态“的顺序调度,优先级从0-255递减。
Nucleus PLUS每个任务都有一个控制结构体称为线程控制块Thread Control Block(TCB)-TC_TCB,任务支持动态的创建和删除,TC通过一个双向链表TCD_Created_Tasks_List管理全部的任务,全局变量TCD_Total_Tasks表示已创建的总任务数。
TCD_Priority_List是一个大小为256的TCB指针数组(数组大小与Nucleus PLUS优先级数同样),每一个数组指针是一个表的头部(某元素为空则表示没有该优先级的任务)。该表的元素是具有同样优先级的进入就绪状态的任务的TCB指针。即Nucleus PLUS维护一个指针数组来调度不同优先级的任务链表。
任务调度过程见博文”Nucleus PLUS任务调度“。
HISR是中断处理例程的下半部分,可以訪问绝大多数Nucleus PLUS任务(不可自己主动挂起)。HISR也是抢占式的。其优先级0-2递减。HISR由LISR激活。因此必须事先创建并注冊。
HISR的管理和任务的管理是类似的。每一个HISR都有一个控制结构TC_HCB和独占的堆栈。TCD_Created_HISRs_List是一个存储已创建HISR例程的双向链表的表头,TCD_Total_HISRs表示已创建的HISR总数。另外TC会维护两个已激活的HISR表,表项各自是三个优先级已激活的HISR双向链表的头和尾。TC还通过链表维护LISR例程,包含中断向量注冊和LISR入口函数。
TC组件提供了HISR的创建、删除、激活等函数。
负责管理全部的Nucleus Plus 定时器设备。
Nucleus Plus 的基本定时单元为一个Tick。它相当于一次硬件定时器中断。系统层面上,定时器用于任务管理-定时睡眠和唤醒等;用户应用程序层面,定时器用于那些须要有超时处理机制的地方。
定时器支持动态创建/删除,每一个定时器都有一个控制结构TM_TCB、TMD_HISR或TM_APP_TCB,分别用于系统任务定时器、HISR定时器和应用程序专用计时器。TM通过链表维护已创建的、已激活的定时器列表。
TM提供一个系统定时器TMD_System_Clock。
定时器函数包含创建、開始、停止、重置、删除、超时处理等。
负责管理Nucleus Plus 全部的邮箱服务。提供一种低开销的进程间通信机制。每一个邮箱包括一个长度为4个32-bit字的消息。
邮箱能够由用户动态创建/删除。支持任务的挂起和恢复。
每一个邮箱都有一个控制块Mailbox Control Block (MCB) MB_MCB,MB通过双向链表维护已创建的邮箱。
邮箱的任务挂起/唤醒支持FIFO顺序和任务优先级顺序进行。也是通过维护一个双向链表进行。每有一个任务挂起在邮箱上就会创建一个控制块MB_SUSPEND结构体。
MB提供了邮箱的创建、删除、消息发送/获取、重置、清空、广播等函数。
分别负责管理全部的Nucleus Plus 队列服务。管理全部的Nucleus Plus 管道服务。两部件的管理与MB是类似的,差别在于:队列的消息是一个或者多个32-bit字,管道的消息是一个或者多个8-bit字节。
负责管理全部的Nucleus Plus 信号量服务,用于多个任务间的同步。
信号量支持动态创建/删除,SM可提供的信号量计数范围是0-4,294,967,294。其管理与MB类似。
负责管理全部的Nucleus Plus 事件组服务,每一个事件组包括32个事件标示(event flag)。即32位无符号整型数的每一个位即是一个event flag(为1表示事件发生。0表示未发生)。
其管理与MB类似。
负责管理全部的Nucleus Plus 分区内存,分区内存的内存池指的是由用户指定的内存总数目固定、每一个分区(partition)的字节数也确定的内存。分区内存支持动态创建和任务的挂起/唤醒(FIFO或者任务优先级顺序)。
每一个分区内存都须要一个控制块Partition Memory Control Block (PCB)-PM_PCB(额外占领内存。不包括在分区内存内)。PM通过双向链表维护全部创建的分区内存。
每一个分区内存的可用分区由一个null结尾的单链表控制,每一个可用分区由头结构体PM_HEADER開始。
负责管理全部的Nucleus Plus 动态内存服务。动态内存池的起始位置和长度由用户指定,支持动态创建/删除和任务挂起/唤醒。动态内存的分配依照first fit算法分配,没有固定字节数的分区。DM的管理与PM类似。
负责管理全部的Nucleus Plus 输入/输出设备的驱动服务。提供了一种通用的、相似的s驱动服务接口,包含初始化、分配、释放、输入/输出、设备状态获取和服务申请终止等服务。
负责管理全部的Nucleus Plus 系统错误。
负责Nucleus Plus的历史设备管理。
负责Nucleus Plus的许可证管理。
负责Nucleus Plus 版本号管理。
版权声明:本文博客原创文章,博客,未经同意,不得转载。