北航《嵌入式系統(tǒng)》課件-第九章
《北航《嵌入式系統(tǒng)》課件-第九章》由會(huì)員分享,可在線閱讀,更多相關(guān)《北航《嵌入式系統(tǒng)》課件-第九章(101頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、嵌 入 式 系 統(tǒng) RTEOS C/OS-II 的 移 植2006年 6月 9日 主 要 內(nèi) 容n移 植 規(guī) 劃nC/OS-II的 移 植n嵌 入 式 系 統(tǒng) 的 初 始 化 移 植 規(guī) 劃 -概 述 所 謂 “ 移 植 ” , 就 是 使 一 個(gè) 實(shí) 時(shí) 內(nèi) 核 能 在 其 它的 微 處 理 器 或 微 控 制 器 上 運(yùn) 行 。 盡 管 大 部 分 C/OS-II的 代 碼 是 用 C語(yǔ) 言 編 寫(xiě) 的 ,但 是 在 編 寫(xiě) 與 處 理 器 硬 件 相 關(guān) 的 代 碼 時(shí) 還 是 不 得 不使 用 匯 編 語(yǔ) 言 。 移 植 的 主 要 工 作 就 是 編 寫(xiě) 這 些 與 處 理 器 硬
2、件 相關(guān) 的 代 碼 。 操 作 系 統(tǒng) 的 移 植 大 體 可 以 分 為 兩 個(gè) 層 次 :n跨 體 系 結(jié) 構(gòu) 的 移 植n針 對(duì) 特 定 處 理 器 的 移 植 移 植 規(guī) 劃 在 移 植 前 針 對(duì) 所 使 用 的 微 處 理 器進(jìn) 行 規(guī) 劃 , 主 要 有 以 下 幾 個(gè) 方 面 的考 慮 :n 編 譯 器 的 選 擇n 任 務(wù) 模 式 的 選 擇 n 支 持 的 指 令 集 移 植 規(guī) 劃 ( 續(xù) )編 譯 器 的 選 擇n針 對(duì) ARM處 理 器 核 的 C語(yǔ) 言 編 譯 器 有 很 多 , 如 SDT、 ADS、 IAR、 TASKING和 GCC等n目 前 在 國(guó) 內(nèi) 最
3、 流 行 的 是 ADS、 SDT和 GCCnSDT和 ADS均 為 ARM公 司 自 己 開(kāi) 發(fā) , ADS為 SDT的 升 級(jí)版 , 以 后 ARM公 司 不 再 支 持 SDT, 故 不 選 擇 SDT。 GCC雖 然 支 持 廣 泛 , 很 多 開(kāi) 發(fā) 套 件 使 用 它 作 為 編 譯 器 , 但 是 與ADS比 較 其 編 譯 效 率 較 低 , 這 對(duì) 充 分 發(fā) 揮 芯 片 性 能 不 利n考 慮 使 用 ADS編 譯 程 序 和 調(diào) 試 ARM的 工 作 模 式n ARM處 理 器 有 7種 操 作 模 式 :n 用 戶 模 式 (usr)n - 正 常 的 程 序 執(zhí) 行
4、模 式n 快 速 中 斷 模 式 (fiq) - 支 持 高 速 數(shù) 據(jù) 傳 輸 或 通 道 處 理n 中 斷 模 式 (irq) - 用 于 通 用 中 斷 處 理 n 管 理 員 模 式 (svc) - 操 作 系 統(tǒng) 的 保 護(hù) 模 式 .n 中 止 模 式 (abt) - 支 持 虛 擬 內(nèi) 存 和 /或 內(nèi) 存 保 護(hù) 等 異 常n 系 統(tǒng) 模 式 (sys) - 支 持 操 作 系 統(tǒng) 的 特 殊 用 戶 模 式 (運(yùn) 行 操 作 系 統(tǒng) 任 務(wù) )n 未 定 義 模 式 (und) - 支 持 硬 件 協(xié) 處 理 器 的 軟 件 仿 真 n 除 了 用 戶 模 式 外 , 其 他
5、 模 式 均 可 視 為 特 權(quán) 模 式 移 植 規(guī) 劃 ( 續(xù) )n 任 務(wù) 模 式 的 取 舍 ARM7處 理 器 核 具 有 上 述 七 種 模 式 , 其 中 除 用 戶模 式 外 其 它 均 為 特 權(quán) 模 式 。 其 中 管 理 、 中 止 、 未 定 義 、中 斷 和 快 中 斷 模 式 與 相 應(yīng) 異 常 相 聯(lián) 系 , 任 務(wù) 使 用 這 些模 式 不 太 適 合 。 系 統(tǒng) 模 式 除 了 是 特 權(quán) 模 式 外 , 其 它 與 用 戶 模 式 一 樣 ,因 而 可 選 為 任 務(wù) 使 用 的 模 式 只 有 用 戶 模 式 和 系 統(tǒng) 模 式 。 為 了 盡 量 減 少
6、任 務(wù) 代 碼 錯(cuò) 誤 對(duì) 整 個(gè) 程 序 的 影 響 , 缺省 的 任 務(wù) 模 式 定 為 用 戶 模 式 , 可 選 為 系 統(tǒng) 模 式 , 同 時(shí)提 供 接 口 使 任 務(wù) 可 以 在 這 兩 種 模 式 間 切 換 。 移 植 規(guī) 劃 ( 續(xù) )n 支 持 的 指 令 集帶 T變 量 的 ARM7處 理 器 核 具 有 兩 個(gè) 指 令 集 :n標(biāo) 準(zhǔn) 32位 ARM指 令 集n16位 Thumb指 令 集 兩 種 指 令 集 有 不 同 的 應(yīng) 用 范 圍 。n為 了 最 大 限 度 地 支 持 芯 片 的 特 性 , 任 務(wù) 應(yīng) 當(dāng) 可 以 使用 任 意 一 個(gè) 指 令 集 并 可
7、以 自 由 切 換 , 而 且 不 同 的 任 務(wù)應(yīng) 當(dāng) 可 以 使 用 不 同 的 指 令 集 移 植 C/OS-IIn 概 述 要 移 植 一 個(gè) 操 作 系 統(tǒng) 到 一 個(gè) 特 定 的 CPU體 系 結(jié)構(gòu) 并 不 是 一 件 很 容 易 的 事 情 , 它 對(duì) 移 植 者 有 以 下要 求 :1 對(duì) 目 標(biāo) 體 系 結(jié) 構(gòu) 要 有 很 深 了 解 ;2 對(duì) OS原 理 要 有 較 深 入 的 了 解 ;3 對(duì) 所 使 用 的 編 譯 器 要 有 較 深 入 的 了 解 ;4 對(duì) 需 要 移 植 的 操 作 系 統(tǒng) 要 有 相 當(dāng) 的 了 解 ;5 對(duì) 具 體 使 用 的 芯 片 也 要
8、一 定 的 了 解 要 移 植 一 個(gè) 操 作 系 統(tǒng) 到 一 個(gè) 特 定 的 CPU體 系 結(jié) 構(gòu)上 并 不 是 一 件 很 容 易 的 事 情 , 它 對(duì) 移 植 者 有 以 下 要 求 :1 對(duì) 目 標(biāo) 體 系 結(jié) 構(gòu) 要 有 很 深 了 解 ;2 對(duì) OS原 理 要 有 較 深 入 的 了 解 ;3 對(duì) 所 使 用 的 編 譯 器 要 有 較 深 入 的 了 解 ;4 對(duì) 需 要 移 植 的 操 作 系 統(tǒng) 要 有 相 當(dāng) 的 了 解 ;5 對(duì) 具 體 使 用 的 芯 片 也 要 一 定 的 了 解 。 概 述 要 移 植 一 個(gè) 操 作 系 統(tǒng) 到 一 個(gè) 特 定 的 CPU體 系
9、結(jié) 構(gòu)上 并 不 是 一 件 很 容 易 的 事 情 , 它 對(duì) 移 植 者 有 以 下 要 求 :1 對(duì) 目 標(biāo) 體 系 結(jié) 構(gòu) 要 有 很 深 了 解 ;2 對(duì) OS原 理 要 有 較 深 入 的 了 解 ;3 對(duì) 所 使 用 的 編 譯 器 要 有 較 深 入 的 了 解 ;4 對(duì) 需 要 移 植 的 操 作 系 統(tǒng) 要 有 相 當(dāng) 的 了 解 ;5 對(duì) 具 體 使 用 的 芯 片 也 要 一 定 的 了 解 。參 考 ARM公 司 的 ARM體 系 結(jié) 構(gòu) 文 檔參 考 嵌 入 式 實(shí) 時(shí) 操 作 系 統(tǒng) C/OS-II 一 書(shū)參 考 ADS軟 件 自 帶 的 編 譯 器 和 連 接
10、器 手 冊(cè) 參 考 嵌 入 式 實(shí) 時(shí) 操 作 系 統(tǒng) C/OS-II 一 書(shū)參 考 具 體 芯 片 的 數(shù) 據(jù) 手 冊(cè) 和 使 用 手 冊(cè)因 為 第 4點(diǎn) 的 影 響 是 全 局 性 的 , 它 決 定 移 植 代 碼 的 框 架 和 功 能 。所 以 重 點(diǎn) 介 紹 第 4點(diǎn) 。 主 要 內(nèi) 容n移 植 規(guī) 劃nC/OS-II的 移 植n嵌 入 式 系 統(tǒng) 的 初 始 化 C/OS-II的 文 件 結(jié) 構(gòu) C/OS-II移 植 應(yīng) 用 程 序( 用 戶 代 碼 )C/OS-II( 與 處 理 器 無(wú) 關(guān) 代 碼 )OS_CORE.cOS_FLAG.c. C/OS-II配 置( 與 應(yīng) 用
11、相 關(guān) )OS_CFG.HINCLUDES.H C/OS-II移 植( 與 處 理 器 相 關(guān) 代 碼 ) CPU定 時(shí) 器 硬 件軟 件 C/OS-II硬 件 軟 件 體 系 結(jié) 構(gòu) 用 于 產(chǎn) 生系 統(tǒng) 時(shí) 鐘移 植 時(shí) 需 要編 寫(xiě) 的 代 碼 移 植 C/OS-II滿 足 的 條 件 n 處 理 器 的 C編 譯 器 能 產(chǎn) 生 可 重 入 代 碼 n 在 程 序 中 可 以 打 開(kāi) 或 者 關(guān) 閉 中 斷 n 處 理 器 支 持 中 斷 , 并 且 能 產(chǎn) 生 定 時(shí) 中 斷 ( 通 常 在 10100Hz之 間 ) n 處 理 器 支 持 能 夠 容 納 一 定 量 數(shù) 據(jù) 的 硬
12、 件 堆 棧 ( 通 常 是 幾千 字 節(jié) ) n 處 理 器 有 將 堆 棧 指 針 和 其 他 CPU寄 存 器 的 內(nèi) 容 存 儲(chǔ) 和 讀出 到 堆 棧 ( 或 者 內(nèi) 存 ) 的 指 令 什 么 是 可 重 入 代 碼 n 可 重 入 的 代 碼 指 的 是 一 段 可 以 被 多 個(gè) 任務(wù) 同 時(shí) 調(diào) 用 , 而 不 必 擔(dān) 心 會(huì) 破 壞 數(shù) 據(jù) 的代 碼 ( 比 如 : 一 個(gè) 函 數(shù) )n 即 : 可 重 入 型 函 數(shù) 在 任 何 時(shí) 候 都 可 以 被中 斷 執(zhí) 行 , 過(guò) 一 段 時(shí) 間 以 后 又 可 以 繼 續(xù)運(yùn) 行 , 而 不 會(huì) 因 為 在 函 數(shù) 中 斷 的 時(shí)
13、 候 被其 他 的 任 務(wù) 重 新 調(diào) 用 , 而 影 響 函 數(shù) 中 的數(shù) 據(jù) 可 重 入 代 碼 舉 例程 序 1: 可 重 入 型 函 數(shù)void swap(int *x, int *y) int temp;temp=*x;*x=*y;*y=temp; 非 可 重 入 代 碼 舉 例程 序 2: 非 可 重 入 型 函 數(shù)int temp;void swap(int *x, int *y) temp=*x;*x=*y;*y=temp; 不 可 重 入 函 數(shù) 被 中 斷 破 壞 如 何 使 函 數(shù) 具 有 可 重 入 性 使 Swap()函 數(shù) 具 有 可 重 入 性 的 條 件 :n
14、把 Temp定 義 為 局 部 變 量n 調(diào) 用 Swap()函 數(shù) 之 前 關(guān) 中 斷 , 調(diào) 用 后 再 開(kāi) 中 斷 n 用 信 號(hào) 量 禁 止 該 函 數(shù) 在 使 用 過(guò) 程 中 被 再 次 調(diào) 用 概 述 根 據(jù) C/OS-II的 要 求 , 移 植 C/OS-II到 一 個(gè) 新 的 體系 結(jié) 構(gòu) 上 需 要 提 供 2個(gè) 或 3個(gè) 文 件 : OS_CPU.H(C語(yǔ) 言 頭 文 件 ) OS_CPU_C.C(C程 序 源 文 件 ) OS_CPU_A.ASM( 匯 編 程 序 源 文 件 ) 其 中 OS_CPU_A.ASM在 某 些 情 況 下 不 需 要 , 但 極其 罕 見(jiàn) 。
15、 不 需 要 OS_CPU_A.ASM的 必 須 滿 足 以 下 苛刻 條 件 : 1.可 以 直 接 使 用 C語(yǔ) 言 開(kāi) 關(guān) 中 斷 ; 2.可 以 直 接 使 用 C語(yǔ) 言 編 寫(xiě) 中 斷 服 務(wù) 程 序 ; 3.可 以 直 接 使 用 C語(yǔ) 言 操 作 堆 棧 指 針 ; 4.可 以 直 接 使 用 C語(yǔ) 言 保 存 CPU的 所 有 寄 存 器 。 移 植 需 要 編 寫(xiě) 的 文 件 概 述移 植 內(nèi) 容 類 型 所 屬 文 件 描 述BOOLEAN、 INT8U、 INT8S、 數(shù) 據(jù) 類 型 OS_CPU.H 與 編 譯 器 無(wú) 關(guān) 的 數(shù) 據(jù) 類 型OS_STK 數(shù) 據(jù) 類 型
16、 OS_CPU.H 堆 棧 的 數(shù) 據(jù) 類 型OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL() 宏 OS_CPU.H 開(kāi) 關(guān) 中 斷 的 代 碼OS_STK_GROWTH 常 量 OS_CPU.H 定 義 堆 棧 的 增 長(zhǎng) 方 向OS_TASK_SW 函 數(shù) OS_CPU.H 任 務(wù) 切 換 時(shí) 執(zhí) 行 的 代 碼OSTaskStkInit() 函 數(shù) OS_CPU_C.C 任 務(wù) 堆 棧 初 始 化 函 數(shù)OSInitHookBegin()、 OSInitHookEnd()、 函 數(shù) OS_CPU_C.C C/OS-II在 執(zhí) 行 某 些 操 作 時(shí)調(diào) 用 的
17、用 戶 函 數(shù) , 一 般 為 空OSStartHighRdy() 函 數(shù) *OS_CPU_A.ASM 進(jìn) 入 多 任 務(wù) 環(huán) 境 時(shí) 運(yùn) 行 優(yōu) 先級(jí) 最 高 的 任 務(wù) , OSIntCtxSw() 函 數(shù) *OS_CPU_A.ASM 中 斷 退 出 時(shí) 的 任 務(wù) 切 換 函 數(shù)OSTickISR() 中 斷 服 務(wù) 程 序 *OS_CPU_A.ASM 時(shí) 鐘 節(jié) 拍 中 斷 服 務(wù) 程 序 實(shí) 際 上 , 還 有 一 個(gè) 文 件 很 重 要 , 它 就 是 IRQ.INC, 它 定 義 了 一 個(gè) 匯 編 宏 ,它 是 C/OS-II for ARM7通 用 的 中 斷 服 務(wù) 程 序
18、 的 匯 編 與 C函 數(shù) 接 口 代 碼 。 時(shí) 鐘節(jié) 拍 中 斷 服 務(wù) 程 序 也 沒(méi) 有 移 植 , 因 為 其 與 芯 片 和 應(yīng) 用 都 強(qiáng) 烈 相 關(guān) , 需 要 用 戶 自己 編 寫(xiě) , 不 過(guò) 可 以 通 過(guò) IRQ.INC簡(jiǎn) 化 用 戶 代 碼 的 編 寫(xiě) 。 移 植 代 碼 包 括 的 主 要 內(nèi) 容 關(guān) 于 頭 文 件 includes.h和 config.hn C/OS-II要 求 所 有 .C文 件 的 都 要 包 含 頭 文 件 includes.h, 這 樣 使得 用 戶 項(xiàng) 目 中 的 每 個(gè) .C文 件 不 用 分 別 去 考 慮 它 實(shí) 際 上 需 要 哪
19、 些 頭文 件 。n 使 用 INCLUDES.H的 缺 點(diǎn) 是 它 可 能 會(huì) 包 含 一 些 實(shí) 際 不 相 關(guān) 的 頭文 件 , 這 意 味 著 每 個(gè) 文 件 的 編 譯 時(shí) 間 可 能 會(huì) 增 加 , 但 卻 增 強(qiáng) 了 代碼 的 可 移 植 性 。 在 移 植 中 另 外 增 加 了 一 個(gè) 頭 文 件 config.h, 要 求 所 有 用 戶 程 序必 須 包 含 config.h, 在 config.h中 包 含 includes.h和 特 定 的 頭 文 件 和配 置 項(xiàng) 。 而 C/OS-II的 系 統(tǒng) 文 件 依 然 只 是 包 含 includes.h, 即C/OS-
20、II的 系 統(tǒng) 文 件 完 全 不 必 改 動(dòng) 。 所 有 的 配 置 改 變 包 括 頭 文 件的 增 減 均 在 config.h中 進(jìn) 行 , 而 includes.h定 下 來(lái) 后 不 必 改 動(dòng)( C/OS-II的 系 統(tǒng) 文 件 需 要 包 含 的 東 西 是 固 定 的 ) 。 這 樣 ,C/OS-II的 系 統(tǒng) 文 件 需 要 編 譯 的 次 數(shù) 大 大 減 少 , 編 譯 時(shí) 間 隨 之 減 少 。 congfig.hUC/OS內(nèi) 核 文 件 Includes.h 用 戶 程 序 設(shè) 置 與 處 理 器 和 編 譯 器 相 關(guān) 的 代 碼n OS_CPU.H中 定 義 了 與
21、 編 譯 器 相 關(guān) 的 數(shù)據(jù) 類 型 。 比 如 : INT8U、 INT8S等 。n 與 ARM處 理 器 相 關(guān) 的 代 碼 , 使 用OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 宏 開(kāi) 啟 關(guān) 閉 中斷n 設(shè) 置 堆 棧 的 增 長(zhǎng) 方 向 : 堆 棧 由 高 地 址向 低 地 址 增 長(zhǎng) 編 寫(xiě) OS_CPU.H C/OS-II使 用 結(jié) 構(gòu) 常 量 OS_STK_GROWTH中 指 定 堆 棧 的生 長(zhǎng) 方 式 :置 OS_STK_GROWTH為 0表 示 堆 棧 從 下 往 上 長(zhǎng) 。 置 OS_STK_GROWTH為 1表 示 堆 棧 從 上
22、 ( 高 地 址 ) 往 下( 低 地 址 ) 長(zhǎng) 。 雖 然 ARM處 理 器 核 對(duì) 于 兩 種 方 式 均 支 持 , 但 ADS的 C語(yǔ) 言編 譯 器 僅 支 持 一 種 方 式 , 即 從 上 往 下 長(zhǎng) , 并 且 必 須 是 滿 遞 減 堆棧 , 所 以 OS_STK_GROWTH的 值 為 1。#define OS_STK_GROWTH 1 堆 棧 生 長(zhǎng) 方 式 編 寫(xiě) OS_CPU.H C/OS-II不 使 用 C語(yǔ) 言 中 的 short、 int、 long等 數(shù) 據(jù) 類 型 的 定 義 ,因 為 它 們 與 處 理 器 類 型 有 關(guān) , 隱 含 著 不 可 移 植
23、性 。 代 之 以 移 植 性強(qiáng) 的 整 數(shù) 數(shù) 據(jù) 類 型 , 這 樣 , 既 直 觀 又 可 移 植 , 不 過(guò) 這 就 成 了 必 須移 植 的 代 碼 。 根 據(jù) ADS編 譯 器 的 特 性 , 這 些 代 碼 如 下 程 序 清 單 所示 ( 與 編 譯 有 關(guān) ) 。typedefunsigned char BOOLEAN; typedefunsigned char INT8U;typedefsigned char INT8S;typedefunsigned short INT16U;typedefsigned short INT16S;typedefunsigned int I
24、NT32U;typedefsigned int INT32S; typedeffloat FP32;typedefdouble FP64;typedefINT32U OS_STK; 不 依 賴 于 編 譯 的 數(shù) 據(jù) 類 型 設(shè) 置 includes.htypedef unsigned char BOOLEAN;typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned int INT16U; typedef signed int INT16S; typedef unsigned long INT32U; t
25、ypedef signed long INT32S; typedef float FP32; typedef double FP64; typedef unsigned long OS_STK; typedef unsigned long OS_CPU_SR; extern int INTS_OFF(void); extern void INTS_ON(void);#define OS_ENTER_CRITICAL() cpu_sr = INTS_OFF(); #define OS_EXIT_CRITICAL() if(cpu_sr = 0) INTS_ON(); #define OS_STK
26、_GROWTH 1 /*從 高 向 低 */ 程 序 狀 態(tài) 寄 存 器 ( CPSR)n 條 件 位 :n N = 1-結(jié) 果 為 負(fù) ,0-結(jié) 果 為 正 或 0 n Z = 1-結(jié) 果 為 0,0-結(jié) 果 不 為 0n C =1-進(jìn) 位 , 0-借 位n V =1-結(jié) 果 溢 出 , 0結(jié) 果 沒(méi) 溢 出n Q 位 :n 僅 ARM 5TE/J架 構(gòu) 支 持n 指 示 增 強(qiáng) 型 DSP指 令 是 否 溢 出 n J 位n 僅 ARM 5TE/J架 構(gòu) 支 持n J = 1: 處 理 器 處 于 Jazelle狀 態(tài) n 中 斷 禁 止 位 :n I = 1: 禁 止 IRQ.n F =
27、 1: 禁 止 FIQ.n T Bitn 僅 ARM xT架 構(gòu) 支 持n T = 0: 處 理 器 處 于 ARM 狀 態(tài)n T = 1: 處 理 器 處 于 Thumb 狀 態(tài)n Mode位 (處 理 器 模 式 位 ):n 0b10000 Usern 0b10001 FIQn 0b10010 IRQn 0b10011 Supervisorn 0b10111 Abortn 0b11011 Undefinedn 0b11111 System 2731N Z C V Q28 67I F T mode1623 815 5 4 024fsxc U n d e f i n e dJ 編 寫(xiě) OS_C
28、PU.H C/OS-II運(yùn) 行 時(shí) , 處 理 器 可 能 處 于 的 模 式 如 下 圖 所 示 :使 用 軟 中 斷 SWI作 底 層 接 口Thumb指 令 集ARM指 令 集用 戶 模 式 系 統(tǒng) 模 式用 戶 任 務(wù) 使 用的 處 理 器 模 式 ARM7內(nèi) 核 具 有 的 指 令 集ARM指 令用 戶 模 式ARM指 令系 統(tǒng) 模 式 Thumb指 令系 統(tǒng) 模 式Thumb指 令用 戶 模 式 編 寫(xiě) OS_CPU.H 為 了 使 底 層 接 口 函 數(shù) 與 處 理 器 狀 態(tài) 無(wú) 關(guān) , 同 時(shí) 在 任 務(wù) 調(diào) 用相 應(yīng) 的 函 數(shù) 不 需 要 知 道 函 數(shù) 位 置 , 在
29、移 植 中 使 用 軟 中 斷 指 令SWI作 為 底 層 接 口 , 使 用 不 同 的 功 能 號(hào) 區(qū) 分 不 同 的 函 數(shù) 。 軟 中斷 功 能 號(hào) 分 配 如 下 表 所 示 , 未 列 出 的 為 保 留 功 能 。 使 用 軟 中 斷 SWI作 底 層 接 口功 能 號(hào) 接 口 函 數(shù) 簡(jiǎn) 介0 x00 void OS_TASK_SW(void) 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 _OSStartHighRdy(void) 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由 OSStartHighRdy產(chǎn) 生 0 x02 void OS_ENTER_CRITICAL(voi
30、d) 關(guān) 中 斷0 x03 Void OS_EXIT_CRITICAL(void) 開(kāi) 中 斷0 x80 Void ChangeToSYSMode(void) 任 務(wù) 切 換 到 系 統(tǒng) 模 式0 x81 Void ChangeToUSRMode(void) 任 務(wù) 切 換 到 用 戶 模 式0 x82 Void TaskIsARM(INT8U prio) 任 務(wù) 代 碼 是 ARM代 碼0 x83 Void TaskIsTHUMB(INT8U prio) 任 務(wù) 代 碼 是 THUMB代 碼 編 寫(xiě) OS_CPU.H 用 軟 中 斷 作 為 操 作 系 統(tǒng) 的 底 層 接 口 就 需 要 在
31、 C語(yǔ) 言 中 使 用SWI( SoftWare Interrupt) 指 令 。 在 ADS中 , 有 一 個(gè) 關(guān) 鍵 字_swi, 用 它 聲 明 一 個(gè) 不 存 在 的 函 數(shù) , 則 調(diào) 用 這 個(gè) 函 數(shù) 就 在 調(diào)用 這 個(gè) 函 數(shù) 的 地 方 插 入 一 條 SWI指 令 , 并 且 可 以 指 定 功 能 號(hào) 。同 時(shí) , 這 個(gè) 函 數(shù) 也 可 以 有 參 數(shù) 和 返 回 值 , 其 傳 遞 規(guī) 則 與 一 般 函數(shù) 相 同 。 使 用 軟 中 斷 SWI作 底 層 接 口/* 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù) */_swi(0 x00) void OS_TASK_SW(v
32、oid); /* 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) */_swi(0 x01) void _OSStartHighRdy(void); /* 關(guān) 中 斷 */_swi(0 x02) void OS_ENTER_CRITICAL(void); /* 開(kāi) 中 斷 */_swi(0 x03) void OS_EXIT_CRITICAL(void); /* 任 務(wù) 切 換 到 系 統(tǒng) 模 式 */_swi(0 x80) void ChangeToSYSMode(void); /* 任 務(wù) 切 換 到 用 戶 模 式 */_swi(0 x81) void ChangeToUSRMode(void)
33、; /* 任 務(wù) 代 碼 是ARM代 碼 */_swi(0 x82) void TaskIsARM(INT8U prio);/* 任 務(wù) 代 碼 是THUMB代 碼 */_swi(0 x83) void TaskIsTHUMB(INT8U prio);程 序 中 調(diào) 用 軟中 斷 時(shí) 使 用 的函 數(shù) 名軟 件 中 斷 號(hào)該 調(diào) 用 不 返回 參 數(shù) 編 寫(xiě) OS_CPU_C.Cn C/OS-II的 移 植 要 求 用 戶 編 寫(xiě) 10個(gè) C函 數(shù) :n OSTaskStkInit( ) : OSTaskCreat( ) 和 OSTaskCreatExt( ) 通 過(guò) 調(diào) 用 本 函 數(shù) ,
34、初 始 化 任 務(wù) 的 棧 結(jié) 構(gòu)n OSTaskCreateHook( ) : 每 當(dāng) 添 加 任 務(wù) 時(shí) 由 OS_TCBInit( )函 數(shù) 調(diào) 用 n OSTaskDelHook( ) : 任 務(wù) 被 刪 除 后 由 OSTaskDel( ) 調(diào) 用n OSTaskSwHook( ) : 任 務(wù) 切 換 時(shí) 兩 種 情 況 均 會(huì) 調(diào) 用 該 函 數(shù)n OSTaskIdleHook( ) : OSTaskIdle( ) 函 數(shù) 可 調(diào) 用 該 函 數(shù) 實(shí) 現(xiàn) CPU低 功 耗 模 式n OSTimeTickHook( ) : 本 函 數(shù) 在 每 個(gè) 時(shí) 鐘 節(jié) 拍 都 會(huì) 被 OSTi
35、meTick( ) 調(diào) 用n OSInitHookBegin( ) : 進(jìn) 入 OSInit( ) 函 數(shù) 后 本 函 數(shù) 會(huì) 立 即 被 調(diào) 用n OSInitHookEnd( ) : OSInit( ) 函 數(shù) 返 回 之 前 被 調(diào) 用n OSTCBInitHook( ) : OS_TCBInit( )在 調(diào) 用 OSTaskCreateHook( ) 之 前 將 先 調(diào) 用 本 函 數(shù) n 唯 一 必 要 的 函 數(shù) 是 OStaskStkInit( ) , 其 他 9個(gè) 函 數(shù) 必 須 聲 明 , 但 不 一 定要 包 含 任 何 代 碼 編 寫(xiě) OS_CPU_C.C 該 函 數(shù) 用
36、 于 初 始 化 任 務(wù) 堆 棧 , 使 任 務(wù) 的 堆 棧 看 起 來(lái) 就 像 剛發(fā) 生 中 斷 一 樣 。 即 任 務(wù) 被 執(zhí) 行 時(shí) , 就 像 從 中 斷 返 回 一 樣 。 在 編 寫(xiě) 此 函 數(shù) 之 前 , 必 須 先 確 定 任 務(wù) 的 堆 棧 結(jié) 構(gòu) 。 而 任 務(wù)的 堆 棧 結(jié) 構(gòu) 是 與 CPU的 體 系 結(jié) 構(gòu) 、 編 譯 器 有 密 切 的 關(guān) 聯(lián) 。 本 移植 的 堆 棧 結(jié) 構(gòu) 如 下 圖 所 示 。 OSTaskStkInit( )任 務(wù) 入 棧 的其 它 數(shù) 據(jù) LRR12R11R10R9R8. 棧 底 任 務(wù) 環(huán) 境 開(kāi) 始 SPPCR2R1R0OSEnter
37、Sum空 閑 空 間 編 寫(xiě) OS_CPU_C.COSTaskStkInit( )OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) OS_STK *stk; opt = opt; stk = ptos; *stk = (OS_STK) task; *-stk = (OS_STK) task; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-st
38、k = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = (unsigned int) pdata; *-stk = (USER_USING_MODE|0 x00); *-stk = 0; return (stk); 入 棧 的 數(shù) 據(jù)任 務(wù) 入 棧 的其 它 數(shù) 據(jù)LRR12R11R10R9R8. 棧 底 任 務(wù) 環(huán) 境 開(kāi) 始 SPPCR2R1R0OSEnterSum空 閑 空 間 編 寫(xiě) OS_CPU_C.COSTaskStkInit( )OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pda
39、ta, OS_STK *ptos, INT16U opt) OS_STK *stk; opt = opt; stk = ptos; *stk = (OS_STK) task; *-stk = (OS_STK) task; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = (unsigned int) pdata; *-stk = (USER_USING_MODE|0
40、x00); *-stk = 0; return (stk); 該 數(shù) 據(jù) 比 較 特 別 , 它 用 于 保 存 該 任 務(wù) 關(guān) 中 斷 的 次 數(shù) ,它 在 調(diào) 用 OS_ENTER_CRITICAL( )時(shí) 加 1, 在 調(diào) 用OS_EXIT_CRITICAL( )時(shí) 減 1。 這 樣 每 個(gè) 任 務(wù) 都 可 以 獨(dú) 立 控 制 本 任 務(wù) 的 中 斷 允 許 狀態(tài) , 而 不 會(huì) 影 響 其 它 任 務(wù) 的 中 斷 允 許 狀 態(tài) 。 因 此 關(guān) 中 斷和 開(kāi) 中 斷 就 可 以 嵌 套 。 編 寫(xiě) OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序 操 作 系 統(tǒng) 與 硬 件
41、相 關(guān) 的 底 層 函 數(shù) 使 用 軟 件 中 斷 作 為 接 口 , 如 下表 所 示 。n 移 植 代 碼 中 一 個(gè) 重 要 的 工 作 就 是 為 這 些 軟 件 中 斷 編 寫(xiě) 服 務(wù) 程 序功 能 號(hào) 接 口 函 數(shù) 簡(jiǎn) 介0 x00 void OS_TASK_SW(void) 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 _OSStartHighRdy(void) 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由 OSStartHighRdy產(chǎn) 生0 x02 void OS_ENTER_CRITICAL(void) 關(guān) 中 斷 0 x03 Void OS_EXIT_CRITICAL(
42、void) 開(kāi) 中 斷0 x80 Void ChangeToSYSMode(void) 任 務(wù) 切 換 到 系 統(tǒng) 模 式0 x81 Void ChangeToUSRMode(void) 任 務(wù) 切 換 到 用 戶 模 式0 x82 Void TaskIsARM(INT8U prio) 任 務(wù) 代 碼 是 ARM代 碼0 x83 Void TaskIsTHUMB(INT8U prio) 任 務(wù) 代 碼 是 THUMB代 碼 編 寫(xiě) OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的
43、 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式 0 x81 任 務(wù) 切 換 到 用 戶 模 式0 x82 任 務(wù) 代 碼 是 ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代 碼功 能 號(hào) 接 口 函 數(shù) 簡(jiǎn) 介0 x00 void OS_TASK_SW(void) 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 _OSStartHighRdy(void) 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由 OSStartHighRdy產(chǎn) 生0 x02 void OS_ENTER_CRITICAL(vo
44、id) 關(guān) 中 斷0 x03 Void OS_EXIT_CRITICAL(void) 開(kāi) 中 斷0 x80 Void ChangeToSYSMode(void) 任 務(wù) 切 換 到 系 統(tǒng) 模 式0 x81 Void ChangeToUSRMode(void) 任 務(wù) 切 換 到 用 戶 模 式0 x82 Void TaskIsARM(INT8U prio) 任 務(wù) 代 碼 是 ARM代 碼0 x83 Void TaskIsTHUMB(INT8U prio) 任 務(wù) 代 碼 是 THUMB代 碼void SWI_Exception(int SWI_Num, int *Regs) OS_TCB
45、*ptcb; switch(SWI_Num) case 0 x02: / 關(guān) 中 斷 . case 0 x03: / 開(kāi) 中 斷 . case 0 x80: / 任 務(wù) 切 換 到 系 統(tǒng) 模 式 . case 0 x81: / 任 務(wù) 切 換 到 用 戶 模 式 . case 0 x82: / 任 務(wù) 代 碼 是ARM代 碼 . case 0 x83: / 任 務(wù) 代 碼 是Thumb代 碼 . default: 這 兩 個(gè) 軟 件 中 斷 使用 匯 編 代 碼 完 成 編 寫(xiě) OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切 換
46、 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式 0 x81 任 務(wù) 切 換 到 用 戶 模 式0 x82 任 務(wù) 代 碼 是 ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代 碼 C/OS-II的 啟 動(dòng) 多 任 務(wù) 環(huán) 境 的函 數(shù) 叫 做 OSStart(), 用 戶 在 調(diào) 用OSStart()之 前 , 必 須 已 經(jīng) 建 立 了 一 個(gè)或 更 多 任 務(wù) 。 OSStart()最 終 調(diào) 用 函 數(shù)OSStartHighRdy()運(yùn) 行
47、 多 任 務(wù) 啟 動(dòng) 前優(yōu) 先 級(jí) 最 高 的 任 務(wù) 。 void OSStartHighRdy(void) _OSStartHighRdy(); 該 函 數(shù) 在 Os_cpu_a.s文 件 中 實(shí) 現(xiàn) 。 編 寫(xiě) OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式 0 x81 任 務(wù) 切 換 到 用 戶 模 式0 x82 任 務(wù) 代 碼 是
48、ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代 碼 關(guān) 中 斷 和 開(kāi) 中 斷 是 為 了 保 護(hù) 臨 界段 代 碼 。 這 些 代 碼 與 處 理 器 有 關(guān) , 是需 要 移 植 的 代 碼 。 在 ARM處 理 器 核中 關(guān) 中 斷 和 開(kāi) 中 斷 時(shí) 通 過(guò) 改 變 程 序 狀態(tài) 寄 存 器 CPSR中 的 相 應(yīng) 控 制 位 實(shí) 現(xiàn) 。由 于 使 用 了 軟 件 中 斷 , 程 序 狀 態(tài) 寄 存器 CPSR保 存 到 程 序 狀 態(tài) 保 存 寄 存 器SPSR中 , 軟 件 中 斷 退 出 時(shí) 會(huì) 將 SPSR恢 復(fù) 到 CPSR中 , 所 以 程 序 只 要 改 變程
49、序 狀 態(tài) 保 存 寄 存 器 SPSR中 的 相 應(yīng)的 控 制 位 就 可 以 了 。 編 寫(xiě) OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式 0 x81 任 務(wù) 切 換 到 用 戶 模 式0 x82 任 務(wù) 代 碼 是 ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代 碼void SWI_Exception(int SWI_Num
50、, int *Regs) . case 0 x02: / 關(guān) 中 斷 _asm MRS R0,SPSR ORR R0,R0,#NoInt MSR SPSR_c,R0 OsEnterSum+; break; case 0 x03: / 開(kāi) 中 斷 if (-OsEnterSum = 0) _asm MRS R0,SPSR BIC R0,R0,#NoInt MSR SPSR_c,R0 break; .每 關(guān) 閉 一 次 中 斷 , 中斷 關(guān) 閉 計(jì) 數(shù) 器 加 1每 調(diào) 用 一 次 開(kāi) 中 斷 函數(shù) , 該 計(jì) 數(shù) 器 減 1, 為0時(shí) 允 許 打 開(kāi) 中 斷 關(guān) 閉 中 斷打 開(kāi) 中 斷 編 寫(xiě)
51、 OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式 0 x81 任 務(wù) 切 換 到 用 戶 模 式0 x82 任 務(wù) 代 碼 是 ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代 碼 它 們 可 以 在 任 何 情 況 下 使 用 。 它們 改 變 程 序 狀 態(tài) 保 留 寄 存 器 SPSR的 相應(yīng) 位 段 , 而 程 序 狀 態(tài) 保
52、 留 寄 存 器 會(huì) 在軟 件 中 斷 退 出 時(shí) 復(fù) 制 到 程 序 狀 態(tài) 寄 存器 CPSR, 任 務(wù) 的 處 理 器 模 式 就 改 變了 。 編 寫(xiě) OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式 0 x81 任 務(wù) 切 換 到 用 戶 模 式0 x82 任 務(wù) 代 碼 是 ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代
53、碼void SWI_Exception(int SWI_Num, int *Regs) . case 0 x80: / 任 務(wù) 切 換 到 系 統(tǒng) 模 式 _asm MRS R0,SPSR BIC R0,R0,#0 x1f ORR R0,R0,#SYS32Mode MSR SPSR_c,R0 break; case 0 x81: / 任 務(wù) 切 換 到 用 戶 模 式 _asm MRS R0,SPSR BIC R0,R0,#0 x1f ORR R0,R0,#USR32Mode MSR SPSR_c,R0 break; .使 用 內(nèi) 嵌 匯 編 將 處 理 器 模 式 切 換 到用 戶 模 式使
54、 用 內(nèi) 嵌 匯 編 將 處 理 器 模 式 切 換 到系 統(tǒng) 模 式 編 寫(xiě) OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式0 x81 任 務(wù) 切 換 到 用 戶 模 式 0 x82 任 務(wù) 代 碼 是 ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代 碼 任 務(wù) 可 以 使 用 ARM的 兩 種 指 令 集 的任 意 一 種 運(yùn)
55、行 , 但 是 任 務(wù) 建 立 時(shí) 默 認(rèn) 的只 是 一 種 指 令 集 。 如 果 任 務(wù) 使 用 的 第 一條 指 令 與 默 認(rèn) 的 指 令 集 不 同 , 則 程 序 運(yùn)行 錯(cuò) 誤 。 所 以 增 加 兩 個(gè) 函 數(shù) TaskIsARM()和 TaskIsTHUMB()用 于 改 變 任 務(wù) 建 立 時(shí)默 認(rèn) 的 指 令 集 。 它 們 都 有 唯 一 的 參 數(shù) : 需 要 改 變 的任 務(wù) 的 優(yōu) 先 級(jí) , 值 得 注 意 的 是 , 這 兩 個(gè)函 數(shù) 必 須 在 相 應(yīng) 的 任 務(wù) 建 立 后 但 還 沒(méi) 有運(yùn) 行 時(shí) 調(diào) 用 。 編 寫(xiě) OS_CPU_C.C 軟 件 中 斷
56、異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切 換 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式 0 x81 任 務(wù) 切 換 到 用 戶 模 式0 x82 任 務(wù) 代 碼 是 ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代 碼 . case 0 x82: / 任 務(wù) 代 碼 是ARM代 碼 if (Regs0 OSTCBStkPtr1 break; case 0 x83: / 任 務(wù) 代 碼 是Thumb代 碼 if
57、 (Regs0 OSTCBStkPtr1 |= (1 5); break; .被 設(shè) 置 的 任 務(wù) 號(hào) 一 定 不能 大 于 最 低 優(yōu) 先 級(jí) 任 務(wù)獲 取 指 定 任 務(wù) 的 任 務(wù) 控制 塊 的 地 址 修 改 任 務(wù) 堆 棧 中 CPSR的 值 ,在 任 務(wù) 重 新 運(yùn) 行 時(shí) , 切 換 到ARM指 令 方 式修 改 任 務(wù) 堆 棧 中 CPSR的 值 ,在 任 務(wù) 重 新 運(yùn) 行 時(shí) , 切 換 到Thumb指 令 方 式CPSR: 程 序 狀 態(tài) 寄 存 器 編 寫(xiě) OS_CPU_C.C軟 件 中 斷 異 常 服 務(wù) 程 序功 能 號(hào) 簡(jiǎn) 介0 x00 任 務(wù) 級(jí) 任 務(wù) 切
58、換 函 數(shù)0 x01 運(yùn) 行 優(yōu) 先 級(jí) 最 高 的 任 務(wù) ,由OSStartHighRdy產(chǎn) 生0 x02 關(guān) 中 斷0 x03 開(kāi) 中 斷 0 x80 任 務(wù) 切 換 到 系 統(tǒng) 模 式0 x81 任 務(wù) 切 換 到 用 戶 模 式0 x82 任 務(wù) 代 碼 是 ARM代 碼0 x83 任 務(wù) 代 碼 是 THUMB代 碼 注 意 : 這 兩 個(gè) 函 數(shù) 必 須 在 相 應(yīng) 的 任 務(wù) 建 立 后 但 還沒(méi) 有 運(yùn) 行 時(shí) 調(diào) 用 。 如 果 在 低 優(yōu) 先 級(jí) 的 任 務(wù) 中 創(chuàng) 建 高 優(yōu) 先 級(jí) 的任 務(wù) 就 十 分 危 險(xiǎn) 了 。 此 時(shí) , 解 決 的 方 法 有 三 種 :(
59、1)高 優(yōu) 先 級(jí) 任 務(wù) 使 用 默 認(rèn) 的 指 令 集 ;(2)改 變 函 數(shù)OSTaskCreateHook()使任 務(wù) 默 認(rèn) 不 是 處 于 就 緒 狀 態(tài) , 建 立 任務(wù) 后 調(diào) 用 函 數(shù)OSTaskResume()來(lái) 使任 務(wù) 進(jìn) 入 就 緒 狀 態(tài) ;(3)建 立 任 務(wù) 時(shí) 禁 止 任 務(wù) 切 換 , 調(diào) 用 函 數(shù) TaskIsARM()或TaskIsTHUMB()后 再 允 許 任 務(wù) 切 換 。 編 寫(xiě) OS_CPU_C.C 在 Os_cpu_c.c文 件 中 還 有 許 多 Hook( ) 函 數(shù) , 它 們 在 某 個(gè)特 定 的 系 統(tǒng) 動(dòng) 作 時(shí) 被 調(diào) 用
60、, 允 許 執(zhí) 行 函 數(shù) 中 的 用 戶 代 碼 。 這 些函 數(shù) 默 認(rèn) 是 空 函 數(shù) , 用 戶 根 據(jù) 實(shí) 際 情 況 添 加 相 關(guān) 代 碼 。 它 們 分別 如 下 表 所 示 。 Hook( )函 數(shù)函 數(shù) 名 被 執(zhí) 行 條 件OSInitHookBegin( ) 在 開(kāi) 始 執(zhí) 行 OSInit( )函 數(shù) 時(shí) 被 執(zhí) 行OSInitHookEnd( ) 在 OSInit()函 數(shù) 結(jié) 束 時(shí) 被 執(zhí) 行OSTaskCreateHook( ) 在 任 務(wù) 建 立 時(shí) 被 調(diào) 用OSTaskDelHook( ) 在 任 務(wù) 刪 除 時(shí) 被 調(diào) 用 OSTaskSwHook(
61、) 在 進(jìn) 行 任 務(wù) 切 換 時(shí) 被 調(diào) 用OSTaskStatHook( ) 被 統(tǒng) 計(jì) 任 務(wù) 調(diào) 用 , 每 秒 執(zhí) 行 一 次OSTCBInitHook( ) 在 建 立 所 有 的 TCB后 , 由 OSTCBInit函 數(shù) 調(diào) 用OSTimeTickHook( ) 每 個(gè) 時(shí) 鐘 節(jié) 拍 產(chǎn) 生 后 被 調(diào) 用OSTaskIdleHook( ) 由 空 閑 任 務(wù) 調(diào) 用 移 植 C/OS-IIn 編 寫(xiě) OS_CPU_A.ASM在 OS_CPU_A.ASM文 件 中 有 :n軟 件 中 斷 的 匯 編 接 口 程 序n任 務(wù) 切 換 程 序nOS啟 動(dòng) 時(shí) 運(yùn) 行 就 緒 最
62、高 優(yōu) 先 級(jí) 任 務(wù) 的 程 序 OS_CPU_A.ASMn C/OS-II的 移 植 要 求 用 戶 編 寫(xiě) 4個(gè) 匯 編 語(yǔ) 言 函數(shù) : n OSStartHighRdy( )n OSCtxSw( ) n OSIntCtxSw( )n OSTickISR( )n 如 果 編 譯 器 支 持 插 入 行 匯 編 代 碼 , 就 可 以 將 所有 與 處 理 器 相 關(guān) 的 代 碼 放 到 OS_CPU_C.C文 件 中 ,而 不 必 再 有 單 獨(dú) 的 匯 編 語(yǔ) 言 文 件 編 寫(xiě) OS_CPU_A.ASM 在 調(diào) 用 軟 中 斷 之 后 , 處 理 器 切 換 到 ARM指 令 和
63、管 理 模 式 下工 作 。 在 執(zhí) 行 軟 件 中 斷 服 務(wù) 函 數(shù) 之 前 , 要 提 取 中 斷 號(hào) 和 其 它 入口 參 數(shù) , 這 些 通 過(guò) 軟 件 中 斷 接 口 程 序 完 成 。軟 件 中 斷 匯 編 接 口SoftwareInterrupt LDR SP, StackSvc STMFD SP!, R0-R3, R12, LR MOV R1, SP MRS R3, SPSR TST R3, #T_bit LDRNEH R0, LR,#-2 BICNE R0, R0, #0 xff00 LDREQ R0, LR,#-4 BICEQ R0, R0, #0 xFF000000 C
64、MP R0, #1 LDRLO PC, =OSIntCtxSw LDREQ PC, =_OSStartHighRdy BL SWI_Exception LDMFD SP!, R0-R3, R12, PC 保 護(hù) 被 中 斷 的 現(xiàn) 場(chǎng)將 要 用 到 的 寄 存 器 壓 棧判 斷 中 斷 前 的 指 令 集 類 型從 產(chǎn) 生 軟 件 中 斷的 指 令 中 提 取中 斷 號(hào)ARMThumb根 據(jù) 不 同 的 中 斷 號(hào) 執(zhí)行 不 同 的 程 序返 回 被 中 斷 的 任 務(wù)中 斷 號(hào) 執(zhí) 行 程 序0 進(jìn) 行 任 務(wù) 切 換1 啟 動(dòng) 多 任 務(wù) 環(huán) 境 , 運(yùn)行 就 緒 的 最 高 優(yōu) 先 級(jí)任
65、 務(wù)其 它 軟 件 中 斷 服 務(wù) 函 數(shù) 編 寫(xiě) OS_CPU_A.ASM C/OS-II是 搶 占 式 實(shí) 時(shí) 操 作 系 統(tǒng) , 得 到 運(yùn)行 的 始 終 是 就 緒 條 件 下 最 高 優(yōu) 先 級(jí) 的 任 務(wù) 。當(dāng) 處 于 運(yùn) 行 狀 態(tài) 的 任 務(wù) 因 為 某 種 原 因 進(jìn) 入 就緒 態(tài) , 或 者 有 其 它 更 高 優(yōu) 先 級(jí) 的 任 務(wù) 進(jìn) 入 就緒 態(tài) , 操 作 系 統(tǒng) 內(nèi) 核 就 要 運(yùn) 行 別 的 就 緒 任 務(wù) ,這 時(shí) 需 要 進(jìn) 行 任 務(wù) 切 換 。 任 務(wù) 切 換 代 碼 編 寫(xiě) OS_CPU_A.ASM 任 務(wù) 切 換 代 碼任 務(wù) 切 換 可 能 發(fā) 生
66、 的 情 況 有 兩 種 : 1.當(dāng) 前 運(yùn) 行 的 任 務(wù) 主 動(dòng) 交 出 CPU控 制 權(quán) ,通 常 發(fā) 生 在 等 待 某 個(gè) 事 件 或 是 調(diào) 用 系 統(tǒng)延 時(shí) 。 調(diào) 用 函 數(shù) OS_TASK_SW( ) 2.發(fā) 生 中 斷 , 使 更 高 優(yōu) 先 級(jí) 的 任 務(wù) 進(jìn)入 就 緒 狀 態(tài) , 內(nèi) 核 剝 奪 當(dāng) 前 任 務(wù) 的 運(yùn) 行資 格 。 即 發(fā) 生 在 中 斷 退 出 時(shí) 。 調(diào) 用 函 數(shù)OSIntCtxSw( ) SPSR: 程 序 狀 態(tài) 保 留 寄 存 器CPSR: 當(dāng) 前 程 序 狀 態(tài) 寄 存 器 編 寫(xiě) OS_CPU_A.ASM 雖 然 OS_TASK_SW( )和 OSIntCtxSw( )的 執(zhí) 行 條 件 不 同 , 但是 它 們 的 功 能 相 同 , 只 要 稍 作 處 理 就 可 以 它 們 共 用 一 段 任 務(wù) 切換 代 碼 。 這 些 處 理 就 是 保 證 在 執(zhí) 行 任 務(wù) 切 換 前 兩 者 的 任 務(wù) 現(xiàn) 場(chǎng)是 一 致 的 。 共 同 執(zhí) 行 的 任 務(wù) 切 換 代 碼 是 “ OSIntCtxSw” 其 中 OS_TASK_
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案