QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1279|回复: 0

Nucleus操作系统-实时内核介绍

[复制链接]
发表于 2004-9-7 19:49:40 | 显示全部楼层 |阅读模式
第二章  Nucleus PLUS内核介绍

2.1        Nucleus PLUS应用开发综述
2.1.1 开发调试环境
嵌入式实时应用程序的开发基于宿主机系统。IBM PC 和UNIX 工作站都是典型的宿主机系统。一般来说,应用程序都是运行在分离的计算机系统上被目标系统调用。然而,IBM PC系统并 不遵循上述规则,因为它既可以作为Nucleus PLUS 应用程序的主机,也可为目标机为其服务。运行在IBM PC系统 上的应用程序以EXE 文件的形式存在。
针对目标系统的调试软件通常包括ICE 仿真工具和TRM(目标仿真)工具。ICE仿真工具给工程师提供了完全控制和了解目标系统硬件状况的工具,特别是在校验新硬件时尤为有用。但是,考虑到开发工具成本问题和ICE时有的使用局限性,许多项目采用TRM调试。TRM 就是一个运行在目标系统(通常为ROM)上的小型的软件组件。TRM 提供包括下载、下断点和内存入口服务。ICE 和TRM 都有宿主系统控制。这通常由串口来完成。
2.1.2使用Nucleus PLUS
Nucleus PLUS被设计成C库的形式使用。使用内部应用程序软件的服务从Nucleus PLUS 库文件取出并且组合成应用程序目标文件来生成最终的映像文件。此映像文件可以下载到目标系统或是存放到目标系统ROM 中。
使用Nucleus PLUS 的步骤被描述成下列通用的方式:
1) 如果有必要,修改低级系统初始化文件,INT.S。注:这些文件通常以汇编语言形式交货并且它的的扩展是指定的开发工具。
2) 定义Application_Initialize 函数,Nucleus PLUS 启动系统时它优先运行。注意NUCLEUS.H 文件必须包含以至于能被Nucleus PLUS 服务调用。
3) 定义应用程序任务。如果用到Nucleus PLUS 服务,文件NULCUES.H 必须被包含。
4) 编译所有应用程序软件,包括低级系统初始化文件INT.s。
5) 用Nucleus PLUS 库和必要的开发工具库连接INT.a 和所有应用程序目标文件。
6) 下载应用程序映像文件到目标系统并运行。
2.1.3  初始化
INT_Initialize 程序在Nucleus PLUS 内核中是最先运行的程序。对大多数的目标环境而言,硬件复位向量必须包含在 INT_Initialize 地址中。INT_Initialize 程序主要负责所有与目标硬件相关的初始化,通常包括设置不同种类处理器的控制寄存器、中断向量表、全局C数据元素、Nucleus PLUS的一些变量以及系统的堆栈指针。当 INT_Initialize 程序执行完成后,控制权交给到Nucleus PLUS上一层初始化程序INC_Initialize,并且控制权不会再返回给 INT_Initialize 程序。
INC_Initialize 调用每一个Nucleus PLUS 组件的初始化程序进行初始化操作,在所有Nucleus PLUS初始化完成之后,它还调用用户提供的初始化程序Application_Initialize。
Application_Initialize 程序负责定义初始化应用环境,包括初始化应用任务、邮箱、队列、管道、信号量、事件集、内存池和其他Nucleus PLUS 对象。在Application_Initialize 返回后,INC_Initialize程序开始初始化任务调度表。具体过程如图一所示。


2.2 实现约定
Accelerated Technology(ATI)使用软件组件方法学。组件具有简单、清晰的优点,一个软件组件往往只包括几个C程序和汇编程序。并且,每一个软件组件都有特定的目的和提供给其他组件的外部接口,使得可以通过外部接口来方便的使用组件。在组件方法中,除了很少的特例外,一般不允许在组件外访问组件的全局数据结构。由于采用了组件方法学,Nucleus PLUS 具有代码清晰、模块化、可靠、可复用和易于维护的特点。
2.2.1  组件的组成
一个软件组件通常包含头文件、一个或多个C程序文件,有的还包括汇编程序文件。包含的文件的文件名满足如下的约定:
文件        含义
XX_DEF.H        定义组件的常量和数据类型
XX_ EXTR.H        定义组件的外部接口,以函数原型的形式定义
XXD.C        定义组件的静态和全局变量,除很少的特例外,一个组件的数据结构只能被本组件访问
XXI.C        定义组件的初始化函数
XXF.C        提供被组件管理的对象的信息
XXC.C        提供组件的核心函数
XXS.C        提供组件核心函数的错误处理外壳函数
XXS.C        组件的补充定义函数
XXSE.C        提供组件补充定义函数的错误处理外壳函数
2.2.2  命名规则
1、 组件命名
组件名字一般限于两个字符。组件名字作为构造组件的每个文件名的首两个字符。例如:
动态内存管理组件(Dynamic Memory Management Component)名字:DM,构成DM 的文件:
DM_DEFS.H
DM_EXTR.H
DMC.C
DMCE.C
DMI.C
DMF.C
DMD.C
2、 宏定义名字
宏名由下划线、大写字母和数字字符构成。最大支持长度为31 个字符。此外一个宏定义首3 个字符是CC_ ,其中“CC”与定义该宏的文件名的首2 个字符相同。例如:(对于EX_DEFS . H 文件)
#define EX_MY_CONSTANT 10
3、 结构体名字
结构体名字由下划线、大写字母和数字字符构成。最大支持长度为31 个字符。此外,一个结构体名的首3 个字符是CC_ ,其中“CC”与定义该结构体的文件名的首2 个字符相同。例如:(对于 EX_DEFS.H)
struct EX_MY_STRUCT
{
int ex_member_a;
int ex_member_b;
int ex_member_c;
};
4、typedef 名字
typedef 定义新结构体名字由下划线、大写字母和数字字符构成。最大支持长度为31个字符。此外,一个由typedef 定义新结构体名字的首3 个字符是CC_ ,其中“CC”与定义由typedef 命名结构体的文件名的首2 个字符相同。例如:(对于EX_DEFS.H 文件)
typedef struct EX_MY_STRUCT
{
int ex_member_a;
int ex_member_b;
int ex_member_c;
} EX_MY_TYPEDEF;
5、 结构体成员名字
结构体成员名字由下划线、大写字母和数字字符构成,最大支持长度为31 个字符。此外,一个结构体成员名字的首3 个字符是CC_ ,其中“cc”与包含该结构体定义的文件“cc_defs”的首2 个字符相同。例如:(对于EX_DEFS.H 文件)
struct EX_MY_STRUCT
{
int ex_member_a;
int ex_member_b;
int ex_member_c;
};
6、 全局变量名字
Nucleus PLUS 全局变量名由下划线以及紧跟着每个下划线的一个大写字母、小写字母、数字字符组成,最大支持长度为31 个字符。此外,一个全局变量名字的首3 个字符是CCC ,其中“CCC”与包含实际变量描述的文件“ccc.C”的首3 个字符相同。例如:(对于EXD.C 文件)
int EXD_Global_Integer;
7、 局部变量命名
局部变量名由小写字母、有可能是下划线或数字字符组成,最大支持长度为31 个字符。局部变量名字没有要求包含定义它们的文件的首3 个字符。例如:(对于EXD.C 文件)
/* Assume the following declaration is inside a function. */
int I;
8、 函数名字
Nucleus函数名字由下划线以及紧跟在下划线的一个大写字母、小写字母、数字组成,最大支持长度为31个字符。此外,一个函数名的首3个字符与包含该函数定义的文件名相同。例如:(对于EXD.C文件)
void EXD_My_Function(unsigned int i)
{


}

2.3  软件概述
2.3.1 基本用法
Nucleus PLUS 通常是以C语言库的形式实现的。实时Nucleus PLUS应用程序和Nucleus PLUS库链接在一起生成的目标文件可以被下载到目标板或者固化到ROM中。
NUCLEUS.LIB是典型的Nucleus PLUS库文件名。它由批处理文件PLUS.BAT运行产生,而且PLUS.BAT文件的内容依赖于所使用的开发工具。
1、 运行模式
在处理器结构中有管理模式和用户模式之分。由于Nucleus PLUS应用任务需要直接地调用需要调用特权指令的系统服务程序,所以Nucleus PLUS应用任务通常是在管理模式下运行。这样的实现方法减少了系统服务调用的开销而且便于实现。
2、 应用初始化
用户有责任提供自己的初始化程序Application_Initialize,该程序应创建任务、队列和其他系统初始化时需要的系统对象。如果应用程序不在系统运行时动态创建和删除系统对象,那么所有的系统对象都应该在Application_Initialize中被创建。用户的Application_Initialize程序一旦返回,多任务立即开始执行。在一些目标环境中,底层的系统初始化文件INT.S、INT.ASM或INT.SRC文件可能需要修改。这些文件初始化系统的定时中断、可用存储空间以及处理器或目标板的其他实体。
3、 头文件
    所有的用户代码在调用Nucleus PLUS服务或数据类型时,都必须包含NUCLEUS.H文件。该文件包含数据类型定义、常量定义和所有Nucleus PLUS服务函数的原型。不同的Nucleus PLUS移植系统,该文件是不同的。
2.3.2  数据类型
Nucleus PLUS在NUCLEUS.H文件中定义了标准的数据类型。这些数据类型保证了Nucleus PLUS能以相同的风格在不同的目标环境中运行。
Nucleus PLUS定义的数据类型如下:


数据类型        含义
UNSIGNED        32位无符号整数,常被定义为无符号长整型(unsigned long)的C数据类型
SIGNED        32位有符号整数,常被定义为有符号长整型(long)的C数据类型
IPTION        容易操作的最小的数据类型,常被定义为无符号字符型(unsigned char)的C数据类型
DATA_ELEMENT        和OPTION数据类型相同
UNSIGNED CHAR        8位无符号字符
CHAR        8位有符号字符
STATUS        等价于目标C编译器的有符号整数(int)
INT        整数数据类型,具有word大小
VOID        等价于目标C编译器的void数据类型(void)
UNSIGNED_PTR        指向UNSIGNED数据类型的指针
BYTE_PTR        指向UNSIGNED_CHAR数据类型的指针
2.3.3  系统服务映射关系
1、 错误检查
Nucleus PLUS的主包含文件NUCLEUS.H包含了和《Nucleus PLUS Reference Manual》里面定义的函数相匹配的函数的原型。然而,这些NU_*函数并不真是存在。对于绝大多数Nucleus PLUS函数,都有一个真正操作的函数,也有一个在调用真正执行操作函数前对用户调用进行错误检查的外壳函数。错误检查条件定义宏NU_ERROR_CHECKING定义和不定义时的具体的系统服务映射关系请参见附录(表格形式,Nucleus PLUS Internals文档中的表格)。
2、 条件编译
Nucleus PLUS源码有一定的条件编译选项。有一些是在应用程序编译时用到,而绝大多数时在Nucleus PLUS系统库编译时可用。
Nucleus系统库条件编译标识往往是在一个编译批处理文件中使用。这些条件编译选项控制各种Nucleus PLUS系统库特征。这些条件编译选项如下:
条件编译选项        含义
NU_ENABLE_HISTORY        运行在特定文件中保存历史记录。注意:仅形如**C.C的文件受该选项影响
NU_ENABLE_STACK_CHECK        运行在特定文件中的每个函数开始检查堆栈。注意:仅形如**C.C的文件受该选项影响
NU_ERROR_STRING        允许在一个致命系统错误发生时生成一个ASCII错误字符串。该标记适用ERD.C、ERI.C和ERC.C三个文件
NU_NO_ERROR_CHECKING        禁止在文件TMI.C中创建定时器HISR时使用错误检查外壳函数
NU_DEBUG        映射NUCLEUS.H中定义的数据结构到Nucleus PLUS中实际使用的内部数据结构。该选项允许用户直接检查所有的Nucleus PLUS的数据结构。所有的库文件和应用文件都可以使用或不使用该选项
NU_INLINE        通过in-line代码替换一些linked-list的处理过程来改善执行效率。该标记适用所有的**C.C或**S.C文件
另外,在扩展的条件编译标记中,有几个在NUCLEUS.H中定义了条件编译值。Nucleus PLUS不同的移植具有不同的值,并且不要轻易的去修改这些值。条件编译值定义如下:
条件编译值        含义
NU_POINTER_ACCESS        指定存取一个数据指针需要的存储器存取数,值为1表示允许内联优化;任何大于1的值指在防止中断的情况下使用函数来存取数据指针。
PAD_1        指定结构中单个字符后填充的字节数
PAD_2        指定结构中连续两个字符后填充的字节数
PAD_3        指定结构中连续三个字符后填充的字节数
R1, R2, R3, R4        用来替代“register”
当编译一个Nucleus PLUS应用程序时,可以通过在编译行定义NU_ERROR_CHECKING宏来禁止对通用系统服务的参数进行检查。这可以减少运行时间和减少代码大小。通过在编译时定义NU_DEBUG选项,定义在NUCLEUS.H中的应用程序数据结构能够直接映射到Nucleus PLUS内部数据结构。这允许用户直接在源码调试环境下检查每一个Nucleus PLUS内部数据结构。如果NU_DEBUG选项被使用,那么最好重新用NU_DEBUG选项编译所有的Nucleus PLUS源码。
2.3.4  目标环境依赖
与处理器和开发工具相关的Nucleus PLUS已经被分离到四个文件中。其中三个文件(INT.?、 TCT.?和TMT.?)一般用汇编语言编写,为目标环境提供基本的底层运行平台。另外一个文件是NUCLEUS.H,它直接或间接地被系统所有文件调用,该文件定义了各种数据类型和与处理器和开发工具相关的信息。
1、 初始化
文件INT.[S, ASM, 或SRC]负责提供底层的初始化和访问处理器中断向量表的服务,该文件还包含缺省中断处理程序。函数INT_Initialize是与特定的目标板相关的。例如,如果处理器不能产生内部定时中断,那么设置定时器就是板级相关的,这就意味着即使使用相同的处理器结构,INT可能也需要修改以适用不同的目标板。
2、 线程控制
文件TCT.[S, ASM, 或SRC]的主要功能是负责线程和系统的控制权转换。线程被定义为一个Nucleus PLUS任务或一个Nucleus PLUS HISR。该文件包含在任务和HISR中进行上下文切换、冲突保护处理和任务信号处理所必需的代码。
3、 定时管理
    文件TMT.[S, ASM, 或SRC]主要负责处理Nucleus PLUS的定时服务,包括定时器中断处理程序。在Nucleus PLUS绝大多数移植系统中,当没有定时器定时满时,中断处理程序都被设计成low-overhead(低开销)
4、 Nucleus PLUS包含文件
    所有的Nucleus PLUS源文件都直接或简介的包含NUCLEUS.H文件。要想在应用程序引用Nucleus PLUS系统服务或数据结构,都必须包含这个文件。该文件定义了各种数据类型、中断禁止/使能值、中断向量个数、系统控制块大小以及其他和目标板相关的信息。
2.3.5  版本控制
    Nucleus PLUS有几个不同的版本层。系统的版本信息定义在RLD.C文件中的ASCII字符串RLD_Release_String中。例如:
const CHAR  RLD_Release_String[] =
      "Copyright (c) 1993-2000 ATI - Nucleus PLUS - Version ARM 7/9  1.11.19";
Nucleus PLUS每一个文件也有版本信息,用来指示该文件的版本标记。在很多情况下,文件开头的版本信息和系统的版本信息不同。另外,文件里的函数在函数开头也有版本信息,用来指示该函数做了哪些改动以及它适用哪些Nucleus PLUS版本。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-27 11:26 , Processed in 0.094575 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表