• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 詳解μC/OS-II如何檢測任務(wù)堆棧實(shí)際使用情況

    詳解μC/OS-II如何檢測任務(wù)堆棧實(shí)際使用情況

    作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
    不少屌絲同學(xué)都有類似經(jīng)歷吧,在使用ucosii創(chuàng)建任務(wù)時(shí),關(guān)于任務(wù)堆棧大小設(shè)為多大合適搞的不清不楚,郁悶之下就隨便整個(gè)數(shù),比如就1024吧,呵呵,反正也沒見得出問題,那就不多想了。

    我想大多數(shù)同學(xué)都是這樣做的吧。這樣只是因?yàn)樵谝话闱闆r下,1024確實(shí)已經(jīng)足夠大了,堆棧溢出的可能性很小而已。那么,如果你任務(wù)實(shí)際使用率只有很小的 百分之幾,一旦被你知道了,你會(huì)痛心不?我想你不痛心,μC/OS-II也會(huì)痛心的,它會(huì)覺得這個(gè)coder真是浪費(fèi)啊,哈哈!順便提醒下大家,堆和棧是 完全不同的兩個(gè)概念,出于國內(nèi)習(xí)慣,還是稱之為堆棧罷了!

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

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

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

    (1)OSTaskCreate() //創(chuàng)建普通任務(wù)

    由于重點(diǎn)在下面的創(chuàng)建擴(kuò)展任務(wù)函數(shù),故本函數(shù)就不多說了!確實(shí),要想實(shí)現(xiàn)檢測目標(biāo)任務(wù)棧實(shí)際使用情況的功能,是不能使用這個(gè)函數(shù)來創(chuàng)建目標(biāo)任務(wù)的,必須使用OSTaskCreateExt() 。

    (2)OSTaskCreateExt() //創(chuàng)建擴(kuò)展任務(wù)

    函數(shù)接口原型為:

    #if OS_TASK_CREATE_EXT_EN > 0
    INT8U OSTaskCreateExt

    (

    void (*task)(void *pd), //建立擴(kuò)展任務(wù)(任務(wù)代碼指針
    void *pdata, //傳遞參數(shù)指針
    OS_STK *ptos, //分配任務(wù)堆棧棧頂指針
    INT8U prio, //分配任務(wù)優(yōu)先級(jí)
    INT16U id, //(未來的)優(yōu)先級(jí)標(biāo)識(shí)(與優(yōu)先級(jí)相同)
    OS_STK *pbos, //分配任務(wù)堆棧棧底指針
    INT32U stk_size, //指定堆棧的容量(檢驗(yàn)用)
    void *pext, //指向用戶附加的數(shù)據(jù)域的指針
    INT16U opt //建立任務(wù)設(shè)定選項(xiàng)

    )
    #endif

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

    不錯(cuò),檢測任務(wù)堆棧實(shí)際使用情況正是用的這個(gè)函數(shù),下面來本函數(shù)的接口原型:

    INT8U OSTaskStkChk

    (

    INT8U prio, //待測任務(wù)的優(yōu)先級(jí)

    OS_STK_DATA *pdata //指向一個(gè)類型為OS_STK_DATA的結(jié)構(gòu)體

    )

    3、再次需要知道一個(gè)結(jié)構(gòu)體:

    #if OS_TASK_CREATE_EXT_EN > 0
    typedef struct

    {
    INT32U OSFree; //堆棧中未使用的字節(jié)數(shù)
    INT32U OSUsed; //堆棧中已使用的字節(jié)數(shù)
    } OS_STK_DATA;
    #endif

    參數(shù): prio 為指定要獲取堆棧信息的任務(wù)優(yōu)先級(jí),也可以指定參數(shù)OS_PRIO_SELF,獲取調(diào)用任務(wù)本身的
    信息。
    pdata 指向一個(gè)類型為OS_STK_DATA的數(shù)據(jù)結(jié)構(gòu),其中包含如下信息:
    INT32U OSFree; // 堆棧中未使用的字節(jié)數(shù)
    INT32U OSUsed; // 堆棧中已使用的字節(jié)數(shù)

    4、有了上述三個(gè)知識(shí)點(diǎn)后就可以啦,具體方法為:

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

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

    (3)調(diào)用函數(shù)OSTaskStkChk(TestTaskPRIO, &StackBytes)

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

    StackBytes.OSUsed的值即為被測任務(wù)堆棧已使用的字節(jié)數(shù)。

    5、需要設(shè)置宏:OS_TASK_OPT_STK_CLR為1

    6、最后一點(diǎn)建議:

    (1)將被測任務(wù)經(jīng)歷最壞的堆棧使用狀態(tài),測出來的使用率才可靠

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

    (3)最好在工程中單獨(dú)建立一個(gè)優(yōu)先級(jí)較低延時(shí)較長的任務(wù)來測試其它任務(wù)的堆棧使用情況,不用時(shí)可以掛起該任務(wù)



    關(guān)鍵詞: μCOS-II檢測任務(wù)堆

    評(píng)論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 永嘉县| 钦州市| 高安市| 探索| 乐平市| 贵定县| 五原县| 若羌县| 呼和浩特市| 吉首市| 扎兰屯市| 乌苏市| 蒲城县| 自贡市| 普格县| 孝感市| 沁阳市| 马龙县| 梨树县| 潼南县| 娱乐| 丰镇市| 肇东市| 特克斯县| 临西县| 格尔木市| 秦皇岛市| 祁东县| 琼海市| 巴林右旗| 乌海市| 丹凤县| 巴中市| 永州市| 来安县| 泸定县| 饶阳县| 斗六市| 大洼县| 台州市| 马边|