新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 詳解μC/OS-II如何檢測任務堆棧實際使用情況

        詳解μC/OS-II如何檢測任務堆棧實際使用情況

        作者: 時間:2016-11-27 來源:網絡 收藏
        不少屌絲同學都有類似經歷吧,在使用ucosii創建任務時,關于任務堆棧大小設為多大合適搞的不清不楚,郁悶之下就隨便整個數,比如就1024吧,呵呵,反正也沒見得出問題,那就不多想了。

        我想大多數同學都是這樣做的吧。這樣只是因為在一般情況下,1024確實已經足夠大了,堆棧溢出的可能性很小而已。那么,如果你任務實際使用率只有很小的 百分之幾,一旦被你知道了,你會痛心不?我想你不痛心,μC/OS-II也會痛心的,它會覺得這個coder真是浪費啊,哈哈!順便提醒下大家,堆和棧是 完全不同的兩個概念,出于國內習慣,還是稱之為堆棧罷了!

        本文引用地址:http://www.104case.com/article/201611/322517.htm

        下面,我就來告訴大家怎么知道運行中任務的堆棧實際使用情況,然后就知道應該分配多少堆棧大小合適了!開始正題。

        1、首先需要知道,μC/OS-II中創建任務的函數有兩個: OSTaskCreate()和OSTaskCreateExt()

        (1)OSTaskCreate() //創建普通任務

        由于重點在下面的創建擴展任務函數,故本函數就不多說了!確實,要想實現檢測目標任務棧實際使用情況的功能,是不能使用這個函數來創建目標任務的,必須使用OSTaskCreateExt() 。

        (2)OSTaskCreateExt() //創建擴展任務

        函數接口原型為:

        #if OS_TASK_CREATE_EXT_EN > 0
        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 //建立任務設定選項

        )
        #endif

        2、其次需要知道μC/OS-II中有這么個函數:OSTaskStkChk()

        不錯,檢測任務堆棧實際使用情況正是用的這個函數,下面來本函數的接口原型:

        INT8U OSTaskStkChk

        (

        INT8U prio, //待測任務的優先級

        OS_STK_DATA *pdata //指向一個類型為OS_STK_DATA的結構體

        )

        3、再次需要知道一個結構體:

        #if OS_TASK_CREATE_EXT_EN > 0
        typedef struct

        {
        INT32U OSFree; //堆棧中未使用的字節數
        INT32U OSUsed; //堆棧中已使用的字節數
        } OS_STK_DATA;
        #endif

        參數: prio 為指定要獲取堆棧信息的任務優先級,也可以指定參數OS_PRIO_SELF,獲取調用任務本身的
        信息。
        pdata 指向一個類型為OS_STK_DATA的數據結構,其中包含如下信息:
        INT32U OSFree; // 堆棧中未使用的字節數
        INT32U OSUsed; // 堆棧中已使用的字節數

        4、有了上述三個知識點后就可以啦,具體方法為:

        (1)將函數的最后一個參數opt 設置為:OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR

        (2)定義一個變量:OS_STK_DATA StackBytes;

        (3)調用函數OSTaskStkChk(TestTaskPRIO, &StackBytes)

        (4)StackBytes.OSFree的值即為被測任務堆棧未使用的字節數,

        StackBytes.OSUsed的值即為被測任務堆棧已使用的字節數。

        5、需要設置宏:OS_TASK_OPT_STK_CLR為1

        6、最后一點建議:

        (1)將被測任務經歷最壞的堆棧使用狀態,測出來的使用率才可靠

        (2)堆棧使用率最好在P~?之間,太小浪費空間,太大不安全

        (3)最好在工程中單獨建立一個優先級較低延時較長的任務來測試其它任務的堆棧使用情況,不用時可以掛起該任務



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 莱芜市| 偃师市| 明星| 平乡县| 昌吉市| 巫溪县| 桦南县| 莒南县| 海南省| 平阳县| 探索| 西华县| 宾阳县| 开远市| 叙永县| 九龙县| 安岳县| 荣昌县| 汶上县| 乌兰浩特市| 宜宾县| 拜城县| 固始县| 珲春市| 大名县| 武山县| 合川市| 顺义区| 大新县| 昭苏县| 汤原县| 柘城县| 西宁市| 稷山县| 孟州市| 呈贡县| 甘泉县| 白河县| 嘉义县| 河西区| 威宁|