小型的嵌入式操作系統(tǒng)μC╱OS-Ⅱ的研究和實(shí)現(xiàn)畢業(yè)論文.doc_第1頁
小型的嵌入式操作系統(tǒng)μC╱OS-Ⅱ的研究和實(shí)現(xiàn)畢業(yè)論文.doc_第2頁
小型的嵌入式操作系統(tǒng)μC╱OS-Ⅱ的研究和實(shí)現(xiàn)畢業(yè)論文.doc_第3頁
小型的嵌入式操作系統(tǒng)μC╱OS-Ⅱ的研究和實(shí)現(xiàn)畢業(yè)論文.doc_第4頁
小型的嵌入式操作系統(tǒng)μC╱OS-Ⅱ的研究和實(shí)現(xiàn)畢業(yè)論文.doc_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余42頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

目目 錄錄 任務(wù)書 摘要 Abstract 1緒論 1 1 1嵌入式系統(tǒng) 1 1 2嵌入式處理器 1 1 3嵌入式實(shí)時(shí)操作系統(tǒng) RTOS 2 1 4X RTOS 的介紹 3 2硬件體系結(jié)構(gòu)和軟件平臺(tái) 4 2 1硬件體系結(jié)構(gòu) 4 2 2軟件平臺(tái) 4 3實(shí)時(shí)系統(tǒng)的基本概念 5 3 1前后臺(tái)系統(tǒng) 5 3 2代碼的臨界段 6 3 3資源 6 3 4共享資源 6 3 5多任務(wù) 6 3 6任務(wù) 7 3 7任務(wù)切換 8 3 8內(nèi)核 8 3 9調(diào)度 9 3 10 不可剝奪型內(nèi)核 9 3 11 可剝奪型內(nèi)核 10 3 12 時(shí)間片輪番調(diào)度法 11 3 13 任務(wù)優(yōu)先級(jí) 12 3 14 靜態(tài)優(yōu)先級(jí) 12 3 15 動(dòng)態(tài)優(yōu)先級(jí) 12 3 16 優(yōu)先級(jí)反轉(zhuǎn) 12 4X RTOS 詳細(xì)設(shè)計(jì)及編碼實(shí)現(xiàn) 15 4 1X RTOS 內(nèi)核結(jié)構(gòu)概述 15 4 1 1 臨界區(qū) 15 4 1 2 任務(wù)及其任務(wù)控制塊 15 4 1 3 就緒表 15 4 1 4 任務(wù)調(diào)度 18 4 1 5 空閑任務(wù) 19 4 2任務(wù)管理 20 4 2 1 建立任務(wù) 20 4 2 2 任務(wù)堆棧 22 4 2 3 改變?nèi)蝿?wù)的優(yōu)先級(jí) 23 4 2 4 掛起任務(wù) 25 4 2 5 恢復(fù)任務(wù) 26 4 2 6 任務(wù)休眠 27 4 3任務(wù)通信與同步對象和與對象有關(guān)的函數(shù) 28 4 3 1 初始化一個(gè)事件對象 30 4 3 2 使一個(gè)任務(wù)處于等待態(tài) 31 4 3 3 把一個(gè)任務(wù)放入就緒隊(duì)列 32 4 4信號(hào)量 33 4 4 1 創(chuàng)建信號(hào)量 34 4 4 2 等待一個(gè)信號(hào)量 35 4 4 3 釋放一個(gè)信號(hào)量 35 4 5互斥信號(hào)量 36 4 5 1 創(chuàng)建一個(gè)互斥信號(hào)量 36 4 5 2 等待一個(gè)互斥信號(hào)量 36 4 5 3 釋放一個(gè)互斥信號(hào)量 37 4 6消息隊(duì)列 37 4 6 1 創(chuàng)建一個(gè)消息隊(duì)列 39 4 6 2 從消息隊(duì)列中得到一個(gè)消息 39 4 6 3 往消息隊(duì)列中放入一個(gè)消息 40 4 7事件組 40 4 7 1 創(chuàng)建一個(gè)事件組 40 4 7 2 等待事件組的事件 40 4 7 3 設(shè)置事件組的事件 42 總結(jié) 43 致謝 44 參考文獻(xiàn) 45 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 1 1 緒論緒論 1 1 嵌入式系統(tǒng)嵌入式系統(tǒng) 隨著社會(huì)的信息化和網(wǎng)絡(luò)化的日益加強(qiáng) 對計(jì)算機(jī)系統(tǒng)小型化 實(shí)時(shí)性 可靠性的 要求越來越高 嵌入式系統(tǒng)正是在這種背景下應(yīng)運(yùn)而生 目前嵌入式系統(tǒng)的應(yīng)用日益廣 泛 大到波音飛機(jī)小到 MP3 移動(dòng)電話都有嵌入式系統(tǒng)的存在 因此 21 世紀(jì)也被一些 人戲稱為 嵌入式系統(tǒng)的世紀(jì) 1 嵌入式系統(tǒng)定義 按照歷史性 本質(zhì)性 普遍性要求 嵌入式系統(tǒng)應(yīng)定義為 嵌入到對象體系中的專 用計(jì)算機(jī)系統(tǒng) 嵌入性 專用性 與 計(jì)算機(jī)系統(tǒng) 是嵌入式系統(tǒng)的三個(gè)基本要素 對象 系統(tǒng)則是指嵌入式系統(tǒng)所嵌入的宿主系統(tǒng) 2 嵌入式系統(tǒng)的特點(diǎn) 與通用 PC 相比較 專用性 這是與傳統(tǒng) PC 最大的區(qū)別 嵌入式系統(tǒng)是面向用戶 面向產(chǎn)品 面向應(yīng) 用的 它只有和具體的應(yīng)用相結(jié)合才能體現(xiàn)出自己的優(yōu)勢 高實(shí)時(shí)性 這是嵌入式系統(tǒng)的基本條件 嵌入性 嵌入式系統(tǒng)是與具體的環(huán)境相結(jié)合的 與被控對象緊密連接的 智能性 操作使用人性化 儀表化 一般很少有人直接參與 3 嵌入式系統(tǒng)組成 嵌入式系統(tǒng)主要有兩部分組成 嵌入式微處理器等相關(guān)硬件和嵌入式操作系統(tǒng)等嵌 入式軟件 1 2 嵌入式處理器嵌入式處理器 嵌入式處理器的體系架構(gòu)可分為三種形式 1 IP Intellectual Property 級(jí)架構(gòu) 也就是片上系統(tǒng) SoC System on Chip 形式 即是依設(shè)備功能的需求 將不同的 IP 單元 集成在一塊總片中 它包含有處理器功能 I O 接口功能及嵌入式軟件功能 2 芯片級(jí)架構(gòu) 依應(yīng)用系統(tǒng)要求 選用相應(yīng)的微處理器 如 MCU MPU DSP RISC 等芯片 并 將 RAM ROM EPROM EEPROM Fash 及 I O 接口芯片等組成相應(yīng)的嵌入式系統(tǒng) 相 應(yīng)的系統(tǒng)軟件 應(yīng)用軟件是以固件形式固化在 ROM 中 這是目前常用的嵌入式系統(tǒng)的架 構(gòu)方式 MCU MPU 屬于單片機(jī)系列 這是大家熟知的 DSP Digita Signal Processor 數(shù)字 信號(hào)處理器 它具有數(shù)字信號(hào)處理能力強(qiáng) 特別適合于聲音 圖像等多媒體信息系統(tǒng) 但是其常規(guī)處理能力不強(qiáng) 尋址范圍有限 I O 功能弱及開發(fā)平臺(tái)問題 較少單獨(dú)作為嵌 入式系統(tǒng)的處理器 而是與嵌入式處理器相結(jié)合 構(gòu)成更強(qiáng)大的功能 RISC Reduced Instruction Set Computer 型處理器具有結(jié)構(gòu)簡單 處理速度快和處 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 2 理功能強(qiáng)等優(yōu)點(diǎn) 因此 新型的嵌入式系統(tǒng)大多數(shù)采用 RISC 處理器 主流架構(gòu)由 ARM 架構(gòu)處理器 Intel 的 8051 處理器 Microchip 的 PIC 處理器和 ZiOG 的 Z80 處理器 目 前典型的代表是 ARM 架構(gòu)處理器 世界上許多公司均基于 ARM 架構(gòu)開發(fā)出相應(yīng)的微處 理器芯片 如 ATME 公司 AT91 系列 MCU 采用 ARM7TDMI 內(nèi)核 Intel 公司 SA 1110 微處理器 MPU 采用 Strong ARM 核 Cirros 公司 EP 及 CL PS 系列掌上型計(jì)算機(jī)產(chǎn)品的 MPU 采用 ARM720T 核 inkup Systems 公司 L720 互聯(lián)網(wǎng)處理器 采用 ARM720T 核 Sharp 公司 H77790 掌上型產(chǎn)品中的 MPU 采用 ARM 7TD 內(nèi)核 其它如 Hyundai 公司 OKI 公司 Rohm 公司 Samsung 公司 Netsiicom 公司等 其 產(chǎn)品中均采用 ARM 內(nèi)核 另外一種新型的微架構(gòu)處理器是 Inte 公司的 Xscale 它是新一代為無線掌上型應(yīng)用 產(chǎn)品開發(fā)的嵌入式處理器 是 PCA 開發(fā)式平臺(tái)架構(gòu)中應(yīng)用于子系統(tǒng)與通信子系統(tǒng)中的嵌 入式處理器 3 X86 處理器嵌入到應(yīng)用系統(tǒng)中 這樣可充分利用 PC 機(jī)的通用性和便利性 采用嵌入式操作系統(tǒng) 并且將操作系統(tǒng)和 應(yīng)用軟件均固化在固態(tài)電子盤中 以縮小體積 增加可靠性 典型的產(chǎn)品有研祥公司的 嵌入式 CPU 卡及威盛公司的 C3 CPU 卡 1 3 嵌入式實(shí)時(shí)操作系統(tǒng) 嵌入式實(shí)時(shí)操作系統(tǒng) RTOS 嵌入式實(shí)時(shí)操作系統(tǒng) Embedded Real Time OS 簡稱 RTOS 是嵌入式系統(tǒng)應(yīng)用開 發(fā)的核心軟件 是嵌入式系統(tǒng)的靈魂 就像我們?nèi)粘K糜?jì)算機(jī)桌面系統(tǒng)中 微軟公司 的 Windows 操作系統(tǒng)一樣重要 市場上有很多著名的商業(yè)化嵌入式操作系統(tǒng) 如 VxWorks Pam OS Windows CE 嵌入式 Linux 和 C OS II 等上千種 RTOS 風(fēng)河 VxWorks 是非常出色的設(shè)備軟件操作系統(tǒng)平臺(tái) 適用于從手持電子設(shè)備到大型 網(wǎng)絡(luò)設(shè)施的各種設(shè)備 它以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛的應(yīng)用在通信 軍事 航空 航天等高精尖技術(shù)及實(shí)時(shí)性要求很高的領(lǐng)域中 如衛(wèi)星通信 軍事演習(xí)等 它是 目前嵌入式系統(tǒng)領(lǐng)域中使用最廣泛 市場占有率最高的系統(tǒng) 它支持多種處理器 如 x86 i960 StrongARM ARM 等 Palm OS 是由 Palm 公司自行開發(fā) 在掌上計(jì)算機(jī)和 PDA 市場上占有很大的市場份額 開放的操作系統(tǒng)應(yīng)用程序接口 API 開發(fā)商可以根據(jù)需要自行開發(fā)所需的應(yīng)用程序 Windows CE 是微軟開發(fā)的一個(gè)嵌入式操作系統(tǒng) 專門用于手持設(shè)備和信息家電 它 的模塊化設(shè)計(jì)允許他對從掌上計(jì)算機(jī)到專用的工業(yè)控制的用戶電子設(shè)備進(jìn)行定制 它的 特點(diǎn)是發(fā)展掌上型 Windows 系統(tǒng) 有文件兼容性高 功能多樣化的特點(diǎn) 可以看作是 Windows 95 的簡化版 Linux 是一套免費(fèi)使用和自由傳播的類 Unix 操作系統(tǒng) 是一個(gè)基于 POSIX 和 UNIX 的多用戶 多任務(wù) 支持多線程和多 CPU 的操作系統(tǒng) Linux 繼承了 Unix 以網(wǎng)絡(luò)為核心 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 3 的設(shè)計(jì)思想 是一個(gè)性能穩(wěn)定的多用戶網(wǎng)絡(luò)操作系統(tǒng) 它以高效性和靈活性著稱 但是 由于 Linux 是全球各地的成千上萬的程序員設(shè)計(jì)和實(shí)現(xiàn)的 因此開發(fā)散亂也是它的一大弱 點(diǎn) C OS II 是源代碼公開的實(shí)時(shí)嵌入式操作系統(tǒng) 主要有以下特點(diǎn) 1 可移植性 Portable 強(qiáng) C OS II 絕大部分源碼使用 ANSI C 編寫的 而與微處 理器硬件相關(guān)的那部分使用會(huì)編寫的 2 可固化 可裁減 可確定性 3 C OS II 完全是占先式 Preemptive 的實(shí)時(shí)內(nèi)核 4 實(shí)時(shí)多任務(wù) 不支持時(shí)間片輪轉(zhuǎn)調(diào)度法 5 任務(wù)棧 C OS II 每個(gè)任務(wù)都有自己的任務(wù)棧 6 系統(tǒng)服務(wù) C OS II 提供了很多的系統(tǒng)服務(wù) 例如信號(hào)量 互斥信號(hào)量 消息郵 箱 消息隊(duì)列等 1 4 X RTOS 的介紹的介紹 現(xiàn)在 市場上有那么多的嵌入式操作系統(tǒng) 從簡單到復(fù)雜 應(yīng)有盡有 比如 C OS II 就是一個(gè)簡單易學(xué)的 RTOS 而且他又是開放源代碼的 免費(fèi)用于個(gè)人學(xué)習(xí)的 但是 他 也還有一個(gè)最大的弱點(diǎn) 就是不支持時(shí)間片輪轉(zhuǎn)調(diào)度算法 這樣帶來的另一個(gè)弱點(diǎn)就是 任務(wù)的數(shù)量是有限 通過對 C OS II 的研究 最終實(shí)現(xiàn)一個(gè)小型的嵌入式操作系統(tǒng) 取 名為 X RTOS X RTOS 的主要特點(diǎn) 1 可移植性強(qiáng) Portable X RTOS 絕大部分使用 ANSI C 編寫 而而與微處理器 硬件相關(guān)的那部分利用了 C OS II 的函數(shù)層 所以 X RTOS 和 C OS II 一樣有很強(qiáng)的 可移植性的 可固化 可裁減 可確定性 X RTOS 是占先式 Preemptive 和時(shí)間片輪轉(zhuǎn)共存的實(shí)時(shí)內(nèi)核 實(shí)時(shí)多任務(wù) 支持時(shí)間片輪轉(zhuǎn)調(diào)度法 任務(wù)數(shù)可以不確定 5 任務(wù)棧 X RTOS 每個(gè)任務(wù)都有自己的任務(wù)棧 6 系統(tǒng)服務(wù) X RTOS 提供了很多的系統(tǒng)服務(wù) 例如信號(hào)量 互斥信號(hào)量 消息隊(duì) 列等 特別加入一個(gè)定時(shí)器的功能 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 4 2 硬件體系結(jié)構(gòu)和軟件平臺(tái)硬件體系結(jié)構(gòu)和軟件平臺(tái) 2 1 硬件體系結(jié)構(gòu)硬件體系結(jié)構(gòu) 硬件平臺(tái)采用的是 EasyARM2138 開發(fā)板 他是廣州周立功公司設(shè)計(jì)的 EasyARM 系 列開發(fā)套件之一 下面簡單介紹一下 EasyARM2138 EasyARM2138 采用了 PHILIPS 公司基于 ARM7TDMI S 核 單電源供電 QFP64 封 裝的 LPC2138 LPC2138 具有 32kB 的片內(nèi)靜態(tài) RAM 和 512kB 的片內(nèi) Fash 程序存儲(chǔ) 器 支持 JTAG 仿真調(diào)試 ISP 編程等功能 EasyARM2138 開發(fā)板上還提供了一些鍵盤 ED 蜂鳴器等常用功能部件 還具有 RS232 接口電路 I2C 存儲(chǔ)器電路 另外 靈活的跳線組合 開發(fā)板內(nèi)使用的所有 I O 均 可斷開連接 還有用戶 I O 接口 極大地方便了用戶進(jìn)行 32 位 ARM 嵌入式系統(tǒng)的開 發(fā)實(shí)驗(yàn) 開發(fā)的小型嵌入式操作系統(tǒng) X RTOS 代碼量不是很大 對于擁有 32kB 的片內(nèi) 靜態(tài) RAM 和 512kB 的片內(nèi) Flash 程序存儲(chǔ)器的 PC2138 來說是綽綽有余 再加上開發(fā)板 還支持 JTAG 仿真測試 ISP 編程 這樣使得開發(fā)效率大幅度提高 另外開發(fā)板上還提供 了一些鍵盤 LED 蜂鳴器等常用功能部件 還具有 RS232 接口電路 I2C 存儲(chǔ)器電路 這樣更有利于通過小的試驗(yàn)才測試一下程序的正確性 通過這兩點(diǎn)所以選擇了 EasyARM2138 開發(fā)板 2 2 軟件平臺(tái)軟件平臺(tái) 在軟件平臺(tái)的選擇上 現(xiàn)在有很多的嵌入式開發(fā)軟件平臺(tái) 比如 ARM 公司的 ADS 系列的軟件 還有 IAR 公司的 IAR Embedded Workbench for ARM Evauation 等軟件 由 于比較熟悉 ADS 最后選擇了 ADS 軟件平臺(tái) 選用的是 ADS 1 2 ARM ADS 全稱為 ARM Developer Suite 是 ARM 公司推出的一款 ARM 集成開發(fā) 工具 除了可以安裝在 Windows NT4 Windows 2000 操作系統(tǒng)下 還支持 Windows XP 操作系統(tǒng) ADS 由命令行開發(fā)工具 ARM 時(shí)實(shí)庫 GUI 開發(fā)環(huán)境 Code Warrior 和 AXD 實(shí)用程序和支持軟件組成 有了這些部件 用戶就可以為 ARM 系統(tǒng)的 RISC 處理 器編寫和調(diào)試自己的開發(fā)應(yīng)用程序了 加上自身集成的 CodeWarrior for ARM 是一套完整 的開發(fā)工具 充分發(fā)揮了 ARM RISC 的優(yōu)勢 使產(chǎn)品開發(fā)人員能夠很好的應(yīng)用尖端的片 上系統(tǒng)技術(shù) 該工具是專為基于 ARM RISC 的處理器而設(shè)計(jì)的 它可加速并簡化嵌入式 開發(fā)過程的每一個(gè)環(huán)節(jié) 使得開發(fā)人員只需要一個(gè)集成軟件開發(fā)環(huán)境就能研制出 ARM 產(chǎn) 品 在整個(gè)開發(fā)周期中 開發(fā)人員無需離開 CodeWarrior 開發(fā)環(huán)境 因此節(jié)省了在操作工 具上花的時(shí)間 使的開發(fā)人員有更多的精力投入到代碼編寫上來 最后 還要必須說到 他的一個(gè)工具 就是他自身帶的調(diào)試器 AXD 程序員可以通過這個(gè)軟件使用 debug agent 可以對包含有調(diào)試信息的 正在運(yùn)行的可以執(zhí)行代碼進(jìn)行比如變量的查看 斷點(diǎn)的控制 等調(diào)試操作 這樣的話 使的找程序的錯(cuò)誤變得更加的簡單 快速 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 5 3 3 實(shí)時(shí)系統(tǒng)的基本概念實(shí)時(shí)系統(tǒng)的基本概念 實(shí)時(shí)系統(tǒng)的特點(diǎn)是 如果邏輯和時(shí)序出現(xiàn)偏差將會(huì)引起嚴(yán)重后果的系統(tǒng) 有兩種類 型的實(shí)時(shí)系統(tǒng) 軟實(shí)時(shí)系統(tǒng)和硬實(shí)時(shí)系統(tǒng) 在軟實(shí)時(shí)系統(tǒng)中系統(tǒng)的宗旨是使各個(gè)任務(wù)運(yùn) 行得越快越好 并不要求限定某一任務(wù)必須在多長時(shí)間內(nèi)完成 在硬實(shí)時(shí)系統(tǒng)中 各任務(wù)不僅要執(zhí)行無誤而且要做到準(zhǔn)時(shí) 大多數(shù)實(shí)時(shí)系統(tǒng)是二者的 結(jié)合 實(shí)時(shí)系統(tǒng)的應(yīng)用涵蓋廣泛的領(lǐng)域 而多數(shù)實(shí)時(shí)系統(tǒng)又是嵌入式的 這意味著計(jì)算 機(jī)建在系統(tǒng)內(nèi)部 用戶看不到有個(gè)計(jì)算機(jī)在系統(tǒng)里面 以下是一些嵌入式系統(tǒng)的例子 3 1 前后臺(tái)系統(tǒng)前后臺(tái)系統(tǒng) 不復(fù)雜的小系統(tǒng)一般設(shè)計(jì)成如圖 3 1 所示的樣子 這種系統(tǒng)可稱為前后臺(tái)系統(tǒng)或超循 環(huán)系統(tǒng) Super loops 應(yīng)用程序是一個(gè)無限的循環(huán) 循環(huán)中調(diào)用相應(yīng)的函數(shù)完成相應(yīng)的操 作 這部分可以看成后臺(tái)行為 background 中斷服務(wù)程序處理異步事件 這部分可以看 成前臺(tái)行為 foreground 后臺(tái)也可以叫做任務(wù)級(jí) 前臺(tái)也叫中斷級(jí) 時(shí)間相關(guān)性很強(qiáng)的 關(guān)鍵操作 Critical operation 一定是靠中斷服務(wù)來保證的 因?yàn)橹袛喾?wù)提供的信息一直要 等到后臺(tái)程序走到該處理這個(gè)信息這一步時(shí)才能得到處理 這種系統(tǒng)在處理信息的及時(shí) 性上 比實(shí)際可以做到的要差 這個(gè)指標(biāo)稱作任務(wù)級(jí)響應(yīng)時(shí)間 最壞情況下的任務(wù)級(jí)響 應(yīng)時(shí)間取決于整個(gè)循環(huán)的執(zhí)行時(shí)間 因?yàn)檠h(huán)的執(zhí)行時(shí)間不是常數(shù) 程序經(jīng)過某一特定 部分的準(zhǔn)確時(shí)間也是不能確定的 進(jìn)而 如果程序修改了 循環(huán)的時(shí)序也會(huì)受到影響 過程控制 食品加工 化工廠 汽車業(yè) 發(fā)動(dòng)機(jī)控制 防抱死系統(tǒng) ABS 辦公自動(dòng)化 傳真機(jī) 復(fù)印機(jī) 計(jì)算機(jī)外設(shè) 打印機(jī) 計(jì)算機(jī)終端 掃描儀 調(diào)制解調(diào)器 通訊類 Switch Hurb 路由器 機(jī)器人 航空航天 飛機(jī)管理系統(tǒng) 武器系統(tǒng) 噴氣發(fā)動(dòng)機(jī)控制 民用消費(fèi)品 微波爐 洗碗機(jī) 洗依機(jī) 穩(wěn)溫調(diào)節(jié)器 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 6 圖 3 1 前后臺(tái)系統(tǒng) 很多基于微處理器的產(chǎn)品采用前后臺(tái)系統(tǒng)設(shè)計(jì) 例如微波爐 電話機(jī) 玩具等 在另外 一些基于微處理器的應(yīng)用中 從省電的角度出發(fā) 平時(shí)微處理器處在停機(jī)狀態(tài) hat 所有 的事都靠中斷服務(wù)來完成 3 2 代碼的臨界段代碼的臨界段 代碼的臨界段也稱為臨界區(qū) 指處理時(shí)不可分割的代碼 一旦這部分代碼開始執(zhí)行 則不允許任何中斷打入 為確保臨界段代碼的執(zhí)行 在進(jìn)入臨界段之前要關(guān)中斷 而臨 界段代碼執(zhí)行完以后要立即開中斷 3 3 資源資源 任何為任務(wù)所占用的實(shí)體都可稱為資源 資源可以是輸入輸出設(shè)備 例如打印機(jī) 鍵盤 顯示器 資源也可以是一個(gè)變量 一個(gè)結(jié)構(gòu)或一個(gè)數(shù)組等 3 4 共享資源共享資源 可以被一個(gè)以上任務(wù)使用的資源叫做共享資源 為了防止數(shù)據(jù)被破壞 每個(gè)任務(wù)在與 共享資源打交道時(shí) 必須獨(dú)占該資源 這叫做互斥 3 5 多任務(wù)多任務(wù) 多任務(wù)運(yùn)行的實(shí)現(xiàn)實(shí)際上是靠 CPU 中央處理單元 在許多任務(wù)之間轉(zhuǎn)換 調(diào)度 CPU 只有一個(gè) 輪番服務(wù)于一系列任務(wù)中的某一個(gè) 多任務(wù)運(yùn)行很像前后臺(tái)系統(tǒng) 但后臺(tái)任 務(wù)有多個(gè) 多任務(wù)運(yùn)行使 CPU 的利用率得到最大的發(fā)揮 并使應(yīng)用程序模塊化 在實(shí)時(shí) 應(yīng)用中 多任務(wù)化的最大特點(diǎn)是 開發(fā)人員可以將很復(fù)雜的應(yīng)用程序?qū)哟位?使用多任 務(wù) 應(yīng)用程序?qū)⒏菀自O(shè)計(jì)與維護(hù) 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 7 3 6 任務(wù)任務(wù) 一個(gè)任務(wù) 也稱作一個(gè)線程 是一個(gè)簡單的程序 該程序可以認(rèn)為 CPU 完全只屬該 程序自己 實(shí)時(shí)應(yīng)用程序的設(shè)計(jì)過程 包括如何把問題分割成多個(gè)任務(wù) 每個(gè)任務(wù)都是 整個(gè)應(yīng)用的某一部分 每個(gè)任務(wù)被賦予一定的優(yōu)先級(jí) 有它自己的一套 CPU 寄存器和自 己的??臻g 如圖 3 2 所示 圖 3 2 多任務(wù)環(huán)境 典型地 每個(gè)任務(wù)都是一個(gè)無限的循環(huán) 每個(gè)任務(wù)都處在以下 5 種狀態(tài)之一的狀態(tài) 下 這 5 種狀態(tài)是休眠態(tài) 就緒態(tài) 運(yùn)行態(tài) 掛起態(tài) 等待某一事件發(fā)生 和被中斷態(tài) 見 圖 3 3 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 8 圖 3 3 任務(wù)的狀態(tài) 休眠態(tài)相當(dāng)于該任務(wù)駐留在內(nèi)存中 但并不被多任務(wù)內(nèi)核所調(diào)度 就緒意味著該任務(wù)已 經(jīng)準(zhǔn)備好 可以運(yùn)行了 但由于該任務(wù)的優(yōu)先級(jí)比正在運(yùn)行的任務(wù)的優(yōu)先級(jí)低 還暫時(shí) 不能運(yùn)行 運(yùn)行態(tài)的任務(wù)是指該任務(wù)掌握了 CPU 的控制權(quán) 正在運(yùn)行中 掛起狀態(tài)也可 以叫做等待事件態(tài) WAILTING 指該任務(wù)在等待 等待某一事件的發(fā)生 例如等待某外 設(shè)的 I O 操作 等待某共享資源由暫不能使用變成能使用狀態(tài) 等待定時(shí)脈沖的到來或等 待超時(shí)信號(hào)的到來以結(jié)束目前的等待 等等 最后 發(fā)生中斷時(shí) CPU 提供相應(yīng)的中斷 服務(wù) 原來正在運(yùn)行的任務(wù)暫不能運(yùn)行 就進(jìn)入了被中斷狀態(tài) 3 7 任務(wù)切換任務(wù)切換 Context Switch 也稱為在上下文切換 實(shí)際含義是任務(wù)切換 或 CPU 寄存器內(nèi)容切 換 當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí) 它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài) Context 即 CPU 寄存器中的全部內(nèi)容 這些內(nèi)容保存在任務(wù)的當(dāng)前狀況保存區(qū) Task s Context Storage area 也就是任務(wù)自己的棧區(qū)之中 見圖 3 2 入棧工作完成以后 就是把下一 個(gè)將要運(yùn)行的任務(wù)的當(dāng)前狀況從該任務(wù)的棧中重新裝入 CPU 的寄存器 并開始下一個(gè)任 務(wù)的運(yùn)行 這個(gè)過程叫做任務(wù)切換 任務(wù)切換過程增加了應(yīng)用程序的額外負(fù)荷 CPU 的 內(nèi)部寄存器越多 額外負(fù)荷就越重 做任務(wù)切換所需要的時(shí)間取決于 CPU 有多少寄存器 要入棧 實(shí)時(shí)內(nèi)核的性能不應(yīng)該以每秒鐘能做多少次任務(wù)切換來評(píng)價(jià) 3 8 內(nèi)核內(nèi)核 多任務(wù)系統(tǒng)中 內(nèi)核負(fù)責(zé)管理各個(gè)任務(wù) 或者說為每個(gè)任務(wù)分配 CPU 時(shí)間 并且負(fù) 責(zé)任務(wù)之間的通訊 內(nèi)核提供的基本服務(wù)是任務(wù)切換 之所以使用實(shí)時(shí)內(nèi)核可以大大簡 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 9 化應(yīng)用系統(tǒng)的設(shè)計(jì) 是因?yàn)閷?shí)時(shí)內(nèi)核允許將應(yīng)用分成若干個(gè)任務(wù) 由實(shí)時(shí)內(nèi)核來管理它 們 內(nèi)核本身也增加了應(yīng)用程序的額外負(fù)荷 代碼空間增加 ROM 的用量 內(nèi)核本身的數(shù) 據(jù)結(jié)構(gòu)增加了 RAM 的用量 但更主要的是 每個(gè)任務(wù)要有自己的棧空間 這一塊吃起內(nèi) 存來是相當(dāng)厲害的 內(nèi)核本身對 CPU 的占用時(shí)間一般在 2 到 5 個(gè)百分點(diǎn)之間 單片機(jī)一般不能運(yùn)行實(shí)時(shí)內(nèi)核 因?yàn)閱纹瑱C(jī)的 RAM 很有限 通過提供必不可缺少 的 系統(tǒng)服務(wù) 諸如信號(hào)量管理 郵箱 消息隊(duì)列 延時(shí)等 實(shí)時(shí)內(nèi)核使得 CPU 的利用更為 有效 一旦讀者用實(shí)時(shí)內(nèi)核做過系統(tǒng)設(shè)計(jì) 將決不再想返回到前后臺(tái)系統(tǒng) 3 9 調(diào)度調(diào)度 調(diào)度 Scheduler 是內(nèi)核的主要職責(zé)之一 就是要決定該輪到哪個(gè)任務(wù)運(yùn)行了 多 數(shù)實(shí)時(shí)內(nèi)核是基于優(yōu)先級(jí)調(diào)度法的 每個(gè)任務(wù)根據(jù)其重要程度的不同被賦予一定的優(yōu)先 級(jí) 基于優(yōu)先級(jí)的調(diào)度法指 CPU 總是讓處在就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)先運(yùn)行 然而 究竟何時(shí)讓高優(yōu)先級(jí)任務(wù)掌握 CPU 的使用權(quán) 有兩種不同的情況 這要看用的是什么類 型的內(nèi)核 是不可剝奪型的還是可剝奪型內(nèi)核 3 10 不可剝奪型內(nèi)核不可剝奪型內(nèi)核 不可剝奪型內(nèi)核要求每個(gè)任務(wù)自我放棄 CPU 的所有權(quán) 不可剝奪型調(diào)度法也稱作合 作型多任務(wù) 各個(gè)任務(wù)彼此合作共享一個(gè) CPU 異步事件還是由中斷服務(wù)來處理 中斷 服務(wù)可以使一個(gè)高優(yōu)先級(jí)的任務(wù)由掛起狀態(tài)變?yōu)榫途w狀態(tài) 但中斷服務(wù)以后控制權(quán)還是 回到原來被中斷了的那個(gè)任務(wù) 直到該任務(wù)主動(dòng)放棄 CPU 的使用權(quán)時(shí) 那個(gè)高優(yōu)先級(jí)的 任務(wù)才能獲得 CPU 的使用權(quán) 不可剝奪型內(nèi)核的一個(gè)優(yōu)點(diǎn)是響應(yīng)中斷快 在討論中斷響應(yīng)時(shí)會(huì)進(jìn)一步涉及這個(gè)問 題 在任務(wù)級(jí) 不可剝奪型內(nèi)核允許使用不可重入函數(shù) 函數(shù)的可重入性以后會(huì)討論 每個(gè)任務(wù)都可以調(diào)用非可重入性函數(shù) 而不必?fù)?dān)心其它任務(wù)可能正在使用該函數(shù) 從而 造成數(shù)據(jù)的破壞 因?yàn)槊總€(gè)任務(wù)要運(yùn)行到完成時(shí)才釋放 CPU 的控制權(quán) 當(dāng)然該不可重入 型函數(shù)本身不得有放棄 CPU 控制權(quán)的企圖 使用不可剝奪型內(nèi)核時(shí) 任務(wù)級(jí)響應(yīng)時(shí)間比前后臺(tái)系統(tǒng)快得多 此時(shí)的任務(wù)級(jí)響應(yīng) 時(shí)間取決于最長的任務(wù)執(zhí)行時(shí)間 不可剝奪型內(nèi)核的另一個(gè)優(yōu)點(diǎn)是 幾乎不需要使用信號(hào)量保護(hù)共享數(shù)據(jù) 運(yùn)行著的 任務(wù)占有 CPU 而不必?fù)?dān)心被別的任務(wù)搶占 但這也不是絕對的 在某種情況下 信號(hào)量 還是用得著的 處理共享 I O 設(shè)備時(shí)仍需要使用互斥型信號(hào)量 例如 在打印機(jī)的使用 上 仍需要滿足互斥條件 圖 3 4 示意不可剝奪型內(nèi)核的運(yùn)行情況 任務(wù)在運(yùn)行過程之 中 圖 3 4 1 中斷來了 如果此時(shí)中斷是開著的 CPU 由中斷向量 3 4 2 進(jìn)入中斷 服務(wù)子程序 中斷服務(wù)子程序做事件處理 圖 3 4 3 使一個(gè)有更高級(jí)的任務(wù)進(jìn)入就緒 態(tài) 中斷服務(wù)完成以后 中斷返回指令 圖 3 4 4 使 CPU 回到原來被中斷的任務(wù) 接 著執(zhí)行該任務(wù)的代碼 圖 3 4 5 直到該任務(wù)完成 調(diào)用一個(gè)內(nèi)核服務(wù)函數(shù)以釋放 CPU 控 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 10 制權(quán) 由內(nèi)核將控制權(quán)交給那個(gè)優(yōu)先級(jí)更高的 并已進(jìn)入就緒態(tài)的任務(wù) 圖 3 4 6 這 個(gè)優(yōu)先級(jí)更高的任務(wù)才開始處理中斷服務(wù)程序標(biāo)識(shí)的事件 圖 3 4 7 圖 3 4 不可剝奪型內(nèi)核 不可剝奪型內(nèi)核的最大缺陷在于其響應(yīng)時(shí)間 高優(yōu)先級(jí)的任務(wù)已經(jīng)進(jìn)入就緒態(tài) 但 還不能運(yùn)行 要等 也許要等很長時(shí)間 直到當(dāng)前運(yùn)行著的任務(wù)釋放 CPU 與前后系統(tǒng) 一樣 不可剝奪型內(nèi)核的任務(wù)級(jí)響應(yīng)時(shí)間是不確定的 不知道什么時(shí)候最高優(yōu)先級(jí)的任務(wù)才能 拿到 CPU 的控制權(quán) 完全取決于應(yīng)用程序什么時(shí)候釋放 CPU 總之 不可剝奪型內(nèi)核允許每個(gè)任務(wù)運(yùn)行 直到該任務(wù)自愿放棄 CPU 的控制權(quán) 中斷 可以打入運(yùn)行著的任務(wù) 中斷服務(wù)完成以后將 CPU 控制權(quán)還給被中斷了的任務(wù) 任務(wù)級(jí) 響應(yīng)時(shí)間要大大好于前后系統(tǒng) 但仍是不可知的 商業(yè)軟件幾乎沒有不可剝奪型內(nèi)核 3 11 可剝奪型內(nèi)核可剝奪型內(nèi)核 當(dāng)系統(tǒng)響應(yīng)時(shí)間很重要時(shí) 要使用可剝奪型內(nèi)核 因此 C OS 以及絕大多數(shù)商 業(yè)上銷售的實(shí)時(shí)內(nèi)核都是可剝奪型內(nèi)核 最高優(yōu)先級(jí)的任務(wù)一旦就緒 總能得到 CPU 的 控制權(quán) 當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級(jí)高的任務(wù)進(jìn)入了就緒態(tài) 當(dāng)前任務(wù)的 CPU 使用權(quán)就被剝奪了 或者說被掛起了 那個(gè)高優(yōu)先級(jí)的任務(wù)立刻得到了 CPU 的控制權(quán) 如果是中斷服務(wù)子程序使一個(gè)高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài) 中斷完成時(shí) 中斷了的任務(wù) 被掛起 優(yōu)先級(jí)高的那個(gè)任務(wù)開始運(yùn)行 如圖 3 5 所示 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 11 圖 3 5 可剝奪型內(nèi)核 使用可剝奪型內(nèi)核 最高優(yōu)先級(jí)的任務(wù)什么時(shí)候可以執(zhí)行 可以得到 CPU 的控制權(quán)是 可知的 使用可剝奪型內(nèi)核使得任務(wù)級(jí)響應(yīng)時(shí)間得以最優(yōu)化 使用可剝奪型內(nèi)核時(shí) 應(yīng)用程序不應(yīng)直接使用不可重入型函數(shù) 調(diào)用不可重入型函數(shù) 時(shí) 要滿足互斥條件 這一點(diǎn)可以用互斥型信號(hào)量來實(shí)現(xiàn) 如果調(diào)用不可重入型函數(shù)時(shí) 低優(yōu)先級(jí)的任務(wù) CPU 的使用權(quán)被高優(yōu)先級(jí)任務(wù)剝奪 不可重入型函數(shù)中的數(shù)據(jù)有可能被 破壞 綜上所述 可剝奪型內(nèi)核總是讓就緒態(tài)的高優(yōu)先級(jí)的任務(wù)先運(yùn)行 中斷服務(wù)程序 可以搶占 CPU 到中斷服務(wù)完成時(shí) 內(nèi)核讓此時(shí)優(yōu)先級(jí)最高的任務(wù)運(yùn)行 不一定是那個(gè) 被中斷了的任務(wù) 任務(wù)級(jí)系統(tǒng)響應(yīng)時(shí)間得到了最優(yōu)化 且是可知的 C OS 屬于可 剝奪型內(nèi)核 3 12 時(shí)間片輪番調(diào)度法時(shí)間片輪番調(diào)度法 當(dāng)兩個(gè)或兩個(gè)以上任務(wù)有同樣優(yōu)先級(jí) 內(nèi)核允許一個(gè)任務(wù)運(yùn)行事先確定的一段時(shí)間 叫做時(shí)間額度 然后切換給另一個(gè)任務(wù) 也叫做時(shí)間片調(diào)度 內(nèi)核在滿足以下條件時(shí) 把 CPU 控制權(quán)交給下一個(gè)任務(wù)就緒態(tài)的任務(wù) 當(dāng)前任務(wù)已無事可做 當(dāng)前任務(wù)在時(shí)間片 還沒結(jié)束時(shí)已經(jīng)完成了 目前 C OS 不支持時(shí)間片輪番調(diào)度法 應(yīng)用程序中各個(gè)任 務(wù)的優(yōu)先級(jí)必須互不相同 但是 在我的畢業(yè)設(shè)計(jì)中 X RTOS 中 支持時(shí)間片輪轉(zhuǎn) 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 12 3 13 任務(wù)優(yōu)先級(jí)任務(wù)優(yōu)先級(jí) 每個(gè)任務(wù)都有其優(yōu)先級(jí) 任務(wù)越重要 賦予的優(yōu)先級(jí)應(yīng)越高 3 14 靜態(tài)優(yōu)先級(jí)靜態(tài)優(yōu)先級(jí) 應(yīng)用程序執(zhí)行過程中諸任務(wù)優(yōu)先級(jí)不變 則稱之為靜態(tài)優(yōu)先級(jí) 在靜態(tài)優(yōu)先級(jí)系統(tǒng)中 諸任務(wù)以及它們的時(shí)間約束在程序編譯時(shí)是已知的 3 15 動(dòng)態(tài)優(yōu)先級(jí)動(dòng)態(tài)優(yōu)先級(jí) 應(yīng)用程序執(zhí)行過程中 任務(wù)的優(yōu)先級(jí)是可變的 則稱之為動(dòng)態(tài)優(yōu)先級(jí) 實(shí)時(shí)內(nèi)核應(yīng)當(dāng) 避免出現(xiàn)優(yōu)先級(jí)反轉(zhuǎn)問題 3 16 優(yōu)先級(jí)反轉(zhuǎn)優(yōu)先級(jí)反轉(zhuǎn) 使用實(shí)時(shí)內(nèi)核 優(yōu)先級(jí)反轉(zhuǎn)問題是實(shí)時(shí)系統(tǒng)中出現(xiàn)得最多的問題 圖 3 6 解釋優(yōu)先級(jí)反 轉(zhuǎn)是如何出現(xiàn)的 如圖 3 6 任務(wù) 1 優(yōu)先級(jí)高于任務(wù) 2 任務(wù) 2 優(yōu)先級(jí)高于任務(wù) 3 任務(wù) 1 和任務(wù) 2 處于掛起狀態(tài) 等待某一事件的發(fā)生 任務(wù) 3 正在運(yùn)行如 圖 3 6 1 此時(shí) 任務(wù) 3 要使用其共享資源 使用共享資源之前 首先必須得到該資源的信號(hào)量 Semaphore 任務(wù) 3 得到了該信號(hào)量 并開始使用該共享資源 圖 3 6 2 由于任務(wù) 1 優(yōu)先級(jí)高 它 等待的事件到來之后剝奪了任務(wù) 3 的 CPU 使用權(quán) 圖 3 6 3 任務(wù) 1 開始運(yùn)行 圖 3 6 4 運(yùn)行過程中任務(wù) 1 也要使用那個(gè)任務(wù) 3 正在使用著的資源 由于該資源的信號(hào)量還被任 務(wù) 3 占用著 任務(wù) 1 只能進(jìn)入掛起狀態(tài) 等待任務(wù) 3 釋放該信號(hào)量 圖 3 6 5 任務(wù) 3 得 以繼續(xù)運(yùn)行 圖 3 6 6 由于任務(wù) 2 的優(yōu)先級(jí)高于任務(wù) 3 當(dāng)任務(wù) 2 等待的事件發(fā)生后 任務(wù) 2 剝奪了任務(wù) 3 的 CPU 的使用權(quán) 圖 3 6 7 并開始運(yùn)行 處理它該處理的事件 圖 3 6 8 直到處理完之后將 CPU 控制權(quán)還給任 3 圖 3 6 9 任務(wù) 3 接著運(yùn)行 圖 3 6 10 直到釋放那個(gè)共享資源的信號(hào)量 圖 2 7 11 直到此時(shí) 由于實(shí)時(shí)內(nèi)核知道有個(gè)高優(yōu)先級(jí) 的任務(wù)在等待這個(gè)信號(hào)量 內(nèi)核做任務(wù)切換 使任務(wù) 1 得到該信號(hào)量并接著運(yùn)行 圖 3 6 12 在這種情況下 任務(wù) 1 優(yōu)先級(jí)實(shí)際上降到了任務(wù) 3 的優(yōu)先級(jí)水平 因?yàn)槿蝿?wù) 1 要等 直 等到任務(wù) 3 釋放占有的那個(gè)共享資源 由于任務(wù) 2 剝奪任務(wù) 3 的 CPU 使用權(quán) 使任務(wù) 1 的 狀況更加惡化 任務(wù) 2 使任務(wù) 1 增加了額外的延遲時(shí)間 任務(wù) 1 和任務(wù) 2 的優(yōu)先級(jí)發(fā)生了 反轉(zhuǎn) 糾正的方法可以是 在任務(wù) 3 使用共享資源時(shí) 提升任務(wù) 3 的優(yōu)先級(jí) 任務(wù)完成時(shí)予以 恢復(fù) 任務(wù) 3 的優(yōu)先級(jí)必須升至最高 高于允許使用該資源的任何任務(wù) 多任務(wù)內(nèi)核應(yīng)允 許動(dòng)態(tài)改變?nèi)蝿?wù)的優(yōu)先級(jí)以避免發(fā)生優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象 然而改變?nèi)蝿?wù)的優(yōu)先級(jí)是很花時(shí) 間的 如果任務(wù) 3 并沒有先被任務(wù) 1 剝奪 CPU 使用權(quán) 又被任務(wù) 2 搶走了 CPU 使用權(quán) 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 13 花很多時(shí)間在共享資源使用前提升任務(wù) 3 的優(yōu)先級(jí) 然后又在資源使用后花時(shí)間恢復(fù)任務(wù) 3 的優(yōu)先級(jí) 則無形中浪費(fèi)了很多 CPU 時(shí)間 真正需要的是 為防止發(fā)生優(yōu)先級(jí)反轉(zhuǎn) 內(nèi)核能 自動(dòng)變換任務(wù)的優(yōu)先級(jí) 這叫做優(yōu)先級(jí)繼承 Priority inheritance 但 C OS 不支持優(yōu)先級(jí) 繼承 我得到畢業(yè)設(shè)計(jì)就支持優(yōu)先級(jí)繼承 在我的畢業(yè)設(shè)計(jì)中就會(huì)支持優(yōu)先級(jí)繼承 圖 3 6 優(yōu)先級(jí)反轉(zhuǎn)問題 圖 3 7 解釋如果內(nèi)核支持優(yōu)先級(jí)繼承的話 在上述例子中會(huì)是怎樣一個(gè)過程 任務(wù) 3 在運(yùn)行 圖 3 7 1 任務(wù) 3 申請信號(hào)量以獲得共享資源使用權(quán) 圖 3 7 2 任務(wù) 3 得到并開始 使用共享資源 圖 3 7 3 后來 CPU 使用權(quán)被任務(wù) 1 剝奪 圖 3 7 4 任務(wù) 1 開始運(yùn)行 圖 3 7 5 任務(wù) 1 申請共享資源信號(hào)量 圖 3 7 6 此時(shí) 內(nèi)核知道該信號(hào)量被任務(wù) 3 占用了 而 任務(wù) 3 的優(yōu)先級(jí)比任務(wù) 1 低 內(nèi)核于是將任務(wù) 3 的優(yōu)先級(jí)升至與任務(wù) 1 一樣 然而回到任務(wù) 3 繼續(xù)運(yùn)行 使用該共享資源 圖 3 7 7 直到任務(wù) 3 釋放共享資源信號(hào)量 圖 3 7 8 這時(shí) 內(nèi)核恢復(fù)任務(wù) 3 本來的優(yōu)先級(jí)并把信號(hào)量交給任務(wù) 1 任務(wù) 1 得以順利運(yùn)行 圖 3 7 9 任務(wù) 1 完成以后 圖 2 8 10 那些任務(wù)優(yōu)先級(jí)在任務(wù) 1 與任務(wù) 3 之間的任務(wù)例如任務(wù) 2 才能 得到 CPU 使用權(quán) 并開始運(yùn)行 圖 3 7 11 注意 任務(wù) 2 在從 圖 3 7 3 到 3 7 10 的任何 一刻都有可能進(jìn)入就緒態(tài) 并不影響任務(wù) 1 任務(wù) 3 的完成過程 在某種程度上 任務(wù) 2 和 任務(wù) 3 之間也還是有不可避免的優(yōu)先級(jí)反轉(zhuǎn) 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 14 圖 3 7 內(nèi)核支持優(yōu)先級(jí)繼承 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 15 4 X RTOS 詳細(xì)設(shè)計(jì)及編碼實(shí)現(xiàn)詳細(xì)設(shè)計(jì)及編碼實(shí)現(xiàn) 4 1 X RTOS 內(nèi)核結(jié)構(gòu)概述內(nèi)核結(jié)構(gòu)概述 4 1 1 臨界區(qū)臨界區(qū) 和其它內(nèi)核一樣 X RTOS 為了處理臨界段代碼需要關(guān)中斷 處理完畢后再開中斷 這使得 X RTOS 能夠避免同時(shí)有其它任務(wù)或中斷服務(wù)進(jìn)入臨界段代碼 關(guān)中斷的時(shí)間是 實(shí)時(shí)內(nèi)核開發(fā)商應(yīng)提供的最重要的指標(biāo)之一 因?yàn)檫@個(gè)指標(biāo)影響用戶系統(tǒng)對實(shí)時(shí)事件的 響應(yīng)性 X RTOS 努力使關(guān)中斷時(shí)間降至最短 但就使用 X RTOS 而言 關(guān)中斷的時(shí)間很 大程度上取決于微處理器的架構(gòu)以及編譯器所生成的代碼質(zhì)量 微處理器一般都有關(guān)中斷 開中斷指令 用戶使用的 C 語言編譯器必須有某種機(jī)制能 夠在 C 中直接實(shí)現(xiàn)關(guān)中斷 開中斷地操作 某些 C 編譯器允許在用戶的 C 源代碼中插入?yún)R 編語言的語句 這使得插入微處理器指令來關(guān)中斷 開中斷很容易實(shí)現(xiàn) 而有的編譯器把 從 C 語言中關(guān)中斷 開中斷放在語言的擴(kuò)展部分 X RTOS 定義兩個(gè)宏 macros 來關(guān)中斷和 開中斷 以便避開不同 C 編譯器廠商選擇不同的方法來處理關(guān)中斷和開中斷 X RTOS 中的這兩個(gè)宏調(diào)用分別是 OS ENTER CRITICA 和 OS EXIT CRITICA 因?yàn)檫@兩個(gè) 宏的定義取決于所用的微處理器 4 1 2 任務(wù)及其任務(wù)控制塊任務(wù)及其任務(wù)控制塊 一個(gè)任務(wù)通常是一個(gè)無限的循環(huán) 一個(gè)任務(wù)看起來像其它 C 的函數(shù)一樣 有函數(shù)返 回類型 有形式參數(shù)變量 但是任務(wù)是絕不會(huì)返回的 故返回參數(shù)必須定義成 void X RTOS 可以管理的任務(wù)數(shù)取決于 cpu 資源的大小 任務(wù)之間的優(yōu)先級(jí)可以相等 也 可以不相等 一旦任務(wù)建立了 任務(wù)控制塊 rtos tcb 將被賦值 圖 4 1 任務(wù)控制塊是 一個(gè)數(shù)據(jù)結(jié)構(gòu) 當(dāng)任務(wù)的 CPU 使用權(quán)被剝奪時(shí) X RTOS 用它來保存該任務(wù)的狀態(tài) 當(dāng)任 務(wù)重新得到 CPU 使用權(quán)時(shí) 任務(wù)控制塊能確保任務(wù)從當(dāng)時(shí)被中斷的那一點(diǎn)絲毫不差地繼 續(xù)執(zhí)行 rtos tcb 全部駐留在 RAM 中 程序清單程序清單4 1 rtos tcb typedef struct rtos tcb rtos type stk rtos tcb stk ptr 堆棧指針 rtos ist t rtos tcb head ist head ist INT8U rtos tcb state 任務(wù)的狀態(tài) rtos type prio rtos tcb prio now 任務(wù)的優(yōu)先級(jí) rtos type prio rtos tcb prio init 任務(wù)初始化的優(yōu)先級(jí) if rtos cyce schedue en 0 INT32U rtos tcb init tick task s tick 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 16 INT32U rtos tcb remaining tick task s remaining tick endif if rtos using event 0 INT32U rtos tcb event set INT8U rtos tcb event info endif INT8U rtos tcb id the task s id number struct rtos timer rtos tcb timer thread timer rtos tcb rtos tcb stk ptr rtos tcb stk ptr 是指向當(dāng)前任務(wù)棧頂?shù)闹羔?X RTOS 允許每個(gè)任務(wù)有自己的棧 尤為重要的是 每個(gè)任務(wù)的棧的容量可以是任意的 有些商業(yè)內(nèi)核要求所有任務(wù)棧的容 量都一樣 除非用戶寫一個(gè)復(fù)雜的接口函數(shù)來改變之 這種限制浪費(fèi)了 RAM 當(dāng)各任務(wù)需 要的??臻g不同時(shí) 也得按任務(wù)中預(yù)期棧容量需求最多的來分配??臻g rtos tcb head ist rtos tcb head ist 是一個(gè)特殊的結(jié)構(gòu)體 他的作用是起到組成雙鏈表的作用 是 從 Linux 中引入的一個(gè)方法 rtos tcb state rtos tcb state 用于存儲(chǔ)任務(wù)的狀態(tài) rtos tcb prio now rtos tcb prio now 代表任務(wù)當(dāng)前的優(yōu)先級(jí) rtos tcb prio init rtos tcb prio init 代表任務(wù)初始化時(shí)的優(yōu)先級(jí) 一般的情況是兩個(gè)優(yōu)先級(jí)是一樣 的 rtos tcb init tick rtos tcb init tick 代表任務(wù)擁有的時(shí)間片 rtos tcb remaining tick rtos tcb remaining tick 代表任務(wù)還剩下的時(shí)間片 rtos tcb event set rtos tcb event set 是留給事件組用的 設(shè)置任務(wù)要等待的事件組的情況 rtos tcb id rtos tcb id 是任務(wù)的標(biāo)號(hào) 是區(qū)分一個(gè)任務(wù)和別的任務(wù)的重要的標(biāo)志 rtos tcb timer rtos tcb timer 是任務(wù)的定時(shí)器 用于任務(wù)定時(shí)和事件等待 4 1 3 就緒表就緒表 每個(gè)任務(wù)被賦予一個(gè)的優(yōu)先級(jí)等級(jí) 從 0 級(jí)到最低優(yōu)先級(jí) OS OWEST PR1O 包括 0 和 OS OWEST PR1O 在內(nèi) 當(dāng) X RTOS 初始化的時(shí)候 最低優(yōu)先級(jí) OS OWEST PR1O 總是被賦給空閑任務(wù) rtos task ide 每個(gè)任務(wù)的就緒態(tài)標(biāo)志都放入就緒表中的 就緒表中有兩個(gè)變量 rtos rdy grp 和 rtos map tbl 在 rtos rdy grp 中 任務(wù)按優(yōu)先級(jí)分組 8 個(gè)任務(wù)為一組 rtos rdy grp 中的每一位表示 8 組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù) 任務(wù)進(jìn)入就緒態(tài)時(shí) 就 緒表 rtos map tbl 中的相應(yīng)元素的相應(yīng)位也置位 就緒表 rtos rdy tbl 數(shù)組的大小取決 于 OS OWEST PR1O 當(dāng)用戶的應(yīng)用程序中任務(wù)數(shù)目比較少時(shí) 減少 OS OWEST PR1O 的值可以降低 X RTOS 對 RAM 數(shù)據(jù)空間 的需求量 為確定下次該哪個(gè)優(yōu)先級(jí)的任務(wù)運(yùn)行了 內(nèi)核調(diào)度器總是將 OS OWEST PR1O 在就 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 17 緒表中相應(yīng)字節(jié)的相應(yīng)位置 1 rtos rdy grp 和 rtos map tbl 之間的關(guān)系見圖 4 1 是按 以下規(guī)則給出的 當(dāng) rtos map tbl 0 中的任何一位是 1 時(shí) rtos rdy grp 的第 0 位置 1 當(dāng) rtos map tbl 1 中的任何一位是 1 時(shí) rtos rdy grp 的第 1 位置 1 當(dāng) rtos map tbl 2 中的任何一位是 1 時(shí) rtos rdy grp 的第 2 位置 1 當(dāng) rtos map tbl 3 中的任何一位是 1 時(shí) rtos rdy grp 的第 3 位置 1 當(dāng) rtos map tbl 4 中的任何一位是 1 時(shí) rtos rdy grp 的第 4 位置 1 當(dāng) rtos map tbl 5 中的任何一位是 1 時(shí) rtos rdy grp 的第 5 位置 1 當(dāng) rtos map tbl 6 中的任何一位是 1 時(shí) rtos rdy grp 的第 6 位置 1 當(dāng) rtos map tbl 7 中的任何一位是 1 時(shí) rtos rdy grp 的第 7 位置 1 圖 4 1 就緒表 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 18 程序清單 4 2 中的代碼用于將任務(wù)放入就緒表 tcbtemp rtos tcb prio now 是某 個(gè)任務(wù)的優(yōu)先級(jí) 程序清單程序清單4 2 把任務(wù)進(jìn)入就緒表把任務(wù)進(jìn)入就緒表 把任務(wù)進(jìn)入就緒表 rtos rdy grp rtos map tbl tcbtemp rtos tcb prio now 3 rtos rdy tbl tcbtemp rtos tcb prio now 3 rtos map tbl tcbtemp rtos tcb prio now 如果一個(gè)任務(wù)被刪除了 則用程序清單 4 3 中的代碼做求反處理 程序清單程序清單4 3 把任務(wù)進(jìn)入就緒表把任務(wù)進(jìn)入就緒表 if rtos ist isempty 以上代碼將就緒任務(wù)表數(shù)組 rtos rdy tbl 中相應(yīng)元素的相應(yīng)位清零 對于 rtos rdy grp 只有當(dāng)被刪除任務(wù)所在任務(wù)組中全組任務(wù)一個(gè)都沒有進(jìn)入就緒態(tài)時(shí) 才將 相應(yīng)位清零 也就是說 rtos rdy tbl task rtos tcb prio now 3 所有的位都是零時(shí) rtos rdy grp 的相應(yīng)位才清零 4 1 4 任務(wù)調(diào)度任務(wù)調(diào)度 X RTOS 總是運(yùn)行進(jìn)入就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的那一個(gè) 確定哪個(gè)任務(wù)優(yōu)先級(jí)最高 下面該哪個(gè)任務(wù)運(yùn)行了的工作是由調(diào)度器 Scheduer 完成的 任務(wù)級(jí)的調(diào)度是由函數(shù) rtos sched 完成的 中斷級(jí)的調(diào)度是由另一個(gè)函數(shù) rtos int exit 完成的 程序清單程序清單4 4 調(diào)度函數(shù)調(diào)度函數(shù) void rtos sched void INT8U y rtos tcb to task OS ENTER CRITICA 1 if rtos int nesting 0 2 rtos prio high rdy INT8U y rtos tcb state rtos prio cur rtos prio high rdy to task rtos tcb state to task rtos tcb state rtos stat run rtos tcb high rdy to task OS TASK SW OS EXIT CRITICA X RTOS 任務(wù)調(diào)度所花的時(shí)間是常數(shù) 與應(yīng)用程序中建立的任務(wù)數(shù)無關(guān) 如程序清 中 4 4 1 條件語句的條件不滿足 任務(wù)調(diào)度函數(shù) rtos sched 將退出 不做任務(wù)調(diào)度 這 個(gè)條件是 如果在中斷服務(wù)子程序中調(diào)用 rtos sched 此時(shí)中斷嵌套層數(shù) rtos int nestin 0 或者由于用戶至少調(diào)用了一次給任務(wù)調(diào)度上鎖函數(shù) rtos ock nest 使 rtos ock nesting 0 如果不是在中斷服務(wù)子程序調(diào)用 rtos sched 并且任務(wù)調(diào)度是允許 的 即沒有上鎖 則任務(wù)調(diào)度函數(shù)將找出那個(gè)進(jìn)入就緒態(tài)且優(yōu)先級(jí)最高的任務(wù) 4 4 2 進(jìn)入就緒態(tài)的任務(wù)在就緒任務(wù)表中有相應(yīng)的位置位 一旦找到那個(gè)優(yōu)先級(jí)最高的任務(wù) rtos sched 檢驗(yàn)這個(gè)優(yōu)先級(jí)最高的任務(wù)是不是當(dāng)前正在運(yùn)行的任務(wù) 以此來避免不必要的 任務(wù)調(diào)度 4 4 3 為實(shí)現(xiàn)任務(wù)切換 rtos tcb high rdy 必須指向優(yōu)先級(jí)最高的那個(gè)任務(wù)控制塊 rtos tcb 任務(wù)切換很簡單 由以下兩步完成 將被掛起任務(wù)的微處理器寄存器推入堆棧 然后將 較高優(yōu)先級(jí)的任務(wù)的寄存器值從棧中恢復(fù)到寄存器中 在 X RTOS 中 就緒任務(wù)的棧結(jié) 構(gòu)總是看起來跟剛剛發(fā)生過中斷一樣 所有微處理器的寄存器都保存在棧中 換句話說 X RTOS 運(yùn)行就緒態(tài)的任務(wù)所要做的一切 只是恢復(fù)所有的 CPU 寄存器并運(yùn)行中斷返回 指令 為了做任務(wù)切換 運(yùn)行 OS TASK SW 人為模仿了一次中斷 4 1 5 空閑任務(wù)空閑任務(wù) 程序清單程序清單4 5 空閑任務(wù)空閑任務(wù) void rtos task ide void pdata pdata pdata whie 1 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 20 rtos ide zhan time 上面的代碼就是系統(tǒng)的空閑任務(wù) rtos task idle X RTOS 總是建立一個(gè)空閑任務(wù) 這個(gè)任務(wù)在沒有其它任務(wù)進(jìn)入就緒態(tài)時(shí)投入運(yùn)行 這個(gè)空閑任務(wù)永遠(yuǎn)設(shè)為最低優(yōu)先級(jí) 即 OS OWEST PRI0 空閑任務(wù) rtos task idle 什么也不做 只是在不停地給一個(gè) 32 位 的名叫 OSIdeCtr 的計(jì)數(shù)器加 1 注意空閑任務(wù)不可能被應(yīng)用軟件刪除 4 2 任務(wù)管理任務(wù)管理 任務(wù)可以是一個(gè)無限的循環(huán) 任務(wù)看起來與任何 C 函數(shù)一樣 具有一個(gè)返回類型和 一個(gè)參數(shù) 只是它從不返回 任務(wù)的返回類型必須被定義成 void 型 4 2 1 建立任務(wù)建立任務(wù) 想讓 X RTOS 管理用戶的任務(wù) 用戶必須要先建立任務(wù) 用戶可以通過傳遞任務(wù)地 址和其它參數(shù)到以下這個(gè)函數(shù)來建立任務(wù) rtos task create 任務(wù)可以在多任務(wù)調(diào)度開 始前建立 也可以在其它任務(wù)的執(zhí)行過程中被建立 在開始多任務(wù)調(diào)度 即調(diào)用 rtos start 前 用戶必須建立至少一個(gè)任務(wù) 任務(wù)不能由中斷服務(wù)程序 ISR 來建立 rtos task create 的代碼如下 從中可以知道 rtos task create 需要六個(gè)參數(shù) tcb 是任務(wù)控制塊的指針 task 是任務(wù)代碼的指針 pdata 是當(dāng)任務(wù)開始執(zhí)行時(shí)傳遞給任務(wù)的 參數(shù)的指針 ptos 是分配給任務(wù)的堆棧的棧頂指針 prio 是分配給任務(wù)的優(yōu)先級(jí) tick 是 給任務(wù)的時(shí)間片 程序清單程序清單4 6 建立任務(wù)建立任務(wù) rtos type err rtos task create rtos tcb tcb void task void pd void pdata rtos type stk ptos INT8U prio INT32U tick rtos type stk stktemp rtos type err err if prio rtos owest prio 1 return rtos err prio invaid OS ENTER CRITICA 煙臺(tái)大學(xué)畢業(yè)論文 設(shè)計(jì) 21 stktemp rtos type stk rtos task stk init task pdata ptos 0 2 err rtos tcb init tcb pr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論