uCOS II 基礎入門教程 十)

2021-09-10 02:56:15 字數 2392 閱讀 5856

每個任務都有自己的堆疊空間。堆疊必須宣告為os_stk型別,並且由連續的記憶體空間組成

。使用者可以靜態分配堆疊空間(在編譯的時候分配)也可以動態地分配堆疊空間(在執行的時候分配)。靜態堆疊宣告如程式,這兩種宣告應放置在函式的外面。

靜態堆疊

static os_stk mytaskstack[stack_size];

使用者可以用c編譯器提供的malloc()函式來動態地分配堆疊空間

,如程式清單所示。在動態分配中,使用者要時刻注意記憶體碎片問題。

特別是當使用者反覆地建立和刪除任務時,記憶體堆中可能會出現大量的記憶體碎片,導致沒有足夠大的一塊連續記憶體區域可用作任務堆疊,這時malloc()便無法成功地為任務分配堆疊空間。

用malloc()

為任務分配堆疊空間

os_stk  *pstk;

pstk = (os_stk *)malloc(stack_size);

if (pstk != (os_stk *)0)

圖表示了一塊能被malloc()動態分配的3k位元組的記憶體堆[(1)]。假定建立三個任務(任務a,b和c),每個任務需要1k位元組的空間。設第乙個1k位元組給任務a,第二個1k位元組給任務b, 第三個1k位元組給任務c[(2)]。然後,使用者的應用程式刪除任務a和任務c,用free()函式釋放記憶體到記憶體堆中[(3)]。現在,使用者的記憶體堆雖有2k位元組的自

由記憶體空間,但它是不連續的,所以使用者不能建立另乙個需要2k位元組記憶體的任務(即任務d)

。如果使用者並不會去刪除任務,使用malloc()是非常可行的。

圖 f4.1        記憶體碎片

µc/os-ⅱ支援的處理器的堆疊既可以從上(高位址)往下(低位址)長也可以從下往上長。使用者在呼叫ostaskcreate()或ostaskcreateext()的時候必須知道堆疊是怎樣長的,因為使用者必須得把堆疊的棧頂傳遞給以上兩個函式,當os_cpu.**件中的os_stk_growth置為0時,

使用者需要將堆疊的最低記憶體位址傳遞給任務建立函式。

堆疊從下往上遞增

os_stk taskstack[task_stack_size];

ostaskcreate(task, pdata, &taskstack[0], prio);

當os_cpu.**件中的os_stk_growth置為1時,使用者需要將堆疊的最高記憶體位址傳遞給任務建立函式,如程式清單4.8所示。

程式清單 l4.8 堆疊從上往下遞減

os_stk taskstack[task_stack_size];

ostaskcreate(task, pdata, &taskstack[task_stack_size-1], prio);

這個問題會影響**的可移植性。如果使用者想將**從支援往下遞減堆疊的處理器中移植到支援往上遞增堆疊的處理器中的話,使用者得使**同時適應以上兩種情況。在這種特殊情況下,重新寫成如程式所示的形式。

對兩個方向增長的堆疊都提供支援

os_stk taskstack[task_stack_size];

#if os_stk_growth == 0

ostaskcreate(task, pdata, &taskstack[0], prio);

#else

ostaskcreate(task, pdata, &taskstack[task_stack_size-1], prio);

#endif

任務所需的堆疊的容量是由應用程式指定的

。使用者在指定堆疊大小的時候必須考慮使用者的任務所呼叫的所有函式的巢狀情況,任務所呼叫的所有函式會分配的區域性變數的數目,以及所有可能的中斷服務例程巢狀的堆疊需求。另外,使用者的堆疊必須能儲存所有的cpu暫存器。

ucos-ii 基礎入門教程(一)

ucos-ii 基礎入門教程(二)

ucos-ii 基礎入門教程(三)

ucos-ii 基礎入門教程(四)

ucos-ii 基礎入門教程(五)

ucos-ii 基礎入門教程(六)

ucos-ii 基礎入門教程(七)

ucos-ii 基礎入門教程(八)

ucos-ii 基礎入門教程(九)

Robotframework 入門教程(十)

關鍵字的分層 上圖是我實際使用中建立關鍵字的層次關係,baselib提供與sut互動的最基本的方法,projectlib可以通過呼叫或繼承自baselib類,提供一些通用的關鍵字。因為我用rf是做介面測試,舉例來說我的baselib提供了傳送請求的send方法,和一些隨機生成名字,計算md5的工具方...

c 入門教程 十

事前日常敲黑板 1 到上節結束,常用的迴圈和判斷算是結束了。每種判斷結構和迴圈結構都類似於流程圖中的某一塊特定方式的組合。前面說過,程式設計就是把我們的思路用電腦理解的語言告訴電腦。而流程圖就可以被看作是我們的思路。在流程圖中,我們可以把它們像拼積木一樣拼在一起來解決問題,在實際的程式,它們也是可以...

C 入門教程(十) for 語句

小古銀的官方 完整教程 鞏固練習 用 for 語句實現 接下來講解的是迴圈中的for語句。for int i 0 i 10 i 上面的變數i作用域只在for迴圈裡面。for後面的 內分成3部分,用分號 隔開 第一部分是用來寫初始化語句的 第二部分是判斷條件,是否繼續迴圈就看這裡 第三部分一般寫對變數...