BLOG記事用論壇

 找回密碼
 註冊
搜索
熱搜:
查看: 915|回復: 0

OSTaskStkInit_FPE_x86 OSCreateTaskExt

[複製鏈接]
發表於 2023-6-5 22:34:24 | 顯示全部樓層 |閱讀模式

OSTaskStkInit_FPE_x86
OSTaskStkInit_FPE_x86 是 µC/OS-II 的一個函數,其主要目的是在初始化任務堆棧的同時為浮點數支持做準備。此函數是為在 x86 架構下使用浮點數的任務所設計的。

在 µC/OS-II 中,每一個任務都有自己的堆棧,用於存儲其運行狀態,包括 CPU 寄存器的值,本地變量等。這些信息在任務被切換出 CPU(上下文切換)時被保存,以便在任務再次運行時恢復。對於使用浮點數的任務,還需要保存和恢復浮點寄存器的狀態。這就是為什麼需要特殊的初始化函數 OSTaskStkInit_FPE_x86。

具體來說,OSTaskStkInit_FPE_x86 函數執行以下操作:

初始化堆棧,就像 OSTaskStkInit 一樣。

在堆棧上留出額外的空間,用於保存浮點寄存器的狀態。

此函數的基本原型為:


void* OSTaskStkInit_FPE_x86(void (*task)(void* pd), void* pdata, OS_STK* ptos, INT32U opt)
參數包括:
task: 這是一個指向任務函數的指針。
pdata: 這是一個指向將傳遞給任務的參數的指針。
ptos: 這是一個指向堆棧頂部的指針。
opt: 這是用於配置堆棧的選項。
注意,這個函數是特定於 x86 架構和 µC/OS-II 的。不是所有的實時操作系統或硬件平台都需要或支持這樣的特殊堆棧初始化函數。

OSCreateTaskExt
在 µC/OS-II 中,OSTaskCreateExt 是一個函數,用於創建並初始化新的任務。這個函數為創建的任務分配了所需的資源,並將其添加到可調度的任務列表中。 OSTaskCreateExt 提供了額外的功能,可以用於設定任務的堆棧大小,堆棧檢查和堆棧清零。

函數原型如下:

INT8U OSTaskCreateExt(void (*task)(void *pd),
                      void *pdata,
                      OS_STK *ptos,
                      INT8U prio,
                      INT16U id,
                      OS_STK *pbos,
                      INT32U stk_size,
                      void *pext,
                      INT16U opt)
參數解釋:

task: 一個函數指針,指向實現任務的函數。
pdata: 一個指向將傳遞給任務的數據的指針。
ptos: 一個指向任務堆棧頂部的指針。
prio: 新任務的優先級。
id: 新任務的唯一標識符。
pbos: 一個指向任務堆棧底部的指針。
stk_size: 堆棧大小,以堆棧寬度為單位。
pext: 一個指向附加的用戶數據的指針。
opt: 選項字段,可以用來指定一些額外的任務配置。例如,可以設置 OS_TASK_OPT_STK_CHK 選項來開啟堆棧溢出檢查,或設置 OS_TASK_OPT_STK_CLR 選項來將任務堆棧初始化為 0。
返回值:如果成功創建任務,返回 OS_ERR_NONE。如果出錯,返回錯誤代碼。

注意,創建任務後,任務將處於就緒狀態,等待調度器調度。在調用 OSStart() 啟動任務調度之前,新創建的任務不會開始執行。


OSCreateTaskExt函數允許我們在任務創建時進行一些擴展設置,其中一個重要的設置就是堆棧的檢查。當設置了 OS_TASK_OPT_STK_CHK 標誌時,這個檢查就會在任務創建時被觸發,這是一個可選的安全特性,能夠幫助開發者提前發現和預防堆棧溢出的問題。

堆棧溢出的檢查主要是比較堆棧底部(bos)和堆棧頂部(tos)之間的距離是否小於預設的堆棧長度。如果該條件成立,那麼就認為堆棧已經溢出。這個檢查的主要目的是防止任務在運行時超出其分配的堆棧空間,因為這會導致未定義的行為,如數據破壞,當前任務或其他任務的異常終止等。

堆棧在程序運行時有多種用途,比如存儲局部變量,存儲過程調用的參數,或者作為中斷服務程序(ISR)的臨時存儲空間。

需要注意的是,雖然在任務創建時可以進行堆棧檢查,但是uC/OS-II並不提供自動的堆棧檢查機制。也就是說,除了在任務創建時和調用OSTaskStkCheck()函數時進行檢查外,開發者需要自己確保任務在運行過程中不會引發堆棧溢出。

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|綜合討論區

GMT+8, 2026-6-24 18:46 , Processed in 0.040772 second(s), 9 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表