nucleus操作系统-实时内核介绍.txt

来自「MTK开发入门资料」· 文本 代码 · 共 171 行

TXT
171
字号

Nucleus操作系统-实时内核介绍
第二章 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_CHECKIN 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?