在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > UCOS操作系統(tǒng)堆棧淺談

            UCOS操作系統(tǒng)堆棧淺談

            作者: 時間:2016-12-01 來源:網(wǎng)絡 收藏
            1 聲明堆棧大小
            在uc/os-ii操作系統(tǒng)的任務切換和中斷處理過程中,需要保存處理器的內(nèi)部寄存器和變量的值,這就
            要求每個任務都有自己的堆??臻g。堆棧必須聲明為OS_STK類型,并且由連續(xù)的內(nèi)存空間組成,可以靜態(tài)
            分配空間(在編譯時分配),也可以動態(tài)分配堆??臻g(在運行時分配)。由于采用動態(tài)分配方式,會導致
            內(nèi)存中含有大量內(nèi)存碎片,因此不推薦使用動態(tài)分配方式。其兩種聲明方式如下:
            靜態(tài)分配方式:
            static OS_STK TaskStk[StkSize];
            或者
            OS_STK TaskStk[StkSize];
            動態(tài)分配方式:
            OS_STK *pstk;
            pstk = (OS_STK*)malloc(StkSize);
            if(pstk != (OS_STK*)0) //判斷堆棧分配是否成功
            {
            printf("Create TaskStk Success");
            }
            2 設置堆棧生產(chǎn)方向
            uc/os-ii操作系統(tǒng)支持2中堆棧生長方向。即可從高地址往低地址生長,也可以由低地址往高地址生長。
            在調(diào)用OSTaskCreate()或者OSTaskCreateExt()創(chuàng)建任務的時候由于必須知道堆棧的生長方向,所以要在OS_CPU.H
            文件中設置任務堆棧的生長方向。
            #define OS_STK_GROWTH 1 //設置堆棧是從上往下長的
            OSTaskCreate(Task,pdata,&TaskStk[StkSize - 1],prio);
            或者
            #define OS_STK_GROWTH 0 //設置堆棧是從下往上長的
            OSTaskCreate(Task,pdata,&TaskStk[0],prio);
            當然也可以這樣編寫創(chuàng)建任務的以支持堆棧的從上往下和從下往上生長
            #if OS_STK_GROWTH == 1
            OSTaskCreate(Task,pdata,&TaskStk[StkSize - 1],prio);
            #else
            OSTaskCreate(Task,pdata,&TaskStk[0],prio);
            #endif
            3 堆棧檢驗
            為控制產(chǎn)品成本,有時需要確定任務實際需要的堆??臻g的大小,避免為任務分配過多的對戰(zhàn)空間,從而
            減少應用程序代碼所需的RAM數(shù)量。uc/os-ii系統(tǒng)提供OSTaskStkChk()函數(shù)用以確定任務實際需要的堆??臻g。
            使用堆棧檢驗功能必須做一下幾點:
            1.在OS_CFG.H文件中設置OS_TASK_CREATE_EXT為 1
            2.使用OSTaskCreateExt()創(chuàng)建任務,并且賦予任務比實際需要多一點的空間。可以在任何任務中調(diào)用STaskStkChk()函數(shù),對任何用OSTaskCreateExt()建立的任務進行堆棧檢驗。
            3.在OSTaskCreateExt()中,將參數(shù)opt設置為:OS_TASK_OPT_STK_CHK + OS_TASK_OPT_STK_CLR
            4.把需要進行檢測的任務的優(yōu)先級作為OSTaskStkChk()的參數(shù)并調(diào)用
            應使自己的應用程序運行足夠長的時間,并且經(jīng)歷最壞的堆棧使用情況,這樣才能得到正確的樹木。一旦得到所需要的對單需求,就可以重新設置堆棧的最終大小了。在堆棧檢驗中,所得到的只是一個大智的堆棧使用情況,并不能說明堆棧的使用全部實際情況。
            4 堆棧溢出
            在實際的項目中,由于產(chǎn)品的升級需要可能一個任務會經(jīng)常修改,所需要的實際堆棧大小并不能很好的確定,即便使用堆棧檢驗功能后,在后續(xù)產(chǎn)品的升級過程中變量的增加會導致堆棧不夠用。而在調(diào)試的過程中,如果沒有堆棧溢出的報警機制,一旦堆棧出現(xiàn)溢出,這個問題是很難一時被發(fā)現(xiàn)的。在這里,我建議在系統(tǒng)開始運行前,把每個任務的堆棧棧頂初始化一個值,每次出現(xiàn)任務切換的時候就讀取對應棧頂?shù)闹?,如果和初始化棧頂值相同的話就說明沒有問題,如果值出現(xiàn)改變的話那么出現(xiàn)堆棧溢出的概率至少達到90%以上,這樣可以避免出現(xiàn)堆棧溢出而不能發(fā)現(xiàn)的尷尬。下面是個項目的一部分,刪了一些,可供參考。
            #include "user/lc_sqce_aj.h"
            #include "include_all.h"
            /* size of each tasks stacks (# of WORDs) */
            #define TASK_START_STK_SIZE 128
            #define BUZZER_STK_SIZE 128
            #define CTRLMSG_STK_SIZE 128
            #define STORDEV_MOUNT_STK_SIZE 512
            #define MODE_SWITCH_STK_SIZE 512
            #define MODE_EXE_STK_SIZE 2000
            #define TWO_CHANNEL_REC_SIZE 512
            #define ALARM_STK_SIZE 128
            #define TASK_STK_SIZE 512
            /* application tasks */
            #define TASK_START_ID 0
            #define TASK_1_ID 1
            #define TASK_2_ID 2
            #define TASK_3_ID 3
            #define TASK_4_ID 4
            #define TASK_5_ID 5
            #define TASK_6_ID 6
            #define TASK_7_ID 7
            #define TASK_8_ID 8
            #define TASK_9_ID 9
            #define TASK_10_ID 10
            #define TASK_11_ID 11
            #define TASK_12_ID 12
            #define TASK_13_ID 13
            #define TASK_14_ID 14
            #define TASK_15_ID 15
            /* application tasks priorities */
            #define TASK_START_PRIO 0
            #define TASK_1_PRIO 1
            #define TASK_2_PRIO 2
            #define TASK_3_PRIO 3
            #define TASK_4_PRIO 4
            #define TASK_5_PRIO 5
            #define TASK_6_PRIO 6
            #define TASK_7_PRIO 7
            #define TASK_8_PRIO 8
            #define TASK_9_PRIO 9
            #define TASK_10_PRIO 10
            #define TASK_11_PRIO 11
            #define TASK_12_PRIO 12
            #define TASK_13_PRIO 13
            #define TASK_14_PRIO 14
            #define TASK_15_PRIO 15
            /*see task stacks*/
            OS_STK TaskStartStk[TASK_START_STK_SIZE];
            OS_STK BuzzerStk[BUZZER_STK_SIZE];
            OS_STK CtrlmsgStk[CTRLMSG_STK_SIZE];
            OS_STK StorDevStk[STORDEV_MOUNT_STK_SIZE];
            OS_STK ModeSwitchStk[MODE_SWITCH_STK_SIZE];
            OS_STK ModeExeStk[MODE_EXE_STK_SIZE];
            static void TaskStart(void *p_arg); //函數(shù)聲明
            static void TaskStartCreateTasks(void);
            void InitStackMark(void);
            //************************************************************************************
            //* 函數(shù)名 :main
            //* 返回值 :N/A
            //* 參數(shù) :N/A
            //* 函數(shù)說明:主函數(shù)
            //* 作 者:啊呆
            //***********************************************************************************
            void main(void)
            {
            INT8U err;
            // initialize uC/OS-II
            OSInit();
            // install uC/OS-IIs context switch vector
            IRQSetVect(uCOS, OSCtxSw);
            OSTaskCreateExt(TaskStart,
            (void *)0,
            &TaskStartStk[TASK_START_STK_SIZE - 1],
            TASK_START_PRIO,
            TASK_START_ID,
            &TaskStartStk[0],
            TASK_START_STK_SIZE,
            (void *)0,
            OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
            OSTaskNameSet(TASK_START_PRIO, "Start Task", &err);
            // start multitasking
            OSStart();
            }
            上一頁 1 2 下一頁

            關(guān)鍵詞: UCOS操作系統(tǒng)堆

            評論


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

            關(guān)閉