(一)组件和软件组件方法学
1,软件组件(Software Component)的定义
从一般意义上来说,组件(Component)是系统中可以明确辨识的组成部分,一个不透明的功能实现体。软件开发中,组件是对数据和方法的简单封装,它具有约定式规范的接口。组件具有面向对象的特征,具有功能独立性、高度的可重用性、与语言和平台无关性等特点。软件组件是软件系统中具有一定意义的、相对独立的构成部分,是一个通过规定的接口提供一组服务代码的执行单元,这个执行单元的特点是高内聚、低偶合。组件的接口和组件的实现相分离,调用者只需要知道接口并访问接口就可以使用组件。接口相对固定,组件功能和实现的变化不应该引起接口的变化。软件组件是软件复用的关键技术。
2,软件组件方法学:
组件技术是90年代初出现的一种软件开发技术,它是在结构化设计和面向对象技术的基础上发展起的,是面向对象技术之后的软件开发的标准方法系,是面向对象的开发技术的延伸。软件组件开发主要是开发与维护系统构造过程中用到的组件。将软件组件作为一个单独的过程,目的是将组件作为构造软件的“零部件”。有了组件的概念和组件技术,软件开发就可以借鉴建筑学和现代制造业中成功的实例,先构造出软件的总体架构,然后根据组件重用技术,在架构上根据需要组装上所需功能的组件,最后形成应用程序。版本更新只须用新的组件替换旧组件即可实现,而无须改动整个程序,也不需要对整个程序进行重新编译。
(二)Nucleus PLUS系统架构
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的组件
Nucleus Plus 系统共16个组件,分别讨论如下(主要描述组件的功能):
1,通用服务组件Common Service Component(CS)
所有的Nucleus PLUS组件控制的控制数据结构采用的都是链表,CS即负责提供链接结构和链表操作函数,包括添加、删除节点。
2,初始化组件Initialization Component(IN)
负责初始化和启动Nucleus Plus 系统。初始化和启动过程包含两部分:具体硬件目标板依赖部分(处理器相关和板级初始化)先初始化,然后是Nucleus PLUS各组件和用户程序的初始化。
INT_Initialize 子程序在Nucleus PLUS 系统中是最先运行的,负责所有与目标硬件板相关的初始化。INT_Initialize 完成后将控制权转移到高级Nucleus PLUS 初始化子程序INC_Initialize上并不再返回。INC_Initialize调用所有的Nucleus plus组件初始化函数、调用Application_Initialize创建用户任务等对象,最后将控制权交给调度函数TCT_schedule,系统启动完毕。初始化具体过程参见博文”Nucleus
PLUS的启动、运行线程和中断处理“。
3,线程调度组件Tread Control Component(TC)
负责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的创建、删除、激活等函数。
4,时钟组件Timer Component(TM)
负责管理所有的Nucleus Plus 定时器设备。Nucleus Plus 的基本定时单元为一个Tick,它相当于一次硬件定时器中断。系统层面上,定时器用于任务管理-定时睡眠和唤醒等;用户应用程序层面,定时器用于那些需要有超时处理机制的地方。
定时器支持动态创建/删除,每个定时器都有一个控制结构TM_TCB、TMD_HISR或TM_APP_TCB,分别用于系统任务定时器、HISR定时器和应用程序专用计时器。TM通过链表维护已创建的、已激活的定时器列表。TM提供一个系统定时器TMD_System_Clock。
定时器函数包括创建、开始、停止、重置、删除、超时处理等。
5,邮箱组件Mailbox Component(MB)
下述Nucleus PLUS进程间通信机制邮箱、队列、管道、信号量和事件组详见博文”Nucleus进程间通信(IPC)方式“。
负责管理Nucleus Plus 所有的邮箱服务,提供一种低开销的进程间通信机制。每个邮箱包含一个长度为4个32-bit字的消息。邮箱可以由用户动态创建/删除,支持任务的挂起和恢复。
每个邮箱都有一个控制块Mailbox Control Block (MCB) MB_MCB,MB通过双向链表维护已创建的邮箱。邮箱的任务挂起/唤醒支持FIFO顺序和任务优先级顺序进行,也是通过维护一个双向链表进行,每有一个任务挂起在邮箱上就会创建一个控制块MB_SUSPEND结构体。
MB提供了邮箱的创建、删除、消息发送/获取、重置、清空、广播等函数。
6 队列组件Queue Component(QM)和7管道组件Pipe Component(PI)
分别负责管理所有的Nucleus Plus 队列服务,管理所有的Nucleus Plus 管道服务。两部件的管理与MB是类似的,区别在于:队列的消息是一个或者多个32-bit字,管道的消息是一个或者多个8-bit字节。
8,信号量组件Semaphore Component(SM)
负责管理所有的Nucleus Plus 信号量服务,用于多个任务间的同步。信号量支持动态创建/删除,SM可提供的信号量计数范围是0-4,294,967,294,其管理与MB类似。
9,事件组件Event Flag Component(EV)
负责管理所有的Nucleus Plus 事件组服务,每个事件组包含32个事件标示(event flag),即32位无符号整型数的每个位即是一个event flag(为1表示事件发生,0表示未发生)。其管理与MB类似。
10,存储分配组件Partition Memory Component(PM)
负责管理所有的Nucleus Plus 分区内存,分区内存的内存池指的是由用户指定的内存总数目固定、每个分区(partition)的字节数也确定的内存。分区内存支持动态创建和任务的挂起/唤醒(FIFO或者任务优先级顺序)。
每个分区内存都需要一个控制块Partition Memory Control Block (PCB)-PM_PCB(额外占据内存,不包含在分区内存内),PM通过双向链表维护所有创建的分区内存。每个分区内存的可用分区由一个null结尾的单链表控制,每个可用分区由头结构体PM_HEADER开始。
11,动态内存组件Dynamic Memory Component(DM)
负责管理所有的Nucleus Plus 动态内存服务,动态内存池的起始位置和长度由用户指定,支持动态创建/删除和任务挂起/唤醒。动态内存的分配按照first fit算法分配,没有固定字节数的分区。DM的管理与PM类似。
12,I/O驱动组件Iinput/Output Driver Component(I/O)
负责管理所有的Nucleus Plus 输入/输出设备的驱动服务,提供了一种通用的、相似的s驱动服务接口,包括初始化、分配、释放、输入/输出、设备状态获取和服务申请终止等服务。
13,错误处理组件Error Component(ER)
负责管理所有的Nucleus Plus 系统错误。
14,历史组件History Component(HI)
负责Nucleus Plus的历史设备管理。
15,许可证组件License Component (LI)
负责Nucleus Plus的许可证管理。
16,版本控制组件Release Component(RL)
负责Nucleus Plus 的版本管理。
Nucleus PLUS系统架构和组件,布布扣,bubuko.com