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指令的後序命令。