RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems
第 1 节: 介绍
本章介绍了RTEMS开发环境,包括
*
RTEMS的目录结构,
*
GNU Make在 RTEMS 开发环境中的用法
*
示例应用
*
RTEMS特性工具
RTEMS被设计成一个可以重用的组件。像是RTEMS这样高度可重用的软件, 通常以原始码的形式典型地被分配,在分发的时候没有提供任何的软件支持工具。 RTEMS中包含了一个包括板支持包(BSP),设备驱动和支持库。RTEMS开发环境不是CASE工具,而是为了方便设计和维护而提供的工具集合。
RTEMS开发环境主要是用的是GNU的工具链。他包括编译程序,汇编程序,连接器。GNU工具链不但源代码开放,而且支持的处理器非常多,可以说没有GUN编译环境,就没有开源世界的今天。
所以,为了使用好RTEMS,必须熟悉GNU的开发环境(哈哈,地球人都知道)。RTEMS的程序模块性非常强,而且所有的代码根据功能分别存放在不同的目录中。不同硬件体系的代码放在不同的目录下,能有效的系统的消除硬件依赖,使系统的移植能力更强。
1.1: 硬件相关源代码
硬件相关包括处理器相关和目标硬件板BSP相关。处理器相关的代码主要是线程上下文切换和中断处理子程序。RTEMS支持的处理器类别可以在 cpukit/score/cpu目录下找到。如果需要将RTEMS移植到新的处理器上面,可以参考no_cpu目录,该目录有处理器相关代码的原型。
处理器相关又可以细分为不同的子类。例如ARM处理器就可以分为ARM7系列和ARM9等系列。这不同系列存在一些差异,移植的时候必须将这些因素考虑进去。
与硬件的源文件包括:
*
处理器相关的文件
*
文件板相关的文件
*
外围设备相关的文件
*
文件的相关问题
*
CPU相关的执行文件
*
CPU相关的支持文件
*
板支持包结构
RTEMS通过将系统分为多个层来提高系统的可移植性,同时也增加了系统软件的可复用性。RTEMS系统中大多数软件模块都可以在不同的硬件系统上面运行。RTEMS中,和硬件相关的代码分为下面几类:
*
处理器相关
*
目标板相关
*
外围设备相关
RTEMS中源代码按照功能和硬件依赖关系组织在不同目录里面,如果程序员需要为自己的硬件设备上移植RTEMS,就需要熟悉这些文件的存放规则。
第 2 章: 目录结构
随着系统的发展,RTEMS的目录结构在各个版本中也有了不少的变化,但是通常来说,目录设计符合下列的需求:
*
鼓励程序的模块化,组件化
*
将RTOS与目标硬件部分隔离,提高复用
*
允许多个RTEMS同时为不同的硬件平台产生目标代码而不产生冲突
*
生成的目标代码以及中间代码(obj文件)会根据硬件体系不同存放在不同位置,这样不同交叉编译器产生的中间代码不会弄混淆。
同时,根据不同硬件BSP存放目标文件还有一个好处,比如同一个处理器的两块电路板,一个有64kb的RAM,另一个有1Mb的RAM,那么在第一个系统中,内存的优化就很重要,需要注意字节的对齐以及在内存中的排列,而第二个系统对这些因素不必考虑得太多。在RTEMS中,可以方便的实现这样的需求。
处理器相关的代码主要是线程上下文切换和中断处理子程序。RTEMS支持的处理器类别可以在cpukit/score/cpu目录下找到。如果需要将RTEMS移植到新的处理器上面,可以参考no_cpu目录,该目录有处理器相关代码的原型。
处理器相关又可以细分为不同的子类。例如ARM处理器就可以分为ARM7系列和ARM9等系列。这不同系列存在一些差异,移植的时候必须将这些因素考虑进去。
RTEMS 源代码被组织成下面的部分:
功能性组件,
目标处理器(例如ARM系列,MPC系列),
目标处理器模型(例如ARM中的ARM7TDMI,ARM920T等),
外围设备以及目标板
下面将考察源代码的目录结构,为了方便,将目录树的根记为
${RTEMS_ROOT} 。
rtems- 版本 ( 如 4.6.2)
|
+--------+-------+---------+---------+---------+---------+-------+------+
| | | | | | | | |
aclocal automake c contrib cpukit doc make scripts tools
${RTEMS_ROOT}/aclocal/
该目录存放了 autoconf 使用的 M4 宏。 autoconf 解释 configure.ac 文件 , 这些文件在定制、剪裁 RTEMS、为不同硬件体系产生不同目标文件这一系列过程中起着重大作用。
${RTEMS_ROOT}/automake/
该目录包含automake使用的脚本,他们用来创建Makefile.am。
${RTEMS_ROOT}/c/
该目录存放的文件是必须根据不同硬件结构剪裁的BSP,这个目录下面还有很多子目录,将在下一节讨论。
${RTEMS_ROOT}/contrib/
该目录存放了Cygwin和Solaris平台下的交叉编译器相关的资料和文件。
${RTEMS_ROOT}/cpukit/
该目录是RTEMS的库文件(例如C语言库libc.a)以及硬件无关的操作系统核心源代码。该目录将在后面详细说明。
${RTEMS_ROOT}/doc/
存放 TeXinfo 和 HTML 格式的文档
${RTEMS_ROOT}/make/
Makefile 的配置文件 , 例如 make/custom 子目录中每个 .cfg 文件都对应了一个 BSP 的配置 , 包括处理器模式、编译选项等。这些配置在BSP章节中会有说明。
${RTEMS_ROOT}/scripts/
该目录存放了 RPM 包的说明 , 每个 RPM 包占用一个子目录 , 包括 binutils/ 、 gcc3newlib/ 、 gdb/ 等。
${RTEMS_ROOT}/tools/
该目录包含 RTEMS 专用的一些工具。这些工具有目标硬件相关的,也有用来升级RTEMS源代码的。
5.2.1: c/目录
${RTEMS_ROOT}/ c/ 目录从前是所有 RTEMS 代码的根目录。现在,它包含了和目标CPU以及周边硬件相关的代码,如BSP等。该目录包含下列的子目录:
${RTEMS_ROOT}/c/src/
该目录是和嵌入式处理器以及目标板相关的代码。他是BSP以及对应的测试码的根目录。
${RTEMS_ROOT}/c/make/
该目录是用来产生target.cfg文件。这些文件让各种不同的Makefile 变量,这样能方便的将RTEMS代码剪裁以适应目标处理器和BSP 。
5.2.1.1: c/src/目录
c/src/lib/ libbsp目录是处理器模型和BSP代码的根目录。他包含如下的子目录。
${RTEMS_ROOT}/c/src/ada-test/
该目录为包含了ada API的测试代码。
${RTEMS_ROOT}/c/src/lib/
该目录包含目录 libbsp 和 libcpu两个子目录。这两个目录分被对应了板支持包 (BSP)和处理器结构相关的源代码。 libbsp根据嵌入式处理器的种类和BSP来组织目录。libcpu则存放了不同嵌入式处理器相关的代码。
${RTEMS_ROOT}/c/src/libchip/
该目录存放了各种不同的外围设备芯片的驱动。包括串口、网路芯片、时钟等多种驱动。
${RTEMS_ROOT}/c/src/libmisc/
该目录包含了一些不容易归类的RTEMS的常用工具。例如shell,单调周期任务监视程序,/dev/null设备驱动,栈溢出检查程序, ROM监视器等等。
${RTEMS_ROOT}/c/src/libnetworking/
该目录包含网络代码分量。包括了RTEMS telnetd , httpd 和 ftpd 服务器,这些代码需要根据对应的BSP剪裁与配置。
${RTEMS_ROOT}/c/src/librdbg/
该目录包含以以太网为基础的远程调试接口。该软件一定要和处理器以及BSP配合使用。
${RTEMS_ROOT}/c/src/librtems++/
该目录包含 RTEMS API 的 C++ 封装。
${RTEMS_ROOT}/c/src/make/
不同 API, 系统组件的测试程序源代码。
${RTEMS_ROOT}/c/src/optman/
可选的 RTEMS API 的桩模块。该目录中所有的 API 实现都返回 E_NOTCONFIGURED 。
${RTEMS_ROOT}/c/src/test/
该目录为各种不同的API和支持库提供的测试程序。
${RTEMS_ROOT}/c/src/wrapup/
该目录负责将所有的RTEMS组件以及API捆绑成单一的RTEMS 库 librtemsbsp.a。 该库包含所有的 BSP 和处理器特性。
5.2.1.1.1: c/src/lib/libbsp BSP 目录
" libbsp" 包含了RTEMS为不同嵌入式处理器家族建立的目录。每个目录下为该处理器家族的中不同的处理器都建立了单独的目录。
" libbsp" 目录中是RTEMS能提供的所有的稳定BSPs。每种BSP又分成若干的子目录。 " shmdr" 子目录中是为多处理系统提供的共享内存驱动程序。此外两个目录为新的BSP设计提供了样板。" no_cpu" 提供了新处理器家族的BSP模板。此外是 “ bare ” 目录,他提供了一个最简单的BSP模板。
每种BSP一般都包含了 "clock", "console", "include", "shmsupp", "startup", 和 "timer" 这样几个目录。如下所示:
Each BSP
|
+-----------+-----------+---------+-------------+----------+----------+
| | | | | | |
clock console include shm supp startup timer
5.2.1.2: c/src/tests/ Test 目录
该目录提供所有的 RTEMS 组件的测试程序 , 这些测试程序可以作为程序写作的样本。包含下面的子目录。
${RTEMS_ROOT}/c/src/test/itrontests/
itron API 测试程序。
${RTEMS_ROOT}/c/src/test/libtests/
各种 RTEMS 库的测试
${RTEMS_ROOT}/c/src/test/mptests/
多处理器支持测试。${RTEMS_ROOT}/c/src/测试/psxtests/
该目录为 RTEMS POSIX 美国石油协会包含测试套件。
${RTEMS_ROOT}/c/src/test/psxtests/
RTEMS POSIX API测试代码
${RTEMS_ROOT}/c/src/tests/samples/
该目录提供了一些RTEMS的标准测试程序,一般用测试新移植好的RTEMS。
${RTEMS_ROOT}/c/src/test/sptests/
该目录提供RTEMS标准API的测试程序。他提供了大部分SuperCore模块的测试代码。
${RTEMS_ROOT}/c/src/test/support/
该目录为各种测试提供了一些支持文件。
${RTEMS_ROOT}/c/src/test/tmitrontests/
RTEMS ITRON API 的执行时间测试代码。
${RTEMS_ROOT}/c/src/test/tmtests/
RTEMS 标准 API 的执行时间测试代码。 这些测试代码提供了SuperCore 执行的时间性能指标。这些指标对于系统规划和优化将非常重要能够。
${RTEMS_ROOT}/c/src/test/tool/
测试使用到的工具, difftest用于比较测试结果。
5.2.2: CPUKit目录
cpukit/ 目录包含一组包含源的子目录。这些代码是构成RTEMS目标可执行文件以及可移植性库(例如C库)的关键源代码。 (我不知道为什么RTEMS将他的关键代码放在这个目录下面,开始的确让我很不习惯)
下面是cpukit/中各个目录的包含代码的描述
${RTEMS_ROOT}/cpukit/aclocal/
该目录包含了配置目标代码的并且生成Makefile文件的M4宏脚本。
${RTEMS_ROOT}/cpukit/ada/
Ada API 的实现代码。
${RTEMS_ROOT}/cpukit/automake/
该目录包含 Makefile 文件的 .am 文件 , 脚本语言使用该目录下的文件产生 Makefile
${RTEMS_ROOT}/cpukit/include/
RTEMS内核代码的头文件。
${RTEMS_ROOT}/cpukit/itron/
ITRON API的实现代码。
${RTEMS_ROOT}/cpukit/libblock/
使用块设备(硬盘、CD_ROM等)所需的库文件实现代码。
${RTEMS_ROOT}/cpukit/libcsupport/
线程安全的C语言库。同时能提供类是UNIX系统调用(例如open,chdir等)的实现。
${RTEMS_ROOT}/cpukit/libfs/
文件系统的实现代码,包括IMFS、miniIMFS、FAT等。 ${RTEMS_ROOT}/cpukit/libnetworking/
BSD的TCP/IP代码的实现。
${RTEMS_ROOT}/cpukit/librpc/
该目录包含对 RTEMS 的 FreeBSD RPC/ XDR 源代码。
${RTEMS_ROOT}/cpukit/posix/
POSIX API 的的 RTEMS 实现。
${RTEMS_ROOT}/cpukit/rtems/
RTEMS标准API的实现。
${RTEMS_ROOT}/cpukit/sapi/
RTEMS系统服务实现代码。
${RTEMS_ROOT}/cpukit/score/
RTEMS 的 " SueperCore" 。他是RTEMS的核心和精华,所有的API(RTEMS C/C++ API、POSIX API、ITRON API等)和其他组件都是构建在score上面的。在他下面又有几个子目录,其中CPU目录包含了目标处理器相关的底层代码
${RTEMS_ROOT}/cpukit/wrapup/
将用户需要的库文件打包成单一的RTEMS库 librtemscpu.a。 该库包含所有的目标嵌入式处理器模块与BSP。
Sample目录与tools目录
5.3.1: ${RTEMS_ROOT}/c/src/tests/samples/ 目录
该目录包含了RTEMS的范例代码。
Hello World ${RTEMS_ROOT}/c/src/test/sample/ hello/ 这个就不用说了吧,不过该代码作为测试BSP的
时钟 ${RTEMS_ROOT}/ c/src/tests/samples/ticker 测试BSPs 时钟设备驱动的代码。
基本单处理器测试 ${RTEMS_ROOT}/c/src/test/sample/base_sp/ 单处理器测试代码 多处理器测试
${RTEMS_ROOT}/c/src/test/sample/base_mp/. 测试MPCI的代码。MPCI是RTEMS多处理器处理处理代码。
${RTEMS_ROOT}/c/src/tests/samples/cdtest/ C++的构造函数和析构函数测试代码。 浮点运算库测试
${RTEMS_ROOT}/c/src/tests/samples/paranoia/ 可测试处理器浮点运算器以及浮点库。 最小系统测试
${RTEMS_ROOT}/c/src/src/samples/minimum/ 包含了一个REMS最小系统的示例代码。 无限对象分配
${RTEMS_ROOT}/c/src/tests/samples/unlimited/ 动态分配无限多个对象的示例 网络Loopback 测试
${RTEMS_ROOT}/c/src/tests/samples/loopback/ 使用网络套接字的简单例子。
其他 RTEMS 工具
packhex 压缩 hex 格式文件的工具
Unhex 将 hex 格式文件变成 bin 格式
size_rtems 测试 RTEMS 系统运行是对 ROM 和 RAM 的需求。可以提供 RTEMS 中各个组件占用的系统资源
RTEMS专有数据结构
摘要
本节介绍RTEMS专用的数据结构,这些结构能帮助读者尽快对RTEMS有个全面的了解。
rtems_address
用于 处理地址的数据结构,相当于void *
rtems_asr
RTEMS异步处理例程ASR(asynchronous signal routine) 数据类型。
rtems_asr_entry
RTEMS异步处理程ASR的 入囗地址。
rtems_attribute
RTEMS 对象的属性。用在对象创建例程中 , 叙述新建对象的特性。
rtems_boolean
RTEMS 中的布尔值
rtems_context
和嵌入式处理器体系结构相关的进程上下文数据结构。包含了进程切换时需要保存的整形寄存器信息。
rtems_context_fp
和 rtems_context结构相似, 不同点在于包含的信息是进程切换时需要保存的浮点寄存器信息。
rtems_device_driver
RTEMS驱动程序例程返回值的数据结构
rtems_device_driver_entry
RTEMS 驱动程序例程的入囗
rtems_device_major_number
设备主设备号
rtems_device_minor_number
设备的从设备号
rtems_double
符合在目标硬件上的双倍精度浮点数据类型
rtems_event_set
外部事件的逻辑集合 , 用于事件管理器管理 RTEMS 事件
rtems_extension
RTEMS 用户扩展例程返回值的数据类型
rtems_fatal_extension
不可恢复异常错误处理例程入囗
rtems_id
RTEMS 对象的标示符
rtems_interrupt_frame
中断处理例程 ISR(Interrupt Service Routine) 使用到栈帧 ( Stack Frame) 的数据结构。对于不支持栈帧的处理器,对应的数据结构无效。
rtems_interrupt_level
被 rtems_interrupt_disable, rtems_interrupt_enable 和 rtems_interrupt_flash 例程使用的数据结构。 该数据类型和中处理中断的中断掩码相关
rtems_interval
处理时间间隔数据类型。
rtems_isr
RTEMS ISR 例程的返回值类型。
rtems_isr_entry
RTEMS ISR 例程的入囗地址
rtems_mp_packet_classes
枚举型数据结构,用来叙述多进程处理使用的消息
rtems_mode
操纵 RTEMS 任务执行模式使用到的数据类型
rtems_mpci_entry
RTEMS多处理器通信接口MPCI(Multiprocessor Communications Interface) 例程返回值的数据类型
rtems_mpci_get_packet_entry
MPCI 中消息包获取例程的入囗的地址
rtems_mpci_initialization_entry
MPCI 中初始化例程的入囗地址
rtems_mpci_receive_packet_entry
MPCI 中接收消息包例程的入口。
rtems_mpci_return_packet_entry
MPCI 中返回消息包例程的入囗地址
rtems_mpci_send_packet_entry
MPCI 中发送消息包例程的入囗地址
rtems_mpci_table
MPCI配置信息的数据结构
rtems_option
例程的运行参数,方便函数的调用者对程序的运行作控制。例如控制当错误发生的时候,函数是立刻返回还是被阻塞
rtems_packet_prefix
多处理器系统中传递的消息的第一个字节。通常包含了 MPCI中需要使用的例程信息
rtems_signal_set
信号管理器处理RTEMS信号使用的数据类型。
rtems_signed8
8位的有符号数
rtems_signed16
16位的有符号数
rtems_signed32
32位的有符号数
rtems_signed64
64位的有符号数
rtems_single
单精度浮点数
rtems_status_codes
RTEMS任务的返回数据类型
rtems_task
RTEMS 任务的数据类型
rtems_task_argument
是被传给每个 RTEMS 任务的函数中的独立变数的数据结构
rtems_task_begin_extension
定义任务的入口,该任务开始用户扩展句柄例程
rtems_task_create_extension
定义任务的入口,该任务创建用户扩展句柄例程
rtems_task_delete_extension
定义任务的入口,该任务销毁用户扩展句柄例程
rtems_task_entry
RTEMS ASR例程的入口
rtems_task_exitted_extension
定义任务的入口,该任务退出用户扩展句柄例程
rtems_task_priority
处理任务优先级的数据结构
rtems_task_restart_extension
定义任务的入口,该任务重新开始用户扩展句柄例程
rtems_task_start_extension
定义任务的入口,该任务启动用户扩展句柄例程
rtems_task_switch_extension
定义任务的入口,该任务开始用户扩展句柄例程的任务切换
rtems_tcb
RTEMS的任务控制块
rtems_time_of_day
在RTEMS中处理时间
rtems_timer_service_routine
RTEMS计时器服务例程的返回值使用的类型
rtems_timer_service_routine_entry
RTEMS实践服务TSR(Time Service Rountin)的地址入口。
rtems_unsigned8
无符号 8位整数
rtems_unsigned16
无符号 16位整数
rtems_unsigned32
无符号 32位整数
rtems_unsigned64
无符号 64位整数
rtems_vector_number
处理中断向量数目
RTEMS的初始化管理器
RTEMS的初始化管理器
作者 Ray
RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems
7.1 摘要
初始化管理器负责启动和关闭 RTEMS 。 启动RTEMS包括创建并且启动所有的配置好的初始化任务, 并且初始化RTEMS系统使用到的设备驱动程序。 在多处理器系统中,初始化管理器也设定处理器间通信层的初值。 由初始化管理器提供的指令是:
rtems_initialize_executive- 初始化 RTEMS
rtems_initialize_executive_early- 初始化 RTEMS ,但是和 rtems_initialize_executive 不同的是, 该函数并不启动 RTEMS 的多任务。
rtems_initialize_executive_late- 完成初始化而且启动 多任务
rtems_shutdown_executive- 关闭 RTEMS
7.2 背景知识
7.2.1初始化任务
初始化任务将初始化 RTEMS ,然后将处理器控制移交到用户应用程序。初始化任务和其他应用层任务不同。初始化任务定义在用户初始化任务表中,由 RTEMS 创建并且启动。由于初始化任务和其他任务一样接受 RTEMS 任务管理器的调度,所以为了保证在其它应用任务启动前初始化任务能先启动,必须分配给它一个较高的优先级。虽然系统初始化任务可以是一个,也可以是多个,并且在个数上没有上限,但是至少要有一个。
标准的初始化任务创建并且启动配置好的应用程序,也可以创建应用任务需要的对象。一般来说,对于设计良好的初始化任务代码,在初始化结束的时候,必须将自己删除,并且释放自己占用的资源。初始化任务也可以转换成普通的应用任务。在做这样的转换的时候必须更该任务的优先级。通常来说, RTEMS 并不会自动删除初始化任务。
7.2.2: 系统初始化任务
系统初始化任务负责初始化所有的设备驱动,在多处理器系统中,系统初始化任务还负责初始化多处理器通信接口层(MPCI)。 为保证直到所有的器件驱动器被正确初始化,其他的应用任务才会运行。 因而,该任务相对于其他任务来说有一个较高的优先级,在单处理器系统中,设备初始化之后,任务将会划除它本身。
系统初始化任务需要有充足的栈空间,否则无法初始化所有的设备驱动。在初始化多处理器系统时,需要初始化处理器配置表,该表包含一个字段,该字段允许动态增加分派给应用或 BSP 的栈空间的尺寸。
在多处理器系统中,系统初始化任务在初始化设备驱动后不删除它本身。 相反,它把它本身转变成多处理服务任务,该任务设定多处理器通信接口层,核查多处理器系统一致性, 而且处理来自远端结点所有的请求。
7.2.3: 空闲任务
只有当没有其他的任务准备好运行的时候,空闲任务是一个优先级最低的任务(该任务本身就是一个消耗CPU时间的无限循环)。 当其他任务就绪时,空闲任务使用处理器的权力就会被剥夺
7.2.4: 初始化管理器失效
出现初始化失效错误时,rtems_initialize_executive 将会调用rtems_ifatal_error_occurred 指令,常见的初始化错误包括:
1 没有被提供处理器配置表格或处理器相关的信息表格。
2 如果处理器配置表格中提供的RTEMS在RAM储存器工作空间中入口地址是空值或者没有按照四字节的格式对齐(也就是说入口地址不是4的整数倍)。
3 如果 RTEMS 系统的RAM 储存器工作空间的大小,不够设定初始化系统。
4 如果被指定的中断栈大小太小。
5 如果是多处理器系统,但是多处理器配置表格的结点数目无效(不在1和 maximum_nodes 之间)。
6 如果配置成多处理器系统,但是没有分配多处理器通信接口层。
7 如果没有配置用户初始化任务。为了正确的将控制权从系统转移到应用任务,必须至少有一个初始化任务。
8 如果用户初始化任务中有一个不能够被成功地创建或启动。
7.3: 操作
7.3.1: 初始化 RTEMS
当板级支持包(BSP)完成初始化的动作后,BSP会调用rtems_initialize_executive 指令。 rtems_initialize_executive 指令通过完成下列的行动实现系统的初始化:
1.
初始化RTEMS 内部变量变量;
2.
分派系统资源;
3.
创建并且开始系统初始化任务;
4.
创建并且开始空闲任务;
5.
创建并且开始用户初始化任务; 并且且
6.
开始多任务处理。
rtems_initialize_executive 指令一定要在其他所有的 RTEMS 指令之前被调用。 因为在初始化函数 rtems_initialize_executive 完成前,任何 RTEMS 系统调用的结果都是不可预知的。 在初始化时所做的动作基本上是以配置表格和处理器相关信息表格为基础。 这两个表的配置后面章节还会有详细说明。
初始化序列的最后步骤是启动多任务管理器。 当调度和分派程序启动,他们会拥有最高的优先级,准备好的任务将会被调度。在任务调度器启动后,程序的控制逻辑将不被回到BSP,除非是调用了rtems_shutdown_executive。
rtems_initialize_executive 指令提供一个概念简单的方法初始化 RTEMS 。 然而,在特定的情况,如果不能使用该机制,RTEMS还提供了一个更为灵活的方案。该方案使用rtems_initialize_executive_early 和 rtems_initialize_executive_late 指令初始化RTEMS。rtems_initialize_executive_early 指令在启动启动多任务处理之前回返。 rtems_initialize_executive_late 指令用于启动多任务。 需要注意的是在RTEMS中只能使用一种方案初始化系统,也就是说不能重复初始化。
7.3.2: 关闭 RTEMS
rtems_shutdown_executive 指令被结束对板的多任务处理和回返控制支持包裹的应用叫唤。 板支持包裹在 [代]码重新开始执行立刻跟随 rtems_initialize_executive 指令的启用。
7.3.2: 关闭 RTEMS
在应用任务结束的时候使用rtems_shutdown_executive函数结束多任务处理和并且将控制权交还给BSP。BSP将执行rtems_initialize_executive 指令调用后的后序指令。
7.4: 指令
初始化管理器 INITIALIZE_EXECUTIVE- 初始化 RTEMS
初始化管理器 INITIALIZE_EXECUTIVE_EARLY- 初始化 RTEMS 但是不启动多任务
INITIALIZE_EXECUTIVE_LATE- 接在INITIALIZE_EXECUTIVE_EARLY后面,完成初始化并且启动多任务管理器
初始化管理器 SHUTDOWN_EXECUTIVE- 关闭 RTEMS
本节将更为深入的介绍初始化管理器的指令使用。包括每一个初始化管理器的指令相关的相关的常量,用法和状态编码。
7.4.1: INITIALIZE_EXECUTIVE- 初始化 RTEMS
指令格式 :
void rtems_initialize_executive(
rtems_configuration_table *configuration_table,
rtems_cpu_table *cpu_table
);
描述 :
当 BSP 的初始化已经完成 , 它允许 RTEMS 初始化 RTOS, 初始化信息参数包括 configuration_table 和 cpu_table 。其中configuration_table的定义如下:
typedef struct {
void *work_space_start;
rtems_unsigned32 work_space_size;
rtems_unsigned32 maximum_extensions;
rtems_unsigned32 microseconds_per_tick;
rtems_unsigned32 ticks_per_timeslice;
rtems_unsigned32 maximum_devices;
rtems_unsigned32 maximum_drivers;
rtems_unsigned32 number_of_device_drivers;
rtems_driver_address_table *Device_driver_table;
rtems_unsigned32 number_of_initial_extensions;
rtems_extensions_table *User_extension_table;
rtems_multiprocessing_table *User_multiprocessing_table;
rtems_api_configuration_table *RTEMS_api_configuration;
posix_api_configuration_table *POSIX_api_configuration;
itron_api_configuration_table *ITRON_api_configuration;
} rtems_configuration_table;
他包含了设备表用户扩展表 ( User_extension_table), 用于配置多处理器和多处理器通信层的多任务的多处理配置表 ( User_multiprocessing_table), 用户扩展表 ( User_extension_table), 此外该表的最后三个表项指向上层 API,API 的表项可以不用全部填充 , 不需要的 API 填充 NULL 就可以了。函数的第二个参数rtems_cpu_table定义了多CPU的配置参数。该指令被调用后,该指令启动多任务管理器,然后在后台运行直到调用 rtems_shutdown_executive 指令。
注意:
该指令必须是RTEMS调用的第一个指令,而且它不会返回,而是变成后台线程,直到调用 rtems_shutdown_executive 。
该指令导致系统的所有结点的配置一保持一致性。 如果一个不一致性被发现,然后一个致命的差错被产生。
7.4.2 INITIALIZE_EXECUTIVE_EARLY-初始化 RTEMS但不开启多任务管理器:
rtems_interrupt_level rtems_initialize_executive_early(
rtems_configuration_table*configuration_table,
rtems_cpu_table *cpu_table
);
当BSP已经完成它的初始化,函数的参数和rtems_initialize_executive相同。该指令在完成基本的 RTEMS 初始化之后会返回。 当指令调用结束时,会返回当前的优先级,该优先级将会作为 rtems_initialize_executive_late 的优先级。
7.4.3 INITIALIZE_EXECUTIVE_LATE- 完成初始化并启动多任务处理
void rtems_initialize_executive_late(
rtems_interrupt_level bsp_level
);
描述:
该指令在rtems_initialize_executive_early 指令后调用,参数bsp_level一般采用rtems_initialize_executive_early 指令返回值。反映了BSP任务的当前优先级状况。当rtems_shutdown_executive指令调用后。
注意:
rtems_initialize_executive_late必须和rtems_initialize_executive_early配对使用。该指令执行后会一直在后台运行,直到调用 rtems_shutdown_executive 。
该指令也会同步系统所有结点。如果出现不一致的状况,函数会产生异常。
7.4.4: SHUTDOWN_EXECUTIVE- 关闭 RTEMS
void rtems_shutdown_executive(
rtems_unsigned32 result
);
描述:
当应用程序愿关闭 RTEMS 的系统服务并且将对CPU的控制权交还给BSP板支持包裹时,就会调用该指令。BSP将会执行rtems_initialize_executive指令的后序命令。
RTEMS目录结构介绍